diff --git a/jaas-client/README.md b/jaas-client/README.md
new file mode 100644
index 0000000..34a4a1d
--- /dev/null
+++ b/jaas-client/README.md
@@ -0,0 +1,69 @@
+This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
+
+## Available Scripts
+
+In the project directory, you can run:
+
+### `npm start`
+
+Runs the app in the development mode.<br />
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
+
+The page will reload if you make edits.<br />
+You will also see any lint errors in the console.
+
+### `npm test`
+
+Launches the test runner in the interactive watch mode.<br />
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
+
+### `npm run build`
+
+Builds the app for production to the `build` folder.<br />
+It correctly bundles React in production mode and optimizes the build for the best performance.
+
+The build is minified and the filenames include the hashes.<br />
+Your app is ready to be deployed!
+
+See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
+
+### `npm run eject`
+
+**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
+
+If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
+
+Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
+
+You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
+
+## Learn More
+
+You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
+
+To learn React, check out the [React documentation](https://reactjs.org/).
+
+### Code Splitting
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting
+
+### Analyzing the Bundle Size
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size
+
+### Making a Progressive Web App
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app
+
+### Advanced Configuration
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration
+
+### Deployment
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/deployment
+
+### `npm run build` fails to minify
+
+This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
+# jaas-client
diff --git a/jaas-client/dist/bundle.js b/jaas-client/dist/bundle.js
new file mode 100644
index 0000000..fbef4df
--- /dev/null
+++ b/jaas-client/dist/bundle.js
@@ -0,0 +1,4216 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(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] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = 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;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = "./jaas-client/src/index.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js ***!
+  \*********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _arrayLikeToArray; });\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _arrayWithHoles; });\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _arrayWithoutHoles; });\n/* harmony import */ var _arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\");\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js":
+/*!**************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js ***!
+  \**************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _assertThisInitialized; });\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _classCallCheck; });\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _createClass; });\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _defineProperty; });\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _extends; });\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js ***!
+  \******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _inheritsLoose; });\nfunction _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js ***!
+  \********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _iterableToArray; });\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js":
+/*!*************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js ***!
+  \*************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _iterableToArrayLimit; });\nfunction _iterableToArrayLimit(arr, i) {\n  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js ***!
+  \********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _nonIterableRest; });\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _nonIterableSpread; });\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js":
+/*!****************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js ***!
+  \****************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _objectWithoutProperties; });\n/* harmony import */ var _objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = Object(_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(source, excluded);\n  var key, i;\n\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js":
+/*!*********************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js ***!
+  \*********************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _objectWithoutPropertiesLoose; });\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js ***!
+  \******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _slicedToArray; });\n/* harmony import */ var _arrayWithHoles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithHoles */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js\");\n/* harmony import */ var _iterableToArrayLimit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArrayLimit */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js\");\n/* harmony import */ var _unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\");\n/* harmony import */ var _nonIterableRest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableRest */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js\");\n\n\n\n\nfunction _slicedToArray(arr, i) {\n  return Object(_arrayWithHoles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr) || Object(_iterableToArrayLimit__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(arr, i) || Object(_unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(arr, i) || Object(_nonIterableRest__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _toConsumableArray; });\n/* harmony import */ var _arrayWithoutHoles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithoutHoles */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js\");\n/* harmony import */ var _iterableToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/iterableToArray.js\");\n/* harmony import */ var _unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./unsupportedIterableToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js\");\n/* harmony import */ var _nonIterableSpread__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./nonIterableSpread */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js\");\n\n\n\n\nfunction _toConsumableArray(arr) {\n  return Object(_arrayWithoutHoles__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(arr) || Object(_iterableToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(arr) || Object(_unsupportedIterableToArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(arr) || Object(_nonIterableSpread__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js ***!
+  \***********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _typeof; });\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js":
+/*!*******************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js ***!
+  \*******************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _unsupportedIterableToArray; });\n/* harmony import */ var _arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(o, minLen);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/extends.js":
+/*!********************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/extends.js ***!
+  \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("function _extends() {\n  module.exports = _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/extends.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js ***!
+  \**********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js ***!
+  \*************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _internal_svg_icons_Person__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../internal/svg-icons/Person */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative',\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      flexShrink: 0,\n      width: 40,\n      height: 40,\n      fontFamily: theme.typography.fontFamily,\n      fontSize: theme.typography.pxToRem(20),\n      lineHeight: 1,\n      borderRadius: '50%',\n      overflow: 'hidden',\n      userSelect: 'none'\n    },\n\n    /* Styles applied to the root element if not `src` or `srcSet`. */\n    colorDefault: {\n      color: theme.palette.background.default,\n      backgroundColor: theme.palette.type === 'light' ? theme.palette.grey[400] : theme.palette.grey[600]\n    },\n\n    /* Styles applied to the root element if `variant=\"circle\"`. */\n    circle: {},\n\n    /* Styles applied to the root element if `variant=\"rounded\"`. */\n    rounded: {\n      borderRadius: theme.shape.borderRadius\n    },\n\n    /* Styles applied to the root element if `variant=\"square\"`. */\n    square: {\n      borderRadius: 0\n    },\n\n    /* Styles applied to the img element if either `src` or `srcSet` is defined. */\n    img: {\n      width: '100%',\n      height: '100%',\n      textAlign: 'center',\n      // Handle non-square image. The property isn't supported by IE 11.\n      objectFit: 'cover',\n      // Hide alt text.\n      color: 'transparent',\n      // Hide the image broken icon, only works on Chrome.\n      textIndent: 10000\n    },\n\n    /* Styles applied to the fallback icon */\n    fallback: {\n      width: '75%',\n      height: '75%'\n    }\n  };\n};\n\nfunction useLoaded(_ref) {\n  var src = _ref.src,\n      srcSet = _ref.srcSet;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      loaded = _React$useState[0],\n      setLoaded = _React$useState[1];\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (!src && !srcSet) {\n      return undefined;\n    }\n\n    setLoaded(false);\n    var active = true;\n    var image = new Image();\n    image.src = src;\n    image.srcSet = srcSet;\n\n    image.onload = function () {\n      if (!active) {\n        return;\n      }\n\n      setLoaded('loaded');\n    };\n\n    image.onerror = function () {\n      if (!active) {\n        return;\n      }\n\n      setLoaded('error');\n    };\n\n    return function () {\n      active = false;\n    };\n  }, [src, srcSet]);\n  return loaded;\n}\n\nvar Avatar = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Avatar(props, ref) {\n  var alt = props.alt,\n      childrenProp = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      imgProps = props.imgProps,\n      sizes = props.sizes,\n      src = props.src,\n      srcSet = props.srcSet,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'circle' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"alt\", \"children\", \"classes\", \"className\", \"component\", \"imgProps\", \"sizes\", \"src\", \"srcSet\", \"variant\"]);\n\n  var children = null; // Use a hook instead of onError on the img element to support server-side rendering.\n\n  var loaded = useLoaded({\n    src: src,\n    srcSet: srcSet\n  });\n  var hasImg = src || srcSet;\n  var hasImgNotFailing = hasImg && loaded !== 'error';\n\n  if (hasImgNotFailing) {\n    children = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"img\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      alt: alt,\n      src: src,\n      srcSet: srcSet,\n      sizes: sizes,\n      className: classes.img\n    }, imgProps));\n  } else if (childrenProp != null) {\n    children = childrenProp;\n  } else if (hasImg && alt) {\n    children = alt[0];\n  } else {\n    children = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_Person__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n      className: classes.fallback\n    });\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes.system, classes[variant], className, !hasImgNotFailing && classes.colorDefault),\n    ref: ref\n  }, other), children);\n});\n true ? Avatar.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * Used in combination with `src` or `srcSet` to\n   * provide an alt attribute for the rendered `img` element.\n   */\n  alt: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Used to render icon or text elements inside the Avatar if `src` is not set.\n   * This can be an element, or just a string.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * Attributes applied to the `img` element if the component is used to display an image.\n   * It can be used to listen for the loading error event.\n   */\n  imgProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The `sizes` attribute for the `img` element.\n   */\n  sizes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The `src` attribute for the `img` element.\n   */\n  src: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The `srcSet` attribute for the `img` element.\n   * Use this attribute for responsive image display.\n   */\n  srcSet: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The shape of the avatar.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['circle', 'rounded', 'square'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiAvatar'\n})(Avatar));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Avatar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Avatar */ \"./jaas-client/node_modules/@material-ui/core/esm/Avatar/Avatar.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Avatar__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js ***!
+  \*****************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Fade__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Fade */ \"./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js\");\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    // Improve scrollable dialog support.\n    zIndex: -1,\n    position: 'fixed',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    right: 0,\n    bottom: 0,\n    top: 0,\n    left: 0,\n    backgroundColor: 'rgba(0, 0, 0, 0.5)',\n    WebkitTapHighlightColor: 'transparent'\n  },\n\n  /* Styles applied to the root element if `invisible={true}`. */\n  invisible: {\n    backgroundColor: 'transparent'\n  }\n};\nvar Backdrop = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Backdrop(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$invisible = props.invisible,\n      invisible = _props$invisible === void 0 ? false : _props$invisible,\n      open = props.open,\n      transitionDuration = props.transitionDuration,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? _Fade__WEBPACK_IMPORTED_MODULE_6__[\"default\"] : _props$TransitionComp,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"invisible\", \"open\", \"transitionDuration\", \"TransitionComponent\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    in: open,\n    timeout: transitionDuration\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, invisible && classes.invisible),\n    \"aria-hidden\": true,\n    ref: ref\n  }, children));\n});\n true ? Backdrop.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the backdrop is invisible.\n   * It can be used when rendering a popover or a custom select component.\n   */\n  invisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the backdrop is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number\n  })])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiBackdrop'\n})(Backdrop));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js":
+/*!**************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js ***!
+  \**************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Backdrop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Backdrop */ \"./jaas-client/node_modules/@material-ui/core/esm/Backdrop/Backdrop.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Backdrop__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js":
+/*!*******************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js ***!
+  \*******************************************************************/
+/*! exports provided: styleFunction, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styleFunction\", function() { return styleFunction; });\n/* harmony import */ var _material_ui_system__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/system */ \"./jaas-client/node_modules/@material-ui/system/esm/index.js\");\n/* harmony import */ var _styles_styled__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles/styled */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js\");\n\n\nvar styleFunction = Object(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"css\"])(Object(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"compose\"])(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"borders\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"display\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"flexbox\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"grid\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"positions\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"palette\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"shadows\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"sizing\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"spacing\"], _material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"typography\"]));\n/**\n * @ignore - do not document.\n */\n\nvar Box = Object(_styles_styled__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('div')(styleFunction, {\n  name: 'MuiBox'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Box);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Box/index.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Box/index.js ***!
+  \*********************************************************************/
+/*! exports provided: default, styleFunction */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Box__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Box */ \"./jaas-client/node_modules/@material-ui/core/esm/Box/Box.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Box__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"styleFunction\", function() { return _Box__WEBPACK_IMPORTED_MODULE_0__[\"styleFunction\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Box/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js ***!
+  \*************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, theme.typography.button, {\n      boxSizing: 'border-box',\n      minWidth: 64,\n      padding: '6px 16px',\n      borderRadius: theme.shape.borderRadius,\n      color: theme.palette.text.primary,\n      transition: theme.transitions.create(['background-color', 'box-shadow', 'border'], {\n        duration: theme.transitions.duration.short\n      }),\n      '&:hover': {\n        textDecoration: 'none',\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.text.primary, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        },\n        '&$disabled': {\n          backgroundColor: 'transparent'\n        }\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    }),\n\n    /* Styles applied to the span element that wraps the children. */\n    label: {\n      width: '100%',\n      // Ensure the correct width for iOS Safari\n      display: 'inherit',\n      alignItems: 'inherit',\n      justifyContent: 'inherit'\n    },\n\n    /* Styles applied to the root element if `variant=\"text\"`. */\n    text: {\n      padding: '6px 8px'\n    },\n\n    /* Styles applied to the root element if `variant=\"text\"` and `color=\"primary\"`. */\n    textPrimary: {\n      color: theme.palette.primary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"text\"` and `color=\"secondary\"`. */\n    textSecondary: {\n      color: theme.palette.secondary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"`. */\n    outlined: {\n      padding: '5px 15px',\n      border: \"1px solid \".concat(theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)'),\n      '&$disabled': {\n        border: \"1px solid \".concat(theme.palette.action.disabledBackground)\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"primary\"`. */\n    outlinedPrimary: {\n      color: theme.palette.primary.main,\n      border: \"1px solid \".concat(Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.primary.main, 0.5)),\n      '&:hover': {\n        border: \"1px solid \".concat(theme.palette.primary.main),\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"secondary\"`. */\n    outlinedSecondary: {\n      color: theme.palette.secondary.main,\n      border: \"1px solid \".concat(Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.secondary.main, 0.5)),\n      '&:hover': {\n        border: \"1px solid \".concat(theme.palette.secondary.main),\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_6__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      },\n      '&$disabled': {\n        border: \"1px solid \".concat(theme.palette.action.disabled)\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"contained\"`. */\n    contained: {\n      color: theme.palette.getContrastText(theme.palette.grey[300]),\n      backgroundColor: theme.palette.grey[300],\n      boxShadow: theme.shadows[2],\n      '&:hover': {\n        backgroundColor: theme.palette.grey.A100,\n        boxShadow: theme.shadows[4],\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          boxShadow: theme.shadows[2],\n          backgroundColor: theme.palette.grey[300]\n        },\n        '&$disabled': {\n          backgroundColor: theme.palette.action.disabledBackground\n        }\n      },\n      '&$focusVisible': {\n        boxShadow: theme.shadows[6]\n      },\n      '&:active': {\n        boxShadow: theme.shadows[8]\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled,\n        boxShadow: theme.shadows[0],\n        backgroundColor: theme.palette.action.disabledBackground\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"contained\"` and `color=\"primary\"`. */\n    containedPrimary: {\n      color: theme.palette.primary.contrastText,\n      backgroundColor: theme.palette.primary.main,\n      '&:hover': {\n        backgroundColor: theme.palette.primary.dark,\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: theme.palette.primary.main\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"contained\"` and `color=\"secondary\"`. */\n    containedSecondary: {\n      color: theme.palette.secondary.contrastText,\n      backgroundColor: theme.palette.secondary.main,\n      '&:hover': {\n        backgroundColor: theme.palette.secondary.dark,\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: theme.palette.secondary.main\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `disableElevation={true}`. */\n    disableElevation: {\n      boxShadow: 'none',\n      '&:hover': {\n        boxShadow: 'none'\n      },\n      '&$focusVisible': {\n        boxShadow: 'none'\n      },\n      '&:active': {\n        boxShadow: 'none'\n      },\n      '&$disabled': {\n        boxShadow: 'none'\n      }\n    },\n\n    /* Pseudo-class applied to the ButtonBase root element if the button is keyboard focused. */\n    focusVisible: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `color=\"inherit\"`. */\n    colorInherit: {\n      color: 'inherit',\n      borderColor: 'currentColor'\n    },\n\n    /* Styles applied to the root element if `size=\"small\"` and `variant=\"text\"`. */\n    textSizeSmall: {\n      padding: '4px 5px',\n      fontSize: theme.typography.pxToRem(13)\n    },\n\n    /* Styles applied to the root element if `size=\"large\"` and `variant=\"text\"`. */\n    textSizeLarge: {\n      padding: '8px 11px',\n      fontSize: theme.typography.pxToRem(15)\n    },\n\n    /* Styles applied to the root element if `size=\"small\"` and `variant=\"outlined\"`. */\n    outlinedSizeSmall: {\n      padding: '3px 9px',\n      fontSize: theme.typography.pxToRem(13)\n    },\n\n    /* Styles applied to the root element if `size=\"large\"` and `variant=\"outlined\"`. */\n    outlinedSizeLarge: {\n      padding: '7px 21px',\n      fontSize: theme.typography.pxToRem(15)\n    },\n\n    /* Styles applied to the root element if `size=\"small\"` and `variant=\"contained\"`. */\n    containedSizeSmall: {\n      padding: '4px 10px',\n      fontSize: theme.typography.pxToRem(13)\n    },\n\n    /* Styles applied to the root element if `size=\"large\"` and `variant=\"contained\"`. */\n    containedSizeLarge: {\n      padding: '8px 22px',\n      fontSize: theme.typography.pxToRem(15)\n    },\n\n    /* Styles applied to the root element if `size=\"small\"`. */\n    sizeSmall: {},\n\n    /* Styles applied to the root element if `size=\"large\"`. */\n    sizeLarge: {},\n\n    /* Styles applied to the root element if `fullWidth={true}`. */\n    fullWidth: {\n      width: '100%'\n    },\n\n    /* Styles applied to the startIcon element if supplied. */\n    startIcon: {\n      display: 'inherit',\n      marginRight: 8,\n      marginLeft: -4,\n      '&$iconSizeSmall': {\n        marginLeft: -2\n      }\n    },\n\n    /* Styles applied to the endIcon element if supplied. */\n    endIcon: {\n      display: 'inherit',\n      marginRight: -4,\n      marginLeft: 8,\n      '&$iconSizeSmall': {\n        marginRight: -2\n      }\n    },\n\n    /* Styles applied to the icon element if supplied and `size=\"small\"`. */\n    iconSizeSmall: {\n      '& > *:first-child': {\n        fontSize: 18\n      }\n    },\n\n    /* Styles applied to the icon element if supplied and `size=\"medium\"`. */\n    iconSizeMedium: {\n      '& > *:first-child': {\n        fontSize: 20\n      }\n    },\n\n    /* Styles applied to the icon element if supplied and `size=\"large\"`. */\n    iconSizeLarge: {\n      '& > *:first-child': {\n        fontSize: 22\n      }\n    }\n  };\n};\nvar Button = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Button(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'default' : _props$color,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'button' : _props$component,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableElevati = props.disableElevation,\n      disableElevation = _props$disableElevati === void 0 ? false : _props$disableElevati,\n      _props$disableFocusRi = props.disableFocusRipple,\n      disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi,\n      endIconProp = props.endIcon,\n      focusVisibleClassName = props.focusVisibleClassName,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 'medium' : _props$size,\n      startIconProp = props.startIcon,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'button' : _props$type,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'text' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"disableElevation\", \"disableFocusRipple\", \"endIcon\", \"focusVisibleClassName\", \"fullWidth\", \"size\", \"startIcon\", \"type\", \"variant\"]);\n\n  var startIcon = startIconProp && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.startIcon, classes[\"iconSize\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))])\n  }, startIconProp);\n  var endIcon = endIconProp && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.endIcon, classes[\"iconSize\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))])\n  }, endIconProp);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_ButtonBase__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[variant], className, color === 'inherit' ? classes.colorInherit : color !== 'default' && classes[\"\".concat(variant).concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(color))], size !== 'medium' && [classes[\"\".concat(variant, \"Size\").concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))], classes[\"size\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(size))]], disableElevation && classes.disableElevation, disabled && classes.disabled, fullWidth && classes.fullWidth),\n    component: component,\n    disabled: disabled,\n    focusRipple: !disableFocusRipple,\n    focusVisibleClassName: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.focusVisible, focusVisibleClassName),\n    ref: ref,\n    type: type\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: classes.label\n  }, startIcon, children, endIcon));\n});\n true ? Button.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the button.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'inherit', 'primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the button will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, no elevation is used.\n   */\n  disableElevation: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the  keyboard focus ripple will be disabled.\n   */\n  disableFocusRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   *\n   * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure\n   * to highlight the element by applying separate styles with the `focusVisibleClassName`.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Element placed after the children.\n   */\n  endIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * @ignore\n   */\n  focusVisibleClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the button will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The URL to link to when the button is clicked.\n   * If defined, an `a` element will be used as the root node.\n   */\n  href: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The size of the button.\n   * `small` is equivalent to the dense button styling.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['large', 'medium', 'small']),\n\n  /**\n   * Element placed before the children.\n   */\n  startIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * @ignore\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['button', 'reset', 'submit']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['contained', 'outlined', 'text'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiButton'\n})(Button));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Button/index.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Button/index.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Button__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Button */ \"./jaas-client/node_modules/@material-ui/core/esm/Button/Button.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Button__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Button/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js ***!
+  \*********************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useIsFocusVisible */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js\");\n/* harmony import */ var _TouchRipple__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./TouchRipple */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    display: 'inline-flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    position: 'relative',\n    WebkitTapHighlightColor: 'transparent',\n    backgroundColor: 'transparent',\n    // Reset default value\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0,\n    border: 0,\n    margin: 0,\n    // Remove the margin in Safari\n    borderRadius: 0,\n    padding: 0,\n    // Remove the padding in Firefox\n    cursor: 'pointer',\n    userSelect: 'none',\n    verticalAlign: 'middle',\n    '-moz-appearance': 'none',\n    // Reset\n    '-webkit-appearance': 'none',\n    // Reset\n    textDecoration: 'none',\n    // So we take precedent over the style of a native <a /> element.\n    color: 'inherit',\n    '&::-moz-focus-inner': {\n      borderStyle: 'none' // Remove Firefox dotted outline.\n\n    },\n    '&$disabled': {\n      pointerEvents: 'none',\n      // Disable link interactions\n      cursor: 'default'\n    },\n    '@media print': {\n      colorAdjust: 'exact'\n    }\n  },\n\n  /* Pseudo-class applied to the root element if `disabled={true}`. */\n  disabled: {},\n\n  /* Pseudo-class applied to the root element if keyboard focused. */\n  focusVisible: {}\n};\n/**\n * `ButtonBase` contains as few styles as possible.\n * It aims to be a simple building block for creating a button.\n * It contains a load of style reset and some focus/ripple logic.\n */\n\nvar ButtonBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function ButtonBase(props, ref) {\n  var action = props.action,\n      buttonRefProp = props.buttonRef,\n      _props$centerRipple = props.centerRipple,\n      centerRipple = _props$centerRipple === void 0 ? false : _props$centerRipple,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'button' : _props$component,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableRipple = props.disableRipple,\n      disableRipple = _props$disableRipple === void 0 ? false : _props$disableRipple,\n      _props$disableTouchRi = props.disableTouchRipple,\n      disableTouchRipple = _props$disableTouchRi === void 0 ? false : _props$disableTouchRi,\n      _props$focusRipple = props.focusRipple,\n      focusRipple = _props$focusRipple === void 0 ? false : _props$focusRipple,\n      focusVisibleClassName = props.focusVisibleClassName,\n      onBlur = props.onBlur,\n      onClick = props.onClick,\n      onFocus = props.onFocus,\n      onFocusVisible = props.onFocusVisible,\n      onKeyDown = props.onKeyDown,\n      onKeyUp = props.onKeyUp,\n      onMouseDown = props.onMouseDown,\n      onMouseLeave = props.onMouseLeave,\n      onMouseUp = props.onMouseUp,\n      onTouchEnd = props.onTouchEnd,\n      onTouchMove = props.onTouchMove,\n      onTouchStart = props.onTouchStart,\n      onDragLeave = props.onDragLeave,\n      _props$tabIndex = props.tabIndex,\n      tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,\n      TouchRippleProps = props.TouchRippleProps,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'button' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"action\", \"buttonRef\", \"centerRipple\", \"children\", \"classes\", \"className\", \"component\", \"disabled\", \"disableRipple\", \"disableTouchRipple\", \"focusRipple\", \"focusVisibleClassName\", \"onBlur\", \"onClick\", \"onFocus\", \"onFocusVisible\", \"onKeyDown\", \"onKeyUp\", \"onMouseDown\", \"onMouseLeave\", \"onMouseUp\", \"onTouchEnd\", \"onTouchMove\", \"onTouchStart\", \"onDragLeave\", \"tabIndex\", \"TouchRippleProps\", \"type\"]);\n\n  var buttonRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n\n  function getButtonNode() {\n    // #StrictMode ready\n    return react_dom__WEBPACK_IMPORTED_MODULE_4__[\"findDOMNode\"](buttonRef.current);\n  }\n\n  var rippleRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      focusVisible = _React$useState[0],\n      setFocusVisible = _React$useState[1];\n\n  if (disabled && focusVisible) {\n    setFocusVisible(false);\n  }\n\n  var _useIsFocusVisible = Object(_utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(),\n      isFocusVisible = _useIsFocusVisible.isFocusVisible,\n      onBlurVisible = _useIsFocusVisible.onBlurVisible,\n      focusVisibleRef = _useIsFocusVisible.ref;\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useImperativeHandle\"](action, function () {\n    return {\n      focusVisible: function focusVisible() {\n        setFocusVisible(true);\n        buttonRef.current.focus();\n      }\n    };\n  }, []);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (focusVisible && focusRipple && !disableRipple) {\n      rippleRef.current.pulsate();\n    }\n  }, [disableRipple, focusRipple, focusVisible]);\n\n  function useRippleHandler(rippleAction, eventCallback) {\n    var skipRippleAction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : disableTouchRipple;\n    return Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n      if (eventCallback) {\n        eventCallback(event);\n      }\n\n      var ignore = skipRippleAction;\n\n      if (!ignore && rippleRef.current) {\n        rippleRef.current[rippleAction](event);\n      }\n\n      return true;\n    });\n  }\n\n  var handleMouseDown = useRippleHandler('start', onMouseDown);\n  var handleDragLeave = useRippleHandler('stop', onDragLeave);\n  var handleMouseUp = useRippleHandler('stop', onMouseUp);\n  var handleMouseLeave = useRippleHandler('stop', function (event) {\n    if (focusVisible) {\n      event.preventDefault();\n    }\n\n    if (onMouseLeave) {\n      onMouseLeave(event);\n    }\n  });\n  var handleTouchStart = useRippleHandler('start', onTouchStart);\n  var handleTouchEnd = useRippleHandler('stop', onTouchEnd);\n  var handleTouchMove = useRippleHandler('stop', onTouchMove);\n  var handleBlur = useRippleHandler('stop', function (event) {\n    if (focusVisible) {\n      onBlurVisible(event);\n      setFocusVisible(false);\n    }\n\n    if (onBlur) {\n      onBlur(event);\n    }\n  }, false);\n  var handleFocus = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n    // Fix for https://github.com/facebook/react/issues/7769\n    if (!buttonRef.current) {\n      buttonRef.current = event.currentTarget;\n    }\n\n    if (isFocusVisible(event)) {\n      setFocusVisible(true);\n\n      if (onFocusVisible) {\n        onFocusVisible(event);\n      }\n    }\n\n    if (onFocus) {\n      onFocus(event);\n    }\n  });\n\n  var isNonNativeButton = function isNonNativeButton() {\n    var button = getButtonNode();\n    return component && component !== 'button' && !(button.tagName === 'A' && button.href);\n  };\n  /**\n   * IE 11 shim for https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat\n   */\n\n\n  var keydownRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](false);\n  var handleKeyDown = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n    // Check if key is already down to avoid repeats being counted as multiple activations\n    if (focusRipple && !keydownRef.current && focusVisible && rippleRef.current && event.key === ' ') {\n      keydownRef.current = true;\n      event.persist();\n      rippleRef.current.stop(event, function () {\n        rippleRef.current.start(event);\n      });\n    }\n\n    if (event.target === event.currentTarget && isNonNativeButton() && event.key === ' ') {\n      event.preventDefault();\n    }\n\n    if (onKeyDown) {\n      onKeyDown(event);\n    } // Keyboard accessibility for non interactive elements\n\n\n    if (event.target === event.currentTarget && isNonNativeButton() && event.key === 'Enter' && !disabled) {\n      event.preventDefault();\n\n      if (onClick) {\n        onClick(event);\n      }\n    }\n  });\n  var handleKeyUp = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(function (event) {\n    // calling preventDefault in keyUp on a <button> will not dispatch a click event if Space is pressed\n    // https://codesandbox.io/s/button-keyup-preventdefault-dn7f0\n    if (focusRipple && event.key === ' ' && rippleRef.current && focusVisible && !event.defaultPrevented) {\n      keydownRef.current = false;\n      event.persist();\n      rippleRef.current.stop(event, function () {\n        rippleRef.current.pulsate(event);\n      });\n    }\n\n    if (onKeyUp) {\n      onKeyUp(event);\n    } // Keyboard accessibility for non interactive elements\n\n\n    if (onClick && event.target === event.currentTarget && isNonNativeButton() && event.key === ' ' && !event.defaultPrevented) {\n      onClick(event);\n    }\n  });\n  var ComponentProp = component;\n\n  if (ComponentProp === 'button' && other.href) {\n    ComponentProp = 'a';\n  }\n\n  var buttonProps = {};\n\n  if (ComponentProp === 'button') {\n    buttonProps.type = type;\n    buttonProps.disabled = disabled;\n  } else {\n    if (ComponentProp !== 'a' || !other.href) {\n      buttonProps.role = 'button';\n    }\n\n    buttonProps['aria-disabled'] = disabled;\n  }\n\n  var handleUserRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(buttonRefProp, ref);\n  var handleOwnRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(focusVisibleRef, buttonRef);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(handleUserRef, handleOwnRef);\n\n  var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      mountedState = _React$useState2[0],\n      setMountedState = _React$useState2[1];\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    setMountedState(true);\n  }, []);\n  var enableTouchRipple = mountedState && !disableRipple && !disabled;\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n      if (enableTouchRipple && !rippleRef.current) {\n        console.error(['Material-UI: The `component` prop provided to ButtonBase is invalid.', 'Please make sure the children prop is rendered in this custom component.'].join('\\n'));\n      }\n    }, [enableTouchRipple]);\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](ComponentProp, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, focusVisible && [classes.focusVisible, focusVisibleClassName], disabled && classes.disabled),\n    onBlur: handleBlur,\n    onClick: onClick,\n    onFocus: handleFocus,\n    onKeyDown: handleKeyDown,\n    onKeyUp: handleKeyUp,\n    onMouseDown: handleMouseDown,\n    onMouseLeave: handleMouseLeave,\n    onMouseUp: handleMouseUp,\n    onDragLeave: handleDragLeave,\n    onTouchEnd: handleTouchEnd,\n    onTouchMove: handleTouchMove,\n    onTouchStart: handleTouchStart,\n    ref: handleRef,\n    tabIndex: disabled ? -1 : tabIndex\n  }, buttonProps, other), children, enableTouchRipple ?\n  /*#__PURE__*/\n\n  /* TouchRipple is only needed client-side, x2 boost on the server. */\n  react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_TouchRipple__WEBPACK_IMPORTED_MODULE_11__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    ref: rippleRef,\n    center: centerRipple\n  }, TouchRippleProps)) : null);\n});\n true ? ButtonBase.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A ref for imperative actions.\n   * It currently only supports `focusVisible()` action.\n   */\n  action: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"refType\"],\n\n  /**\n   * @ignore\n   *\n   * Use that prop to pass a ref to the native button component.\n   * @deprecated Use `ref` instead.\n   */\n  buttonRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"refType\"],\n\n  /**\n   * If `true`, the ripples will be centered.\n   * They won't start at the cursor interaction position.\n   */\n  centerRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"elementTypeAcceptingRef\"],\n\n  /**\n   * If `true`, the base button will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   *\n   * ⚠️ Without a ripple there is no styling for :focus-visible by default. Be sure\n   * to highlight the element by applying separate styles with the `focusVisibleClassName`.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the touch ripple effect will be disabled.\n   */\n  disableTouchRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the base button will have a keyboard focus ripple.\n   */\n  focusRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * This prop can help a person know which element has the keyboard focus.\n   * The class name will be applied when the element gain the focus through a keyboard interaction.\n   * It's a polyfill for the [CSS :focus-visible selector](https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo).\n   * The rationale for using this feature [is explained here](https://github.com/WICG/focus-visible/blob/master/explainer.md).\n   * A [polyfill can be used](https://github.com/WICG/focus-visible) to apply a `focus-visible` class to other components\n   * if needed.\n   */\n  focusVisibleClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  href: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onDragLeave: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component is focused with a keyboard.\n   * We trigger a `onFocus` callback too.\n   */\n  onFocusVisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyUp: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onMouseUp: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onTouchEnd: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onTouchMove: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onTouchStart: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Props applied to the `TouchRipple` element.\n   */\n  TouchRippleProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['button', 'reset', 'submit']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(styles, {\n  name: 'MuiButtonBase'\n})(ButtonBase));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js ***!
+  \*****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js\");\n\n\n\n\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_0__[\"useLayoutEffect\"];\n/**\n * @ignore - internal component.\n */\n\nfunction Ripple(props) {\n  var classes = props.classes,\n      _props$pulsate = props.pulsate,\n      pulsate = _props$pulsate === void 0 ? false : _props$pulsate,\n      rippleX = props.rippleX,\n      rippleY = props.rippleY,\n      rippleSize = props.rippleSize,\n      inProp = props.in,\n      _props$onExited = props.onExited,\n      onExited = _props$onExited === void 0 ? function () {} : _props$onExited,\n      timeout = props.timeout;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"](false),\n      leaving = _React$useState[0],\n      setLeaving = _React$useState[1];\n\n  var rippleClassName = Object(clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(classes.ripple, classes.rippleVisible, pulsate && classes.ripplePulsate);\n  var rippleStyles = {\n    width: rippleSize,\n    height: rippleSize,\n    top: -(rippleSize / 2) + rippleY,\n    left: -(rippleSize / 2) + rippleX\n  };\n  var childClassName = Object(clsx__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(classes.child, leaving && classes.childLeaving, pulsate && classes.childPulsate);\n  var handleExited = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(onExited); // Ripple is used for user feedback (e.g. click or press) so we want to apply styles with the highest priority\n\n  useEnhancedEffect(function () {\n    if (!inProp) {\n      // react-transition-group#onExit\n      setLeaving(true); // react-transition-group#onExited\n\n      var timeoutId = setTimeout(handleExited, timeout);\n      return function () {\n        clearTimeout(timeoutId);\n      };\n    }\n\n    return undefined;\n  }, [handleExited, inProp, timeout]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n    className: rippleClassName,\n    style: rippleStyles\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n    className: childClassName\n  }));\n}\n\n true ? Ripple.propTypes = {\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n\n  /**\n   * @ignore - injected from TransitionGroup\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n  /**\n   * @ignore - injected from TransitionGroup\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n\n  /**\n   * If `true`, the ripple pulsates, typically indicating the keyboard focus state of an element.\n   */\n  pulsate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n\n  /**\n   * Diameter of the ripple.\n   */\n  rippleSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n  /**\n   * Horizontal position of the ripple center.\n   */\n  rippleX: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n  /**\n   * Vertical position of the ripple center.\n   */\n  rippleY: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n\n  /**\n   * exit delay\n   */\n  timeout: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Ripple);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js ***!
+  \**********************************************************************************/
+/*! exports provided: DELAY_RIPPLE, styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DELAY_RIPPLE\", function() { return DELAY_RIPPLE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-transition-group */ \"./jaas-client/node_modules/react-transition-group/esm/index.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Ripple__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Ripple */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/Ripple.js\");\n\n\n\n\n\n\n\n\n\nvar DURATION = 550;\nvar DELAY_RIPPLE = 80;\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      overflow: 'hidden',\n      pointerEvents: 'none',\n      position: 'absolute',\n      zIndex: 0,\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      borderRadius: 'inherit'\n    },\n\n    /* Styles applied to the internal `Ripple` components `ripple` class. */\n    ripple: {\n      opacity: 0,\n      position: 'absolute'\n    },\n\n    /* Styles applied to the internal `Ripple` components `rippleVisible` class. */\n    rippleVisible: {\n      opacity: 0.3,\n      transform: 'scale(1)',\n      animation: \"$enter \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut)\n    },\n\n    /* Styles applied to the internal `Ripple` components `ripplePulsate` class. */\n    ripplePulsate: {\n      animationDuration: \"\".concat(theme.transitions.duration.shorter, \"ms\")\n    },\n\n    /* Styles applied to the internal `Ripple` components `child` class. */\n    child: {\n      opacity: 1,\n      display: 'block',\n      width: '100%',\n      height: '100%',\n      borderRadius: '50%',\n      backgroundColor: 'currentColor'\n    },\n\n    /* Styles applied to the internal `Ripple` components `childLeaving` class. */\n    childLeaving: {\n      opacity: 0,\n      animation: \"$exit \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut)\n    },\n\n    /* Styles applied to the internal `Ripple` components `childPulsate` class. */\n    childPulsate: {\n      position: 'absolute',\n      left: 0,\n      top: 0,\n      animation: \"$pulsate 2500ms \".concat(theme.transitions.easing.easeInOut, \" 200ms infinite\")\n    },\n    '@keyframes enter': {\n      '0%': {\n        transform: 'scale(0)',\n        opacity: 0.1\n      },\n      '100%': {\n        transform: 'scale(1)',\n        opacity: 0.3\n      }\n    },\n    '@keyframes exit': {\n      '0%': {\n        opacity: 1\n      },\n      '100%': {\n        opacity: 0\n      }\n    },\n    '@keyframes pulsate': {\n      '0%': {\n        transform: 'scale(1)'\n      },\n      '50%': {\n        transform: 'scale(0.92)'\n      },\n      '100%': {\n        transform: 'scale(1)'\n      }\n    }\n  };\n};\n/**\n * @ignore - internal component.\n *\n * TODO v5: Make private\n */\n\nvar TouchRipple = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function TouchRipple(props, ref) {\n  var _props$center = props.center,\n      centerProp = _props$center === void 0 ? false : _props$center,\n      classes = props.classes,\n      className = props.className,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"center\", \"classes\", \"className\"]);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_3__[\"useState\"]([]),\n      ripples = _React$useState[0],\n      setRipples = _React$useState[1];\n\n  var nextKey = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](0);\n  var rippleCallback = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    if (rippleCallback.current) {\n      rippleCallback.current();\n      rippleCallback.current = null;\n    }\n  }, [ripples]); // Used to filter out mouse emulated events on mobile.\n\n  var ignoringMouseDown = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](false); // We use a timer in order to only show the ripples for touch \"click\" like events.\n  // We don't want to display the ripple for touch scroll events.\n\n  var startTimer = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null); // This is the hook called once the previous timeout is ready.\n\n  var startTimerCommit = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  var container = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    return function () {\n      clearTimeout(startTimer.current);\n    };\n  }, []);\n  var startCommit = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (params) {\n    var pulsate = params.pulsate,\n        rippleX = params.rippleX,\n        rippleY = params.rippleY,\n        rippleSize = params.rippleSize,\n        cb = params.cb;\n    setRipples(function (oldRipples) {\n      return [].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(oldRipples), [/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_Ripple__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n        key: nextKey.current,\n        classes: classes,\n        timeout: DURATION,\n        pulsate: pulsate,\n        rippleX: rippleX,\n        rippleY: rippleY,\n        rippleSize: rippleSize\n      })]);\n    });\n    nextKey.current += 1;\n    rippleCallback.current = cb;\n  }, [classes]);\n  var start = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function () {\n    var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var cb = arguments.length > 2 ? arguments[2] : undefined;\n    var _options$pulsate = options.pulsate,\n        pulsate = _options$pulsate === void 0 ? false : _options$pulsate,\n        _options$center = options.center,\n        center = _options$center === void 0 ? centerProp || options.pulsate : _options$center,\n        _options$fakeElement = options.fakeElement,\n        fakeElement = _options$fakeElement === void 0 ? false : _options$fakeElement;\n\n    if (event.type === 'mousedown' && ignoringMouseDown.current) {\n      ignoringMouseDown.current = false;\n      return;\n    }\n\n    if (event.type === 'touchstart') {\n      ignoringMouseDown.current = true;\n    }\n\n    var element = fakeElement ? null : container.current;\n    var rect = element ? element.getBoundingClientRect() : {\n      width: 0,\n      height: 0,\n      left: 0,\n      top: 0\n    }; // Get the size of the ripple\n\n    var rippleX;\n    var rippleY;\n    var rippleSize;\n\n    if (center || event.clientX === 0 && event.clientY === 0 || !event.clientX && !event.touches) {\n      rippleX = Math.round(rect.width / 2);\n      rippleY = Math.round(rect.height / 2);\n    } else {\n      var _ref = event.touches ? event.touches[0] : event,\n          clientX = _ref.clientX,\n          clientY = _ref.clientY;\n\n      rippleX = Math.round(clientX - rect.left);\n      rippleY = Math.round(clientY - rect.top);\n    }\n\n    if (center) {\n      rippleSize = Math.sqrt((2 * Math.pow(rect.width, 2) + Math.pow(rect.height, 2)) / 3); // For some reason the animation is broken on Mobile Chrome if the size if even.\n\n      if (rippleSize % 2 === 0) {\n        rippleSize += 1;\n      }\n    } else {\n      var sizeX = Math.max(Math.abs((element ? element.clientWidth : 0) - rippleX), rippleX) * 2 + 2;\n      var sizeY = Math.max(Math.abs((element ? element.clientHeight : 0) - rippleY), rippleY) * 2 + 2;\n      rippleSize = Math.sqrt(Math.pow(sizeX, 2) + Math.pow(sizeY, 2));\n    } // Touche devices\n\n\n    if (event.touches) {\n      // check that this isn't another touchstart due to multitouch\n      // otherwise we will only clear a single timer when unmounting while two\n      // are running\n      if (startTimerCommit.current === null) {\n        // Prepare the ripple effect.\n        startTimerCommit.current = function () {\n          startCommit({\n            pulsate: pulsate,\n            rippleX: rippleX,\n            rippleY: rippleY,\n            rippleSize: rippleSize,\n            cb: cb\n          });\n        }; // Delay the execution of the ripple effect.\n\n\n        startTimer.current = setTimeout(function () {\n          if (startTimerCommit.current) {\n            startTimerCommit.current();\n            startTimerCommit.current = null;\n          }\n        }, DELAY_RIPPLE); // We have to make a tradeoff with this value.\n      }\n    } else {\n      startCommit({\n        pulsate: pulsate,\n        rippleX: rippleX,\n        rippleY: rippleY,\n        rippleSize: rippleSize,\n        cb: cb\n      });\n    }\n  }, [centerProp, startCommit]);\n  var pulsate = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function () {\n    start({}, {\n      pulsate: true\n    });\n  }, [start]);\n  var stop = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (event, cb) {\n    clearTimeout(startTimer.current); // The touch interaction occurs too quickly.\n    // We still want to show ripple effect.\n\n    if (event.type === 'touchend' && startTimerCommit.current) {\n      event.persist();\n      startTimerCommit.current();\n      startTimerCommit.current = null;\n      startTimer.current = setTimeout(function () {\n        stop(event, cb);\n      });\n      return;\n    }\n\n    startTimerCommit.current = null;\n    setRipples(function (oldRipples) {\n      if (oldRipples.length > 0) {\n        return oldRipples.slice(1);\n      }\n\n      return oldRipples;\n    });\n    rippleCallback.current = cb;\n  }, []);\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useImperativeHandle\"](ref, function () {\n    return {\n      pulsate: pulsate,\n      start: start,\n      stop: stop\n    };\n  }, [pulsate, start, stop]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(classes.root, className),\n    ref: container\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](react_transition_group__WEBPACK_IMPORTED_MODULE_5__[\"TransitionGroup\"], {\n    component: null,\n    exit: true\n  }, ripples));\n});\n true ? TouchRipple.propTypes = {\n  /**\n   * If `true`, the ripple starts at the center of the component\n   * rather than at the point of interaction.\n   */\n  center: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  flip: false,\n  name: 'MuiTouchRipple'\n})( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"memo\"](TouchRipple)));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ButtonBase__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js ***!
+  \*****************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _internal_SwitchBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../internal/SwitchBase */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js\");\n/* harmony import */ var _internal_svg_icons_CheckBoxOutlineBlank__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../internal/svg-icons/CheckBoxOutlineBlank */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js\");\n/* harmony import */ var _internal_svg_icons_CheckBox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../internal/svg-icons/CheckBox */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js\");\n/* harmony import */ var _styles_colorManipulator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n/* harmony import */ var _internal_svg_icons_IndeterminateCheckBox__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../internal/svg-icons/IndeterminateCheckBox */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      color: theme.palette.text.secondary\n    },\n\n    /* Pseudo-class applied to the root element if `checked={true}`. */\n    checked: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Pseudo-class applied to the root element if `indeterminate={true}`. */\n    indeterminate: {},\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      '&$checked': {\n        color: theme.palette.primary.main,\n        '&:hover': {\n          backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_9__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n          // Reset on touch devices, it doesn't add specificity\n          '@media (hover: none)': {\n            backgroundColor: 'transparent'\n          }\n        }\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      '&$checked': {\n        color: theme.palette.secondary.main,\n        '&:hover': {\n          backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_9__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n          // Reset on touch devices, it doesn't add specificity\n          '@media (hover: none)': {\n            backgroundColor: 'transparent'\n          }\n        }\n      },\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    }\n  };\n};\nvar defaultCheckedIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_CheckBox__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null);\nvar defaultIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_CheckBoxOutlineBlank__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null);\nvar defaultIndeterminateIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_svg_icons_IndeterminateCheckBox__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null);\nvar Checkbox = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Checkbox(props, ref) {\n  var _props$checkedIcon = props.checkedIcon,\n      checkedIcon = _props$checkedIcon === void 0 ? defaultCheckedIcon : _props$checkedIcon,\n      classes = props.classes,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'secondary' : _props$color,\n      _props$icon = props.icon,\n      iconProp = _props$icon === void 0 ? defaultIcon : _props$icon,\n      _props$indeterminate = props.indeterminate,\n      indeterminate = _props$indeterminate === void 0 ? false : _props$indeterminate,\n      _props$indeterminateI = props.indeterminateIcon,\n      indeterminateIconProp = _props$indeterminateI === void 0 ? defaultIndeterminateIcon : _props$indeterminateI,\n      inputProps = props.inputProps,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 'medium' : _props$size,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"checkedIcon\", \"classes\", \"color\", \"icon\", \"indeterminate\", \"indeterminateIcon\", \"inputProps\", \"size\"]);\n\n  var icon = indeterminate ? indeterminateIconProp : iconProp;\n  var indeterminateIcon = indeterminate ? indeterminateIconProp : checkedIcon;\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_internal_SwitchBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    type: \"checkbox\",\n    classes: {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(color))], indeterminate && classes.indeterminate),\n      checked: classes.checked,\n      disabled: classes.disabled\n    },\n    color: color,\n    inputProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      'data-indeterminate': indeterminate\n    }, inputProps),\n    icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](icon, {\n      fontSize: icon.props.fontSize === undefined && size === \"small\" ? size : icon.props.fontSize\n    }),\n    checkedIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](indeterminateIcon, {\n      fontSize: indeterminateIcon.props.fontSize === undefined && size === \"small\" ? size : indeterminateIcon.props.fontSize\n    }),\n    ref: ref\n  }, other));\n});\n true ? Checkbox.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, the component is checked.\n   */\n  checked: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon to display when the component is checked.\n   */\n  checkedIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'primary', 'secondary']),\n\n  /**\n   * If `true`, the checkbox will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon to display when the component is unchecked.\n   */\n  icon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the component appears indeterminate.\n   * This does not set the native input element to indeterminate due\n   * to inconsistent behavior across browsers.\n   * However, we set a `data-indeterminate` attribute on the input.\n   */\n  indeterminate: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon to display when the component is indeterminate.\n   */\n  indeterminateIcon: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * Callback fired when the state is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The size of the checkbox.\n   * `small` is equivalent to the dense checkbox styling.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['medium', 'small']),\n\n  /**\n   * The value of the component. The DOM API casts this to a string.\n   * The browser uses \"on\" as the default value.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_12__[\"default\"])(styles, {\n  name: 'MuiCheckbox'\n})(Checkbox));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js":
+/*!**************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js ***!
+  \**************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Checkbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Checkbox */ \"./jaas-client/node_modules/@material-ui/core/esm/Checkbox/Checkbox.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Checkbox__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js":
+/*!*********************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js ***!
+  \*********************************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\nvar SIZE = 44;\n\nfunction getRelativeValue(value, min, max) {\n  return (Math.min(Math.max(min, value), max) - min) / (max - min);\n}\n\nfunction easeOut(t) {\n  t = getRelativeValue(t, 0, 1); // https://gist.github.com/gre/1650294\n\n  t = (t -= 1) * t * t + 1;\n  return t;\n}\n\nfunction easeIn(t) {\n  return t * t;\n}\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      display: 'inline-block'\n    },\n\n    /* Styles applied to the root element if `variant=\"static\"`. */\n    static: {\n      transition: theme.transitions.create('transform')\n    },\n\n    /* Styles applied to the root element if `variant=\"indeterminate\"`. */\n    indeterminate: {\n      animation: '$circular-rotate 1.4s linear infinite'\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main\n    },\n\n    /* Styles applied to the `svg` element. */\n    svg: {\n      display: 'block' // Keeps the progress centered\n\n    },\n\n    /* Styles applied to the `circle` svg path. */\n    circle: {\n      stroke: 'currentColor' // Use butt to follow the specification, by chance, it's already the default CSS value.\n      // strokeLinecap: 'butt',\n\n    },\n\n    /* Styles applied to the `circle` svg path if `variant=\"static\"`. */\n    circleStatic: {\n      transition: theme.transitions.create('stroke-dashoffset')\n    },\n\n    /* Styles applied to the `circle` svg path if `variant=\"indeterminate\"`. */\n    circleIndeterminate: {\n      animation: '$circular-dash 1.4s ease-in-out infinite',\n      // Some default value that looks fine waiting for the animation to kicks in.\n      strokeDasharray: '80px, 200px',\n      strokeDashoffset: '0px' // Add the unit to fix a Edge 16 and below bug.\n\n    },\n    '@keyframes circular-rotate': {\n      '0%': {\n        // Fix IE 11 wobbly\n        transformOrigin: '50% 50%'\n      },\n      '100%': {\n        transform: 'rotate(360deg)'\n      }\n    },\n    '@keyframes circular-dash': {\n      '0%': {\n        strokeDasharray: '1px, 200px',\n        strokeDashoffset: '0px'\n      },\n      '50%': {\n        strokeDasharray: '100px, 200px',\n        strokeDashoffset: '-15px'\n      },\n      '100%': {\n        strokeDasharray: '100px, 200px',\n        strokeDashoffset: '-125px'\n      }\n    },\n\n    /* Styles applied to the `circle` svg path if `disableShrink={true}`. */\n    circleDisableShrink: {\n      animation: 'none'\n    }\n  };\n};\n/**\n * ## ARIA\n *\n * If the progress bar is describing the loading progress of a particular region of a page,\n * you should use `aria-describedby` to point to the progress bar, and set the `aria-busy`\n * attribute to `true` on that region until it has finished loading.\n */\n\nvar CircularProgress = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function CircularProgress(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      _props$disableShrink = props.disableShrink,\n      disableShrink = _props$disableShrink === void 0 ? false : _props$disableShrink,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 40 : _props$size,\n      style = props.style,\n      _props$thickness = props.thickness,\n      thickness = _props$thickness === void 0 ? 3.6 : _props$thickness,\n      _props$value = props.value,\n      value = _props$value === void 0 ? 0 : _props$value,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'indeterminate' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"color\", \"disableShrink\", \"size\", \"style\", \"thickness\", \"value\", \"variant\"]);\n\n  var circleStyle = {};\n  var rootStyle = {};\n  var rootProps = {};\n\n  if (variant === 'determinate' || variant === 'static') {\n    var circumference = 2 * Math.PI * ((SIZE - thickness) / 2);\n    circleStyle.strokeDasharray = circumference.toFixed(3);\n    rootProps['aria-valuenow'] = Math.round(value);\n\n    if (variant === 'static') {\n      circleStyle.strokeDashoffset = \"\".concat(((100 - value) / 100 * circumference).toFixed(3), \"px\");\n      rootStyle.transform = 'rotate(-90deg)';\n    } else {\n      circleStyle.strokeDashoffset = \"\".concat((easeIn((100 - value) / 100) * circumference).toFixed(3), \"px\");\n      rootStyle.transform = \"rotate(\".concat((easeOut(value / 70) * 270).toFixed(3), \"deg)\");\n    }\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, color !== 'inherit' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(color))], {\n      'indeterminate': classes.indeterminate,\n      'static': classes.static\n    }[variant]),\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      width: size,\n      height: size\n    }, rootStyle, style),\n    ref: ref,\n    role: \"progressbar\"\n  }, rootProps, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"svg\", {\n    className: classes.svg,\n    viewBox: \"\".concat(SIZE / 2, \" \").concat(SIZE / 2, \" \").concat(SIZE, \" \").concat(SIZE)\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"circle\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.circle, disableShrink && classes.circleDisableShrink, {\n      'indeterminate': classes.circleIndeterminate,\n      'static': classes.circleStatic\n    }[variant]),\n    style: circleStyle,\n    cx: SIZE,\n    cy: SIZE,\n    r: (SIZE - thickness) / 2,\n    fill: \"none\",\n    strokeWidth: thickness\n  })));\n});\n true ? CircularProgress.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['inherit', 'primary', 'secondary']),\n\n  /**\n   * If `true`, the shrink animation is disabled.\n   * This only works if variant is `indeterminate`.\n   */\n  disableShrink: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, function (props) {\n    if (props.disableShrink && props.variant && props.variant !== 'indeterminate') {\n      return new Error('Material-UI: You have provided the `disableShrink` prop ' + 'with a variant other than `indeterminate`. This will have no effect.');\n    }\n\n    return null;\n  }),\n\n  /**\n   * The size of the circle.\n   * If using a number, the pixel unit is assumed.\n   * If using a string, you need to provide the CSS unit, e.g '3rem'.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The thickness of the circle.\n   */\n  thickness: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * The value of the progress indicator for the determinate and static variants.\n   * Value between 0 and 100.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * The variant to use.\n   * Use indeterminate when there is no progress value.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['determinate', 'indeterminate', 'static'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiCircularProgress',\n  flip: false\n})(CircularProgress));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CircularProgress__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CircularProgress */ \"./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _CircularProgress__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js ***!
+  \*******************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n      width: '100%',\n      marginLeft: 'auto',\n      boxSizing: 'border-box',\n      marginRight: 'auto',\n      paddingLeft: theme.spacing(2),\n      paddingRight: theme.spacing(2),\n      display: 'block'\n    }, theme.breakpoints.up('sm'), {\n      paddingLeft: theme.spacing(3),\n      paddingRight: theme.spacing(3)\n    }),\n\n    /* Styles applied to the root element if `disableGutters={true}`. */\n    disableGutters: {\n      paddingLeft: 0,\n      paddingRight: 0\n    },\n\n    /* Styles applied to the root element if `fixed={true}`. */\n    fixed: Object.keys(theme.breakpoints.values).reduce(function (acc, breakpoint) {\n      var value = theme.breakpoints.values[breakpoint];\n\n      if (value !== 0) {\n        acc[theme.breakpoints.up(breakpoint)] = {\n          maxWidth: value\n        };\n      }\n\n      return acc;\n    }, {}),\n\n    /* Styles applied to the root element if `maxWidth=\"xs\"`. */\n    maxWidthXs: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('xs'), {\n      maxWidth: Math.max(theme.breakpoints.values.xs, 444)\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"sm\"`. */\n    maxWidthSm: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('sm'), {\n      maxWidth: theme.breakpoints.values.sm\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"md\"`. */\n    maxWidthMd: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('md'), {\n      maxWidth: theme.breakpoints.values.md\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"lg\"`. */\n    maxWidthLg: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('lg'), {\n      maxWidth: theme.breakpoints.values.lg\n    }),\n\n    /* Styles applied to the root element if `maxWidth=\"xl\"`. */\n    maxWidthXl: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.up('xl'), {\n      maxWidth: theme.breakpoints.values.xl\n    })\n  };\n};\nvar Container = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Container(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$disableGutters = props.disableGutters,\n      disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n      _props$fixed = props.fixed,\n      fixed = _props$fixed === void 0 ? false : _props$fixed,\n      _props$maxWidth = props.maxWidth,\n      maxWidth = _props$maxWidth === void 0 ? 'lg' : _props$maxWidth,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"component\", \"disableGutters\", \"fixed\", \"maxWidth\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, fixed && classes.fixed, disableGutters && classes.disableGutters, maxWidth !== false && classes[\"maxWidth\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(String(maxWidth)))]),\n    ref: ref\n  }, other));\n});\n true ? Container.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * @ignore\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .node.isRequired,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the left and right padding is removed.\n   */\n  disableGutters: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Set the max-width to match the min-width of the current breakpoint.\n   * This is useful if you'd prefer to design for a fixed set of sizes\n   * instead of trying to accommodate a fully fluid viewport.\n   * It's fluid by default.\n   */\n  fixed: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Determine the max-width of the container.\n   * The container width grows with the size of the screen.\n   * Set to `false` to disable `maxWidth`.\n   */\n  maxWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['lg', 'md', 'sm', 'xl', 'xs', false])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiContainer'\n})(Container));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Container/index.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Container/index.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Container */ \"./jaas-client/node_modules/@material-ui/core/esm/Container/Container.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Container__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Container/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js ***!
+  \***********************************************************************************/
+/*! exports provided: html, body, styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"html\", function() { return html; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"body\", function() { return body; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\n\n\n\nvar html = {\n  WebkitFontSmoothing: 'antialiased',\n  // Antialiasing.\n  MozOsxFontSmoothing: 'grayscale',\n  // Antialiasing.\n  // Change from `box-sizing: content-box` so that `width`\n  // is not affected by `padding` or `border`.\n  boxSizing: 'border-box'\n};\nvar body = function body(theme) {\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    color: theme.palette.text.primary\n  }, theme.typography.body2, {\n    backgroundColor: theme.palette.background.default,\n    '@media print': {\n      // Save printer ink.\n      backgroundColor: theme.palette.common.white\n    }\n  });\n};\nvar styles = function styles(theme) {\n  return {\n    '@global': {\n      html: html,\n      '*, *::before, *::after': {\n        boxSizing: 'inherit'\n      },\n      'strong, b': {\n        fontWeight: theme.typography.fontWeightBold\n      },\n      body: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        margin: 0\n      }, body(theme), {\n        // Add support for document.body.requestFullScreen().\n        // Other elements, if background transparent, are not supported.\n        '&::backdrop': {\n          backgroundColor: theme.palette.background.default\n        }\n      })\n    }\n  };\n};\n/**\n * Kickstart an elegant, consistent, and simple baseline to build upon.\n */\n\nfunction CssBaseline(props) {\n  /* eslint-disable no-unused-vars */\n  var _props$children = props.children,\n      children = _props$children === void 0 ? null : _props$children,\n      classes = props.classes;\n  /* eslint-enable no-unused-vars */\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_1__[\"Fragment\"], null, children);\n}\n\n true ? CssBaseline.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * You can wrap a node.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n} : undefined;\n\nif (true) {\n  // eslint-disable-next-line\n  CssBaseline['propTypes' + ''] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_4__[\"exactProp\"])(CssBaseline.propTypes);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(styles, {\n  name: 'MuiCssBaseline'\n})(CssBaseline));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js ***!
+  \*****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CssBaseline__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CssBaseline */ \"./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _CssBaseline__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js ***!
+  \*************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Modal */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js\");\n/* harmony import */ var _Backdrop__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Backdrop */ \"./jaas-client/node_modules/@material-ui/core/esm/Backdrop/index.js\");\n/* harmony import */ var _Fade__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Fade */ \"./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js\");\n/* harmony import */ var _styles_transitions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../styles/transitions */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js\");\n/* harmony import */ var _Paper__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Paper */ \"./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      '@media print': {\n        // Use !important to override the Modal inline-style.\n        position: 'absolute !important'\n      }\n    },\n\n    /* Styles applied to the container element if `scroll=\"paper\"`. */\n    scrollPaper: {\n      display: 'flex',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n\n    /* Styles applied to the container element if `scroll=\"body\"`. */\n    scrollBody: {\n      overflowY: 'auto',\n      overflowX: 'hidden',\n      textAlign: 'center',\n      '&:after': {\n        content: '\"\"',\n        display: 'inline-block',\n        verticalAlign: 'middle',\n        height: '100%',\n        width: '0'\n      }\n    },\n\n    /* Styles applied to the container element. */\n    container: {\n      height: '100%',\n      '@media print': {\n        height: 'auto'\n      },\n      // We disable the focus ring for mouse, touch and keyboard users.\n      outline: 0\n    },\n\n    /* Styles applied to the `Paper` component. */\n    paper: {\n      margin: 32,\n      position: 'relative',\n      overflowY: 'auto',\n      // Fix IE 11 issue, to remove at some point.\n      '@media print': {\n        overflowY: 'visible',\n        boxShadow: 'none'\n      }\n    },\n\n    /* Styles applied to the `Paper` component if `scroll=\"paper\"`. */\n    paperScrollPaper: {\n      display: 'flex',\n      flexDirection: 'column',\n      maxHeight: 'calc(100% - 64px)'\n    },\n\n    /* Styles applied to the `Paper` component if `scroll=\"body\"`. */\n    paperScrollBody: {\n      display: 'inline-block',\n      verticalAlign: 'middle',\n      textAlign: 'left' // 'initial' doesn't work on IE 11\n\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=false`. */\n    paperWidthFalse: {\n      maxWidth: 'calc(100% - 64px)'\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"xs\"`. */\n    paperWidthXs: {\n      maxWidth: Math.max(theme.breakpoints.values.xs, 444),\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(Math.max(theme.breakpoints.values.xs, 444) + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"sm\"`. */\n    paperWidthSm: {\n      maxWidth: theme.breakpoints.values.sm,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.sm + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"md\"`. */\n    paperWidthMd: {\n      maxWidth: theme.breakpoints.values.md,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.md + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"lg\"`. */\n    paperWidthLg: {\n      maxWidth: theme.breakpoints.values.lg,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.lg + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `maxWidth=\"xl\"`. */\n    paperWidthXl: {\n      maxWidth: theme.breakpoints.values.xl,\n      '&$paperScrollBody': Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.breakpoints.down(theme.breakpoints.values.xl + 32 * 2), {\n        maxWidth: 'calc(100% - 64px)'\n      })\n    },\n\n    /* Styles applied to the `Paper` component if `fullWidth={true}`. */\n    paperFullWidth: {\n      width: 'calc(100% - 64px)'\n    },\n\n    /* Styles applied to the `Paper` component if `fullScreen={true}`. */\n    paperFullScreen: {\n      margin: 0,\n      width: '100%',\n      maxWidth: '100%',\n      height: '100%',\n      maxHeight: 'none',\n      borderRadius: 0,\n      '&$paperScrollBody': {\n        margin: 0,\n        maxWidth: '100%'\n      }\n    }\n  };\n};\nvar defaultTransitionDuration = {\n  enter: _styles_transitions__WEBPACK_IMPORTED_MODULE_11__[\"duration\"].enteringScreen,\n  exit: _styles_transitions__WEBPACK_IMPORTED_MODULE_11__[\"duration\"].leavingScreen\n};\n/**\n * Dialogs are overlaid modal paper based components with a backdrop.\n */\n\nvar Dialog = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Dialog(props, ref) {\n  var BackdropProps = props.BackdropProps,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$disableBackdro = props.disableBackdropClick,\n      disableBackdropClick = _props$disableBackdro === void 0 ? false : _props$disableBackdro,\n      _props$disableEscapeK = props.disableEscapeKeyDown,\n      disableEscapeKeyDown = _props$disableEscapeK === void 0 ? false : _props$disableEscapeK,\n      _props$fullScreen = props.fullScreen,\n      fullScreen = _props$fullScreen === void 0 ? false : _props$fullScreen,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$maxWidth = props.maxWidth,\n      maxWidth = _props$maxWidth === void 0 ? 'sm' : _props$maxWidth,\n      onBackdropClick = props.onBackdropClick,\n      onClose = props.onClose,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onEscapeKeyDown = props.onEscapeKeyDown,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      open = props.open,\n      _props$PaperComponent = props.PaperComponent,\n      PaperComponent = _props$PaperComponent === void 0 ? _Paper__WEBPACK_IMPORTED_MODULE_12__[\"default\"] : _props$PaperComponent,\n      _props$PaperProps = props.PaperProps,\n      PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,\n      _props$scroll = props.scroll,\n      scroll = _props$scroll === void 0 ? 'paper' : _props$scroll,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? _Fade__WEBPACK_IMPORTED_MODULE_10__[\"default\"] : _props$TransitionComp,\n      _props$transitionDura = props.transitionDuration,\n      transitionDuration = _props$transitionDura === void 0 ? defaultTransitionDuration : _props$transitionDura,\n      TransitionProps = props.TransitionProps,\n      ariaDescribedby = props['aria-describedby'],\n      ariaLabelledby = props['aria-labelledby'],\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"BackdropProps\", \"children\", \"classes\", \"className\", \"disableBackdropClick\", \"disableEscapeKeyDown\", \"fullScreen\", \"fullWidth\", \"maxWidth\", \"onBackdropClick\", \"onClose\", \"onEnter\", \"onEntered\", \"onEntering\", \"onEscapeKeyDown\", \"onExit\", \"onExited\", \"onExiting\", \"open\", \"PaperComponent\", \"PaperProps\", \"scroll\", \"TransitionComponent\", \"transitionDuration\", \"TransitionProps\", \"aria-describedby\", \"aria-labelledby\"]);\n\n  var mouseDownTarget = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n\n  var handleMouseDown = function handleMouseDown(event) {\n    mouseDownTarget.current = event.target;\n  };\n\n  var handleBackdropClick = function handleBackdropClick(event) {\n    // Ignore the events not coming from the \"backdrop\"\n    // We don't want to close the dialog when clicking the dialog content.\n    if (event.target !== event.currentTarget) {\n      return;\n    } // Make sure the event starts and ends on the same DOM element.\n\n\n    if (event.target !== mouseDownTarget.current) {\n      return;\n    }\n\n    mouseDownTarget.current = null;\n\n    if (onBackdropClick) {\n      onBackdropClick(event);\n    }\n\n    if (!disableBackdropClick && onClose) {\n      onClose(event, 'backdropClick');\n    }\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_Modal__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className),\n    BackdropComponent: _Backdrop__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n    BackdropProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      transitionDuration: transitionDuration\n    }, BackdropProps),\n    closeAfterTransition: true,\n    disableBackdropClick: disableBackdropClick,\n    disableEscapeKeyDown: disableEscapeKeyDown,\n    onEscapeKeyDown: onEscapeKeyDown,\n    onClose: onClose,\n    open: open,\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: open,\n    timeout: transitionDuration,\n    onEnter: onEnter,\n    onEntering: onEntering,\n    onEntered: onEntered,\n    onExit: onExit,\n    onExiting: onExiting,\n    onExited: onExited,\n    role: \"none presentation\"\n  }, TransitionProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"div\", {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.container, classes[\"scroll\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(scroll))]),\n    onMouseUp: handleBackdropClick,\n    onMouseDown: handleMouseDown\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](PaperComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    elevation: 24,\n    role: \"dialog\",\n    \"aria-describedby\": ariaDescribedby,\n    \"aria-labelledby\": ariaLabelledby\n  }, PaperProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.paper, classes[\"paperScroll\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(scroll))], classes[\"paperWidth\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(String(maxWidth)))], PaperProps.className, fullScreen && classes.paperFullScreen, fullWidth && classes.paperFullWidth)\n  }), children))));\n});\n true ? Dialog.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The id(s) of the element(s) that describe the dialog.\n   */\n  'aria-describedby': prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The id(s) of the element(s) that label the dialog.\n   */\n  'aria-labelledby': prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  BackdropProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Dialog children, usually the included sub-components.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * If `true`, clicking the backdrop will not fire the `onClose` callback.\n   */\n  disableBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, hitting escape will not fire the `onClose` callback.\n   */\n  disableEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the dialog will be full-screen\n   */\n  fullScreen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the dialog stretches to `maxWidth`.\n   *\n   * Notice that the dialog width grow is limited by the default margin.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Determine the max-width of the dialog.\n   * The dialog width grows with the size of the screen.\n   * Set to `false` to disable `maxWidth`.\n   */\n  maxWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['lg', 'md', 'sm', 'xl', 'xs', false]),\n\n  /**\n   * Callback fired when the backdrop is clicked.\n   */\n  onBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   *\n   * @param {object} event The event source of the callback.\n   * @param {string} reason Can be: `\"escapeKeyDown\"`, `\"backdropClick\"`.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the dialog enters.\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog has entered.\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog is entering.\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the escape key is pressed,\n   * `disableKeyboard` is false and the modal is in focus.\n   */\n  onEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the dialog exits.\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog has exited.\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the dialog is exiting.\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the Dialog is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,\n\n  /**\n   * The component used to render the body of the dialog.\n   */\n  PaperComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * Props applied to the [`Paper`](/api/paper/) element.\n   */\n  PaperProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Determine the container for scrolling the dialog.\n   */\n  scroll: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['body', 'paper']),\n\n  /**\n   * The component used for the transition.\n   * [Follow this guide](/components/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.\n   */\n  TransitionComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })]),\n\n  /**\n   * Props applied to the [`Transition`](http://reactcommunity.org/react-transition-group/transition#Transition-props) element.\n   */\n  TransitionProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiDialog'\n})(Dialog));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Dialog */ \"./jaas-client/node_modules/@material-ui/core/esm/Dialog/Dialog.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Dialog__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js ***!
+  \***********************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    margin: 0,\n    padding: '16px 24px',\n    flex: '0 0 auto'\n  }\n};\nvar DialogTitle = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function DialogTitle(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$disableTypogra = props.disableTypography,\n      disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"disableTypography\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className),\n    ref: ref\n  }, other), disableTypography ? children : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Typography__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n    component: \"h2\",\n    variant: \"h6\"\n  }, children));\n});\n true ? DialogTitle.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the children won't be wrapped by a typography component.\n   * For instance, this can be useful to render an h4 instead of the default h2.\n   */\n  disableTypography: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiDialogTitle'\n})(DialogTitle));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js ***!
+  \*****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _DialogTitle__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DialogTitle */ \"./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _DialogTitle__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js ***!
+  \*********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-transition-group */ \"./jaas-client/node_modules/react-transition-group/esm/index.js\");\n/* harmony import */ var _styles_transitions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/transitions */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n/* harmony import */ var _transitions_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../transitions/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  entering: {\n    opacity: 1\n  },\n  entered: {\n    opacity: 1\n  }\n};\nvar defaultTimeout = {\n  enter: _styles_transitions__WEBPACK_IMPORTED_MODULE_6__[\"duration\"].enteringScreen,\n  exit: _styles_transitions__WEBPACK_IMPORTED_MODULE_6__[\"duration\"].leavingScreen\n};\n/**\n * The Fade transition is used by the [Modal](/components/modal/) component.\n * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.\n */\n\nvar Fade = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Fade(props, ref) {\n  var children = props.children,\n      _props$disableStrictM = props.disableStrictModeCompat,\n      disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM,\n      inProp = props.in,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      style = props.style,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? react_transition_group__WEBPACK_IMPORTED_MODULE_5__[\"Transition\"] : _props$TransitionComp,\n      _props$timeout = props.timeout,\n      timeout = _props$timeout === void 0 ? defaultTimeout : _props$timeout,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"children\", \"disableStrictModeCompat\", \"in\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"style\", \"TransitionComponent\", \"timeout\"]);\n\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat;\n  var nodeRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  var foreignRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(children.ref, ref);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(enableStrictModeCompat ? nodeRef : undefined, foreignRef);\n\n  var normalizedTransitionCallback = function normalizedTransitionCallback(callback) {\n    return function (nodeOrAppearing, maybeAppearing) {\n      if (callback) {\n        var _ref = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing],\n            _ref2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, 2),\n            node = _ref2[0],\n            isAppearing = _ref2[1]; // onEnterXxx and onExitXxx callbacks have a different arguments.length value.\n\n\n        if (isAppearing === undefined) {\n          callback(node);\n        } else {\n          callback(node, isAppearing);\n        }\n      }\n    };\n  };\n\n  var handleEntering = normalizedTransitionCallback(onEntering);\n  var handleEnter = normalizedTransitionCallback(function (node, isAppearing) {\n    Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_8__[\"reflow\"])(node); // So the animation always start from the start.\n\n    var transitionProps = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_8__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'enter'\n    });\n    node.style.webkitTransition = theme.transitions.create('opacity', transitionProps);\n    node.style.transition = theme.transitions.create('opacity', transitionProps);\n\n    if (onEnter) {\n      onEnter(node, isAppearing);\n    }\n  });\n  var handleEntered = normalizedTransitionCallback(onEntered);\n  var handleExiting = normalizedTransitionCallback(onExiting);\n  var handleExit = normalizedTransitionCallback(function (node) {\n    var transitionProps = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_8__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'exit'\n    });\n    node.style.webkitTransition = theme.transitions.create('opacity', transitionProps);\n    node.style.transition = theme.transitions.create('opacity', transitionProps);\n\n    if (onExit) {\n      onExit(node);\n    }\n  });\n  var handleExited = normalizedTransitionCallback(onExited);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: inProp,\n    nodeRef: enableStrictModeCompat ? nodeRef : undefined,\n    onEnter: handleEnter,\n    onEntered: handleEntered,\n    onEntering: handleEntering,\n    onExit: handleExit,\n    onExited: handleExited,\n    onExiting: handleExiting,\n    timeout: timeout\n  }, other), function (state, childProps) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"cloneElement\"](children, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        opacity: 0,\n        visibility: state === 'exited' && !inProp ? 'hidden' : undefined\n      }, styles[state], style, children.props.style),\n      ref: handleRef\n    }, childProps));\n  });\n});\n true ? Fade.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A single child content element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.element,\n\n  /**\n   * Enable this prop if you encounter 'Function components cannot be given refs',\n   * use `unstable_createStrictModeTheme`,\n   * and can't forward the ref in the child component.\n   */\n  disableStrictModeCompat: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the component will transition in.\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   */\n  timeout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Fade);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js ***!
+  \**********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Fade__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Fade */ \"./jaas-client/node_modules/@material-ui/core/esm/Fade/Fade.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Fade__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Fade/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js ***!
+  \***********************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var light = theme.palette.type === 'light';\n  var bottomLineColor = light ? 'rgba(0, 0, 0, 0.42)' : 'rgba(255, 255, 255, 0.7)';\n  var backgroundColor = light ? 'rgba(0, 0, 0, 0.09)' : 'rgba(255, 255, 255, 0.09)';\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative',\n      backgroundColor: backgroundColor,\n      borderTopLeftRadius: theme.shape.borderRadius,\n      borderTopRightRadius: theme.shape.borderRadius,\n      transition: theme.transitions.create('background-color', {\n        duration: theme.transitions.duration.shorter,\n        easing: theme.transitions.easing.easeOut\n      }),\n      '&:hover': {\n        backgroundColor: light ? 'rgba(0, 0, 0, 0.13)' : 'rgba(255, 255, 255, 0.13)',\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: backgroundColor\n        }\n      },\n      '&$focused': {\n        backgroundColor: light ? 'rgba(0, 0, 0, 0.09)' : 'rgba(255, 255, 255, 0.09)'\n      },\n      '&$disabled': {\n        backgroundColor: light ? 'rgba(0, 0, 0, 0.12)' : 'rgba(255, 255, 255, 0.12)'\n      }\n    },\n\n    /* Styles applied to the root element if color secondary. */\n    colorSecondary: {\n      '&$underline:after': {\n        borderBottomColor: theme.palette.secondary.main\n      }\n    },\n\n    /* Styles applied to the root element if `disableUnderline={false}`. */\n    underline: {\n      '&:after': {\n        borderBottom: \"2px solid \".concat(theme.palette.primary.main),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\"',\n        position: 'absolute',\n        right: 0,\n        transform: 'scaleX(0)',\n        transition: theme.transitions.create('transform', {\n          duration: theme.transitions.duration.shorter,\n          easing: theme.transitions.easing.easeOut\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&$focused:after': {\n        transform: 'scaleX(1)'\n      },\n      '&$error:after': {\n        borderBottomColor: theme.palette.error.main,\n        transform: 'scaleX(1)' // error is always underlined in red\n\n      },\n      '&:before': {\n        borderBottom: \"1px solid \".concat(bottomLineColor),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\\\\00a0\"',\n        position: 'absolute',\n        right: 0,\n        transition: theme.transitions.create('border-bottom-color', {\n          duration: theme.transitions.duration.shorter\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&:hover:before': {\n        borderBottom: \"1px solid \".concat(theme.palette.text.primary)\n      },\n      '&$disabled:before': {\n        borderBottomStyle: 'dotted'\n      }\n    },\n\n    /* Pseudo-class applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `startAdornment` is provided. */\n    adornedStart: {\n      paddingLeft: 12\n    },\n\n    /* Styles applied to the root element if `endAdornment` is provided. */\n    adornedEnd: {\n      paddingRight: 12\n    },\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {\n      padding: '27px 12px 10px',\n      '&$marginDense': {\n        paddingTop: 23,\n        paddingBottom: 6\n      }\n    },\n\n    /* Styles applied to the `input` element. */\n    input: {\n      padding: '27px 12px 10px',\n      '&:-webkit-autofill': {\n        WebkitBoxShadow: theme.palette.type === 'light' ? null : '0 0 0 100px #266798 inset',\n        WebkitTextFillColor: theme.palette.type === 'light' ? null : '#fff',\n        caretColor: theme.palette.type === 'light' ? null : '#fff',\n        borderTopLeftRadius: 'inherit',\n        borderTopRightRadius: 'inherit'\n      }\n    },\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {\n      paddingTop: 23,\n      paddingBottom: 6\n    },\n\n    /* Styles applied to the `input` if in `<FormControl hiddenLabel />`. */\n    inputHiddenLabel: {\n      paddingTop: 18,\n      paddingBottom: 19,\n      '&$inputMarginDense': {\n        paddingTop: 10,\n        paddingBottom: 11\n      }\n    },\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {\n      padding: 0\n    },\n\n    /* Styles applied to the `input` element if `startAdornment` is provided. */\n    inputAdornedStart: {\n      paddingLeft: 0\n    },\n\n    /* Styles applied to the `input` element if `endAdornment` is provided. */\n    inputAdornedEnd: {\n      paddingRight: 0\n    }\n  };\n};\nvar FilledInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FilledInput(props, ref) {\n  var disableUnderline = props.disableUnderline,\n      classes = props.classes,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"disableUnderline\", \"classes\", \"fullWidth\", \"inputComponent\", \"multiline\", \"type\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, classes, {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, !disableUnderline && classes.underline),\n      underline: null\n    }),\n    fullWidth: fullWidth,\n    inputComponent: inputComponent,\n    multiline: multiline,\n    ref: ref,\n    type: type\n  }, other));\n});\n true ? FilledInput.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will not have an underline.\n   */\n  disableUnderline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\nFilledInput.muiName = 'Input';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiFilledInput'\n})(FilledInput));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js ***!
+  \*****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FilledInput__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FilledInput */ \"./jaas-client/node_modules/@material-ui/core/esm/FilledInput/FilledInput.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FilledInput__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js ***!
+  \***********************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _InputBase_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../InputBase/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/isMuiElement */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js\");\n/* harmony import */ var _FormControlContext__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FormControlContext */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    display: 'inline-flex',\n    flexDirection: 'column',\n    position: 'relative',\n    // Reset fieldset default style.\n    minWidth: 0,\n    padding: 0,\n    margin: 0,\n    border: 0,\n    verticalAlign: 'top' // Fix alignment issue on Safari.\n\n  },\n\n  /* Styles applied to the root element if `margin=\"normal\"`. */\n  marginNormal: {\n    marginTop: 16,\n    marginBottom: 8\n  },\n\n  /* Styles applied to the root element if `margin=\"dense\"`. */\n  marginDense: {\n    marginTop: 8,\n    marginBottom: 4\n  },\n\n  /* Styles applied to the root element if `fullWidth={true}`. */\n  fullWidth: {\n    width: '100%'\n  }\n};\n/**\n * Provides context such as filled/focused/error/required for form inputs.\n * Relying on the context provides high flexibility and ensures that the state always stays\n * consistent across the children of the `FormControl`.\n * This context is used by the following components:\n *\n *  - FormLabel\n *  - FormHelperText\n *  - Input\n *  - InputLabel\n *\n * You can find one composition example below and more going to [the demos](/components/text-fields/#components).\n *\n * ```jsx\n * <FormControl>\n *   <InputLabel htmlFor=\"my-input\">Email address</InputLabel>\n *   <Input id=\"my-input\" aria-describedby=\"my-helper-text\" />\n *   <FormHelperText id=\"my-helper-text\">We'll never share your email.</FormHelperText>\n * </FormControl>\n * ```\n *\n * ⚠️Only one input can be used within a FormControl.\n */\n\nvar FormControl = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormControl(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$error = props.error,\n      error = _props$error === void 0 ? false : _props$error,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      visuallyFocused = props.focused,\n      _props$hiddenLabel = props.hiddenLabel,\n      hiddenLabel = _props$hiddenLabel === void 0 ? false : _props$hiddenLabel,\n      _props$margin = props.margin,\n      margin = _props$margin === void 0 ? 'none' : _props$margin,\n      _props$required = props.required,\n      required = _props$required === void 0 ? false : _props$required,\n      size = props.size,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"error\", \"fullWidth\", \"focused\", \"hiddenLabel\", \"margin\", \"required\", \"size\", \"variant\"]);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](function () {\n    // We need to iterate through the children and find the Input in order\n    // to fully support server-side rendering.\n    var initialAdornedStart = false;\n\n    if (children) {\n      react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].forEach(children, function (child) {\n        if (!Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['Input', 'Select'])) {\n          return;\n        }\n\n        var input = Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['Select']) ? child.props.input : child;\n\n        if (input && Object(_InputBase_utils__WEBPACK_IMPORTED_MODULE_5__[\"isAdornedStart\"])(input.props)) {\n          initialAdornedStart = true;\n        }\n      });\n    }\n\n    return initialAdornedStart;\n  }),\n      adornedStart = _React$useState[0],\n      setAdornedStart = _React$useState[1];\n\n  var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](function () {\n    // We need to iterate through the children and find the Input in order\n    // to fully support server-side rendering.\n    var initialFilled = false;\n\n    if (children) {\n      react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].forEach(children, function (child) {\n        if (!Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['Input', 'Select'])) {\n          return;\n        }\n\n        if (Object(_InputBase_utils__WEBPACK_IMPORTED_MODULE_5__[\"isFilled\"])(child.props, true)) {\n          initialFilled = true;\n        }\n      });\n    }\n\n    return initialFilled;\n  }),\n      filled = _React$useState2[0],\n      setFilled = _React$useState2[1];\n\n  var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      _focused = _React$useState3[0],\n      setFocused = _React$useState3[1];\n\n  var focused = visuallyFocused !== undefined ? visuallyFocused : _focused;\n\n  if (disabled && focused) {\n    setFocused(false);\n  }\n\n  var registerEffect;\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    var registeredInput = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](false);\n\n    registerEffect = function registerEffect() {\n      if (registeredInput.current) {\n        console.error(['Material-UI: There are multiple InputBase components inside a FormControl.', 'This is not supported. It might cause infinite rendering loops.', 'Only use one InputBase.'].join('\\n'));\n      }\n\n      registeredInput.current = true;\n      return function () {\n        registeredInput.current = false;\n      };\n    };\n  }\n\n  var onFilled = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    setFilled(true);\n  }, []);\n  var onEmpty = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    setFilled(false);\n  }, []);\n  var childContext = {\n    adornedStart: adornedStart,\n    setAdornedStart: setAdornedStart,\n    color: color,\n    disabled: disabled,\n    error: error,\n    filled: filled,\n    focused: focused,\n    fullWidth: fullWidth,\n    hiddenLabel: hiddenLabel,\n    margin: (size === 'small' ? 'dense' : undefined) || margin,\n    onBlur: function onBlur() {\n      setFocused(false);\n    },\n    onEmpty: onEmpty,\n    onFilled: onFilled,\n    onFocus: function onFocus() {\n      setFocused(true);\n    },\n    registerEffect: registerEffect,\n    required: required,\n    variant: variant\n  };\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormControlContext__WEBPACK_IMPORTED_MODULE_9__[\"default\"].Provider, {\n    value: childContext\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, margin !== 'none' && classes[\"margin\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(margin))], fullWidth && classes.fullWidth),\n    ref: ref\n  }, other), children));\n});\n true ? FormControl.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The contents of the form control.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the label, input and helper text should be displayed in a disabled state.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label should be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the component will be displayed in focused state.\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the component will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will be hidden.\n   * This is used to increase density for a `FilledInput`.\n   * Be sure to add `aria-label` to the `input` element.\n   */\n  hiddenLabel: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `dense` or `normal`, will adjust vertical spacing of this and contained components.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none', 'normal']),\n\n  /**\n   * If `true`, the label will indicate that the input is required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The size of the text field.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['medium', 'small']),\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiFormControl'\n})(FormControl));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js":
+/*!******************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js ***!
+  \******************************************************************************************/
+/*! exports provided: useFormControl, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useFormControl\", function() { return useFormControl; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * @ignore - internal component.\n */\n\nvar FormControlContext = react__WEBPACK_IMPORTED_MODULE_0__[\"createContext\"]();\n\nif (true) {\n  FormControlContext.displayName = 'FormControlContext';\n}\n\nfunction useFormControl() {\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useContext\"](FormControlContext);\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (FormControlContext);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js":
+/*!****************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js ***!
+  \****************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return formControlState; });\nfunction formControlState(_ref) {\n  var props = _ref.props,\n      states = _ref.states,\n      muiFormControl = _ref.muiFormControl;\n  return states.reduce(function (acc, state) {\n    acc[state] = props[state];\n\n    if (muiFormControl) {\n      if (typeof props[state] === 'undefined') {\n        acc[state] = muiFormControl[state];\n      }\n    }\n\n    return acc;\n  }, {});\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js ***!
+  \*****************************************************************************/
+/*! exports provided: default, useFormControl */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControl.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormControl__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _useFormControl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useFormControl\", function() { return _useFormControl__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js":
+/*!**************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js ***!
+  \**************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useFormControl; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _FormControlContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FormControlContext */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js\");\n\n\nfunction useFormControl() {\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useContext\"](_FormControlContext__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js":
+/*!*********************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js ***!
+  \*********************************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      display: 'inline-flex',\n      alignItems: 'center',\n      cursor: 'pointer',\n      // For correct alignment with the text.\n      verticalAlign: 'middle',\n      WebkitTapHighlightColor: 'transparent',\n      marginLeft: -11,\n      marginRight: 16,\n      // used for row presentation of radio/checkbox\n      '&$disabled': {\n        cursor: 'default'\n      }\n    },\n\n    /* Styles applied to the root element if `labelPlacement=\"start\"`. */\n    labelPlacementStart: {\n      flexDirection: 'row-reverse',\n      marginLeft: 16,\n      // used for row presentation of radio/checkbox\n      marginRight: -11\n    },\n\n    /* Styles applied to the root element if `labelPlacement=\"top\"`. */\n    labelPlacementTop: {\n      flexDirection: 'column-reverse',\n      marginLeft: 16\n    },\n\n    /* Styles applied to the root element if `labelPlacement=\"bottom\"`. */\n    labelPlacementBottom: {\n      flexDirection: 'column',\n      marginLeft: 16\n    },\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the label's Typography component. */\n    label: {\n      '&$disabled': {\n        color: theme.palette.text.disabled\n      }\n    }\n  };\n};\n/**\n * Drop in replacement of the `Radio`, `Switch` and `Checkbox` component.\n * Use this component if you want to display an extra label.\n */\n\nvar FormControlLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormControlLabel(props, ref) {\n  var checked = props.checked,\n      classes = props.classes,\n      className = props.className,\n      control = props.control,\n      disabledProp = props.disabled,\n      inputRef = props.inputRef,\n      label = props.label,\n      _props$labelPlacement = props.labelPlacement,\n      labelPlacement = _props$labelPlacement === void 0 ? 'end' : _props$labelPlacement,\n      name = props.name,\n      onChange = props.onChange,\n      value = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"checked\", \"classes\", \"className\", \"control\", \"disabled\", \"inputRef\", \"label\", \"labelPlacement\", \"name\", \"onChange\", \"value\"]);\n\n  var muiFormControl = Object(_FormControl__WEBPACK_IMPORTED_MODULE_6__[\"useFormControl\"])();\n  var disabled = disabledProp;\n\n  if (typeof disabled === 'undefined' && typeof control.props.disabled !== 'undefined') {\n    disabled = control.props.disabled;\n  }\n\n  if (typeof disabled === 'undefined' && muiFormControl) {\n    disabled = muiFormControl.disabled;\n  }\n\n  var controlProps = {\n    disabled: disabled\n  };\n  ['checked', 'name', 'onChange', 'value', 'inputRef'].forEach(function (key) {\n    if (typeof control.props[key] === 'undefined' && typeof props[key] !== 'undefined') {\n      controlProps[key] = props[key];\n    }\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"label\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, labelPlacement !== 'end' && classes[\"labelPlacement\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(labelPlacement))], disabled && classes.disabled),\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](control, controlProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Typography__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n    component: \"span\",\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.label, disabled && classes.disabled)\n  }, label));\n});\n true ? FormControlLabel.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, the component appears selected.\n   */\n  checked: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * A control element. For instance, it can be be a `Radio`, a `Switch` or a `Checkbox`.\n   */\n  control: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.element.isRequired,\n\n  /**\n   * If `true`, the control will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * The text to be used in an enclosing label element.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The position of the label.\n   */\n  labelPlacement: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['bottom', 'end', 'start', 'top']),\n\n  /**\n   * @ignore\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback fired when the state is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The value of the component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiFormControlLabel'\n})(FormControlLabel));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormControlLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormControlLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormControlLabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js":
+/*!*****************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js ***!
+  \*****************************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      color: theme.palette.text.secondary\n    }, theme.typography.caption, {\n      textAlign: 'left',\n      marginTop: 3,\n      margin: 0,\n      '&$disabled': {\n        color: theme.palette.text.disabled\n      },\n      '&$error': {\n        color: theme.palette.error.main\n      }\n    }),\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `margin=\"dense\"`. */\n    marginDense: {\n      marginTop: 4\n    },\n\n    /* Styles applied to the root element if `variant=\"filled\"` or `variant=\"outlined\"`. */\n    contained: {\n      marginLeft: 14,\n      marginRight: 14\n    },\n\n    /* Pseudo-class applied to the root element if `focused={true}`. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `filled={true}`. */\n    filled: {},\n\n    /* Pseudo-class applied to the root element if `required={true}`. */\n    required: {}\n  };\n};\nvar FormHelperText = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormHelperText(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'p' : _props$component,\n      disabled = props.disabled,\n      error = props.error,\n      filled = props.filled,\n      focused = props.focused,\n      margin = props.margin,\n      required = props.required,\n      variant = props.variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"component\", \"disabled\", \"error\", \"filled\", \"focused\", \"margin\", \"required\", \"variant\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['variant', 'margin', 'disabled', 'error', 'filled', 'focused', 'required']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, (fcs.variant === 'filled' || fcs.variant === 'outlined') && classes.contained, className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required, fcs.margin === 'dense' && classes.marginDense),\n    ref: ref\n  }, other), children === ' ' ?\n  /*#__PURE__*/\n  // eslint-disable-next-line react/no-danger\n  react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    dangerouslySetInnerHTML: {\n      __html: '&#8203;'\n    }\n  }) : children);\n});\n true ? FormHelperText.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   *\n   * If `' '` is provided, the component reserves one line height for displaying a future message.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the helper text should be displayed in a disabled state.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, helper text should be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the helper text should use filled classes key.\n   */\n  filled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the helper text should use focused classes key.\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense']),\n\n  /**\n   * If `true`, the helper text should use required classes key.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiFormHelperText'\n})(FormHelperText));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js ***!
+  \********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormHelperText__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormHelperText */ \"./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormHelperText__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js ***!
+  \*******************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      color: theme.palette.text.secondary\n    }, theme.typography.body1, {\n      lineHeight: 1,\n      padding: 0,\n      '&$focused': {\n        color: theme.palette.primary.main\n      },\n      '&$disabled': {\n        color: theme.palette.text.disabled\n      },\n      '&$error': {\n        color: theme.palette.error.main\n      }\n    }),\n\n    /* Styles applied to the root element if the color is secondary. */\n    colorSecondary: {\n      '&$focused': {\n        color: theme.palette.secondary.main\n      }\n    },\n\n    /* Pseudo-class applied to the root element if `focused={true}`. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Pseudo-class applied to the root element if `filled={true}`. */\n    filled: {},\n\n    /* Pseudo-class applied to the root element if `required={true}`. */\n    required: {},\n\n    /* Styles applied to the asterisk element. */\n    asterisk: {\n      '&$error': {\n        color: theme.palette.error.main\n      }\n    }\n  };\n};\nvar FormLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function FormLabel(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      color = props.color,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'label' : _props$component,\n      disabled = props.disabled,\n      error = props.error,\n      filled = props.filled,\n      focused = props.focused,\n      required = props.required,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"error\", \"filled\", \"focused\", \"required\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['color', 'required', 'focused', 'disabled', 'error', 'filled']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(fcs.color || 'primary'))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required),\n    ref: ref\n  }, other), children, fcs.required && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    \"aria-hidden\": true,\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.asterisk, fcs.error && classes.error)\n  }, \"\\u2009\", '*'));\n});\n true ? FormLabel.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the label should be displayed in a disabled state.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label should be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label should use filled classes key.\n   */\n  filled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input of this label is focused (used by `FormGroup` components).\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will indicate that the input is required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiFormLabel'\n})(FormLabel));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FormLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FormLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormLabel/FormLabel.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _FormLabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js ***!
+  \*********************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_requirePropFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/requirePropFactory */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js\");\n\n\n// A grid component using the following libs as inspiration.\n//\n// For the implementation:\n// - https://getbootstrap.com/docs/4.3/layout/grid/\n// - https://github.com/kristoferjoseph/flexboxgrid/blob/master/src/css/flexboxgrid.css\n// - https://github.com/roylee0704/react-flexbox-grid\n// - https://material.angularjs.org/latest/layout/introduction\n//\n// Follow this flexbox Guide to better understand the underlying model:\n// - https://css-tricks.com/snippets/css/a-guide-to-flexbox/\n\n\n\n\n\nvar SPACINGS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nvar GRID_SIZES = ['auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];\n\nfunction generateGrid(globalStyles, theme, breakpoint) {\n  var styles = {};\n  GRID_SIZES.forEach(function (size) {\n    var key = \"grid-\".concat(breakpoint, \"-\").concat(size);\n\n    if (size === true) {\n      // For the auto layouting\n      styles[key] = {\n        flexBasis: 0,\n        flexGrow: 1,\n        maxWidth: '100%'\n      };\n      return;\n    }\n\n    if (size === 'auto') {\n      styles[key] = {\n        flexBasis: 'auto',\n        flexGrow: 0,\n        maxWidth: 'none'\n      };\n      return;\n    } // Keep 7 significant numbers.\n\n\n    var width = \"\".concat(Math.round(size / 12 * 10e7) / 10e5, \"%\"); // Close to the bootstrap implementation:\n    // https://github.com/twbs/bootstrap/blob/8fccaa2439e97ec72a4b7dc42ccc1f649790adb0/scss/mixins/_grid.scss#L41\n\n    styles[key] = {\n      flexBasis: width,\n      flexGrow: 0,\n      maxWidth: width\n    };\n  }); // No need for a media query for the first size.\n\n  if (breakpoint === 'xs') {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(globalStyles, styles);\n  } else {\n    globalStyles[theme.breakpoints.up(breakpoint)] = styles;\n  }\n}\n\nfunction getOffset(val) {\n  var div = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var parse = parseFloat(val);\n  return \"\".concat(parse / div).concat(String(val).replace(String(parse), '') || 'px');\n}\n\nfunction generateGutter(theme, breakpoint) {\n  var styles = {};\n  SPACINGS.forEach(function (spacing) {\n    var themeSpacing = theme.spacing(spacing);\n\n    if (themeSpacing === 0) {\n      return;\n    }\n\n    styles[\"spacing-\".concat(breakpoint, \"-\").concat(spacing)] = {\n      margin: \"-\".concat(getOffset(themeSpacing, 2)),\n      width: \"calc(100% + \".concat(getOffset(themeSpacing), \")\"),\n      '& > $item': {\n        padding: getOffset(themeSpacing, 2)\n      }\n    };\n  });\n  return styles;\n} // Default CSS values\n// flex: '0 1 auto',\n// flexDirection: 'row',\n// alignItems: 'flex-start',\n// flexWrap: 'nowrap',\n// justifyContent: 'flex-start',\n\n\nvar styles = function styles(theme) {\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    /* Styles applied to the root element. */\n    root: {},\n\n    /* Styles applied to the root element if `container={true}`. */\n    container: {\n      boxSizing: 'border-box',\n      display: 'flex',\n      flexWrap: 'wrap',\n      width: '100%'\n    },\n\n    /* Styles applied to the root element if `item={true}`. */\n    item: {\n      boxSizing: 'border-box',\n      margin: '0' // For instance, it's useful when used with a `figure` element.\n\n    },\n\n    /* Styles applied to the root element if `zeroMinWidth={true}`. */\n    zeroMinWidth: {\n      minWidth: 0\n    },\n\n    /* Styles applied to the root element if `direction=\"column\"`. */\n    'direction-xs-column': {\n      flexDirection: 'column'\n    },\n\n    /* Styles applied to the root element if `direction=\"column-reverse\"`. */\n    'direction-xs-column-reverse': {\n      flexDirection: 'column-reverse'\n    },\n\n    /* Styles applied to the root element if `direction=\"row-reverse\"`. */\n    'direction-xs-row-reverse': {\n      flexDirection: 'row-reverse'\n    },\n\n    /* Styles applied to the root element if `wrap=\"nowrap\"`. */\n    'wrap-xs-nowrap': {\n      flexWrap: 'nowrap'\n    },\n\n    /* Styles applied to the root element if `wrap=\"reverse\"`. */\n    'wrap-xs-wrap-reverse': {\n      flexWrap: 'wrap-reverse'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"center\"`. */\n    'align-items-xs-center': {\n      alignItems: 'center'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"flex-start\"`. */\n    'align-items-xs-flex-start': {\n      alignItems: 'flex-start'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"flex-end\"`. */\n    'align-items-xs-flex-end': {\n      alignItems: 'flex-end'\n    },\n\n    /* Styles applied to the root element if `alignItems=\"baseline\"`. */\n    'align-items-xs-baseline': {\n      alignItems: 'baseline'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"center\"`. */\n    'align-content-xs-center': {\n      alignContent: 'center'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"flex-start\"`. */\n    'align-content-xs-flex-start': {\n      alignContent: 'flex-start'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"flex-end\"`. */\n    'align-content-xs-flex-end': {\n      alignContent: 'flex-end'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"space-between\"`. */\n    'align-content-xs-space-between': {\n      alignContent: 'space-between'\n    },\n\n    /* Styles applied to the root element if `alignContent=\"space-around\"`. */\n    'align-content-xs-space-around': {\n      alignContent: 'space-around'\n    },\n\n    /* Styles applied to the root element if `justify=\"center\"`. */\n    'justify-xs-center': {\n      justifyContent: 'center'\n    },\n\n    /* Styles applied to the root element if `justify=\"flex-end\"`. */\n    'justify-xs-flex-end': {\n      justifyContent: 'flex-end'\n    },\n\n    /* Styles applied to the root element if `justify=\"space-between\"`. */\n    'justify-xs-space-between': {\n      justifyContent: 'space-between'\n    },\n\n    /* Styles applied to the root element if `justify=\"space-around\"`. */\n    'justify-xs-space-around': {\n      justifyContent: 'space-around'\n    },\n\n    /* Styles applied to the root element if `justify=\"space-evenly\"`. */\n    'justify-xs-space-evenly': {\n      justifyContent: 'space-evenly'\n    }\n  }, generateGutter(theme, 'xs'), theme.breakpoints.keys.reduce(function (accumulator, key) {\n    // Use side effect over immutability for better performance.\n    generateGrid(accumulator, theme, key);\n    return accumulator;\n  }, {}));\n};\nvar Grid = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Grid(props, ref) {\n  var _props$alignContent = props.alignContent,\n      alignContent = _props$alignContent === void 0 ? 'stretch' : _props$alignContent,\n      _props$alignItems = props.alignItems,\n      alignItems = _props$alignItems === void 0 ? 'stretch' : _props$alignItems,\n      classes = props.classes,\n      classNameProp = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$container = props.container,\n      container = _props$container === void 0 ? false : _props$container,\n      _props$direction = props.direction,\n      direction = _props$direction === void 0 ? 'row' : _props$direction,\n      _props$item = props.item,\n      item = _props$item === void 0 ? false : _props$item,\n      _props$justify = props.justify,\n      justify = _props$justify === void 0 ? 'flex-start' : _props$justify,\n      _props$lg = props.lg,\n      lg = _props$lg === void 0 ? false : _props$lg,\n      _props$md = props.md,\n      md = _props$md === void 0 ? false : _props$md,\n      _props$sm = props.sm,\n      sm = _props$sm === void 0 ? false : _props$sm,\n      _props$spacing = props.spacing,\n      spacing = _props$spacing === void 0 ? 0 : _props$spacing,\n      _props$wrap = props.wrap,\n      wrap = _props$wrap === void 0 ? 'wrap' : _props$wrap,\n      _props$xl = props.xl,\n      xl = _props$xl === void 0 ? false : _props$xl,\n      _props$xs = props.xs,\n      xs = _props$xs === void 0 ? false : _props$xs,\n      _props$zeroMinWidth = props.zeroMinWidth,\n      zeroMinWidth = _props$zeroMinWidth === void 0 ? false : _props$zeroMinWidth,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"alignContent\", \"alignItems\", \"classes\", \"className\", \"component\", \"container\", \"direction\", \"item\", \"justify\", \"lg\", \"md\", \"sm\", \"spacing\", \"wrap\", \"xl\", \"xs\", \"zeroMinWidth\"]);\n\n  var className = Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classNameProp, container && [classes.container, spacing !== 0 && classes[\"spacing-xs-\".concat(String(spacing))]], item && classes.item, zeroMinWidth && classes.zeroMinWidth, direction !== 'row' && classes[\"direction-xs-\".concat(String(direction))], wrap !== 'wrap' && classes[\"wrap-xs-\".concat(String(wrap))], alignItems !== 'stretch' && classes[\"align-items-xs-\".concat(String(alignItems))], alignContent !== 'stretch' && classes[\"align-content-xs-\".concat(String(alignContent))], justify !== 'flex-start' && classes[\"justify-xs-\".concat(String(justify))], xs !== false && classes[\"grid-xs-\".concat(String(xs))], sm !== false && classes[\"grid-sm-\".concat(String(sm))], md !== false && classes[\"grid-md-\".concat(String(md))], lg !== false && classes[\"grid-lg-\".concat(String(lg))], xl !== false && classes[\"grid-xl-\".concat(String(xl))]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: className,\n    ref: ref\n  }, other));\n});\n true ? Grid.propTypes = {\n  /**\n   * Defines the `align-content` style property.\n   * It's applied for all screen sizes.\n   */\n  alignContent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['stretch', 'center', 'flex-start', 'flex-end', 'space-between', 'space-around']),\n\n  /**\n   * Defines the `align-items` style property.\n   * It's applied for all screen sizes.\n   */\n  alignItems: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['flex-start', 'center', 'flex-end', 'stretch', 'baseline']),\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, the component will have the flex *container* behavior.\n   * You should be wrapping *items* with a *container*.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Defines the `flex-direction` style property.\n   * It is applied for all screen sizes.\n   */\n  direction: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['row', 'row-reverse', 'column', 'column-reverse']),\n\n  /**\n   * If `true`, the component will have the flex *item* behavior.\n   * You should be wrapping *items* with a *container*.\n   */\n  item: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Defines the `justify-content` style property.\n   * It is applied for all screen sizes.\n   */\n  justify: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['flex-start', 'center', 'flex-end', 'space-between', 'space-around', 'space-evenly']),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `lg` breakpoint and wider screens if not overridden.\n   */\n  lg: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `md` breakpoint and wider screens if not overridden.\n   */\n  md: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `sm` breakpoint and wider screens if not overridden.\n   */\n  sm: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the space between the type `item` component.\n   * It can only be used on a type `container` component.\n   */\n  spacing: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(SPACINGS),\n\n  /**\n   * Defines the `flex-wrap` style property.\n   * It's applied for all screen sizes.\n   */\n  wrap: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['nowrap', 'wrap', 'wrap-reverse']),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for the `xl` breakpoint and wider screens.\n   */\n  xl: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * Defines the number of grids the component is going to use.\n   * It's applied for all the screen sizes with the lowest priority.\n   */\n  xs: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf([false, 'auto', true, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),\n\n  /**\n   * If `true`, it sets `min-width: 0` on the item.\n   * Refer to the limitations section of the documentation to better understand the use case.\n   */\n  zeroMinWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\nvar StyledGrid = Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiGrid'\n})(Grid);\n\nif (true) {\n  var requireProp = Object(_utils_requirePropFactory__WEBPACK_IMPORTED_MODULE_6__[\"default\"])('Grid');\n  StyledGrid.propTypes = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, StyledGrid.propTypes, {\n    alignContent: requireProp('container'),\n    alignItems: requireProp('container'),\n    direction: requireProp('container'),\n    justify: requireProp('container'),\n    lg: requireProp('item'),\n    md: requireProp('item'),\n    sm: requireProp('item'),\n    spacing: requireProp('container'),\n    wrap: requireProp('container'),\n    xs: requireProp('item'),\n    zeroMinWidth: requireProp('item')\n  });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (StyledGrid);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js ***!
+  \**********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Grid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Grid */ \"./jaas-client/node_modules/@material-ui/core/esm/Grid/Grid.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Grid__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js ***!
+  \*********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_transition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-transition-group */ \"./jaas-client/node_modules/react-transition-group/esm/index.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n/* harmony import */ var _transitions_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../transitions/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\n\n\n\nfunction getScale(value) {\n  return \"scale(\".concat(value, \", \").concat(Math.pow(value, 2), \")\");\n}\n\nvar styles = {\n  entering: {\n    opacity: 1,\n    transform: getScale(1)\n  },\n  entered: {\n    opacity: 1,\n    transform: 'none'\n  }\n};\n/**\n * The Grow transition is used by the [Tooltip](/components/tooltips/) and\n * [Popover](/components/popover/) components.\n * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.\n */\n\nvar Grow = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function Grow(props, ref) {\n  var children = props.children,\n      _props$disableStrictM = props.disableStrictModeCompat,\n      disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM,\n      inProp = props.in,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      style = props.style,\n      _props$timeout = props.timeout,\n      timeout = _props$timeout === void 0 ? 'auto' : _props$timeout,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? react_transition_group__WEBPACK_IMPORTED_MODULE_5__[\"Transition\"] : _props$TransitionComp,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"children\", \"disableStrictModeCompat\", \"in\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"style\", \"timeout\", \"TransitionComponent\"]);\n\n  var timer = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n  var autoTimeout = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat;\n  var nodeRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](null);\n  var foreignRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(children.ref, ref);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(enableStrictModeCompat ? nodeRef : undefined, foreignRef);\n\n  var normalizedTransitionCallback = function normalizedTransitionCallback(callback) {\n    return function (nodeOrAppearing, maybeAppearing) {\n      if (callback) {\n        var _ref = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing],\n            _ref2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, 2),\n            node = _ref2[0],\n            isAppearing = _ref2[1]; // onEnterXxx and onExitXxx callbacks have a different arguments.length value.\n\n\n        if (isAppearing === undefined) {\n          callback(node);\n        } else {\n          callback(node, isAppearing);\n        }\n      }\n    };\n  };\n\n  var handleEntering = normalizedTransitionCallback(onEntering);\n  var handleEnter = normalizedTransitionCallback(function (node, isAppearing) {\n    Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_7__[\"reflow\"])(node); // So the animation always start from the start.\n\n    var _getTransitionProps = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_7__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'enter'\n    }),\n        transitionDuration = _getTransitionProps.duration,\n        delay = _getTransitionProps.delay;\n\n    var duration;\n\n    if (timeout === 'auto') {\n      duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n      autoTimeout.current = duration;\n    } else {\n      duration = transitionDuration;\n    }\n\n    node.style.transition = [theme.transitions.create('opacity', {\n      duration: duration,\n      delay: delay\n    }), theme.transitions.create('transform', {\n      duration: duration * 0.666,\n      delay: delay\n    })].join(',');\n\n    if (onEnter) {\n      onEnter(node, isAppearing);\n    }\n  });\n  var handleEntered = normalizedTransitionCallback(onEntered);\n  var handleExiting = normalizedTransitionCallback(onExiting);\n  var handleExit = normalizedTransitionCallback(function (node) {\n    var _getTransitionProps2 = Object(_transitions_utils__WEBPACK_IMPORTED_MODULE_7__[\"getTransitionProps\"])({\n      style: style,\n      timeout: timeout\n    }, {\n      mode: 'exit'\n    }),\n        transitionDuration = _getTransitionProps2.duration,\n        delay = _getTransitionProps2.delay;\n\n    var duration;\n\n    if (timeout === 'auto') {\n      duration = theme.transitions.getAutoHeightDuration(node.clientHeight);\n      autoTimeout.current = duration;\n    } else {\n      duration = transitionDuration;\n    }\n\n    node.style.transition = [theme.transitions.create('opacity', {\n      duration: duration,\n      delay: delay\n    }), theme.transitions.create('transform', {\n      duration: duration * 0.666,\n      delay: delay || duration * 0.333\n    })].join(',');\n    node.style.opacity = '0';\n    node.style.transform = getScale(0.75);\n\n    if (onExit) {\n      onExit(node);\n    }\n  });\n  var handleExited = normalizedTransitionCallback(onExited);\n\n  var addEndListener = function addEndListener(nodeOrNext, maybeNext) {\n    var next = enableStrictModeCompat ? nodeOrNext : maybeNext;\n\n    if (timeout === 'auto') {\n      timer.current = setTimeout(next, autoTimeout.current || 0);\n    }\n  };\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    return function () {\n      clearTimeout(timer.current);\n    };\n  }, []);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: inProp,\n    nodeRef: enableStrictModeCompat ? nodeRef : undefined,\n    onEnter: handleEnter,\n    onEntered: handleEntered,\n    onEntering: handleEntering,\n    onExit: handleExit,\n    onExited: handleExited,\n    onExiting: handleExiting,\n    addEndListener: addEndListener,\n    timeout: timeout === 'auto' ? null : timeout\n  }, other), function (state, childProps) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"cloneElement\"](children, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        opacity: 0,\n        transform: getScale(0.75),\n        visibility: state === 'exited' && !inProp ? 'hidden' : undefined\n      }, styles[state], style, children.props.style),\n      ref: handleRef\n    }, childProps));\n  });\n});\n true ? Grow.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A single child content element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.element,\n\n  /**\n   * Enable this prop if you encounter 'Function components cannot be given refs',\n   * use `unstable_createStrictModeTheme`,\n   * and can't forward the ref in the child component.\n   */\n  disableStrictModeCompat: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, show the component; triggers the enter or exit animation.\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * The duration for the transition, in milliseconds.\n   * You may specify a single timeout for all transitions, or individually with an object.\n   *\n   * Set to 'auto' to automatically calculate transition time based on height.\n   */\n  timeout: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['auto']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })])\n} : undefined;\nGrow.muiSupportAuto = true;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Grow);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js ***!
+  \**********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Grow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Grow */ \"./jaas-client/node_modules/@material-ui/core/esm/Grow/Grow.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Grow__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js ***!
+  \*********************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      textAlign: 'center',\n      flex: '0 0 auto',\n      fontSize: theme.typography.pxToRem(24),\n      padding: 12,\n      borderRadius: '50%',\n      overflow: 'visible',\n      // Explicitly set the default value to solve a bug on IE 11.\n      color: theme.palette.action.active,\n      transition: theme.transitions.create('background-color', {\n        duration: theme.transitions.duration.shortest\n      }),\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__[\"fade\"])(theme.palette.action.active, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      },\n      '&$disabled': {\n        backgroundColor: 'transparent',\n        color: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the root element if `edge=\"start\"`. */\n    edgeStart: {\n      marginLeft: -12,\n      '$sizeSmall&': {\n        marginLeft: -3\n      }\n    },\n\n    /* Styles applied to the root element if `edge=\"end\"`. */\n    edgeEnd: {\n      marginRight: -12,\n      '$sizeSmall&': {\n        marginRight: -3\n      }\n    },\n\n    /* Styles applied to the root element if `color=\"inherit\"`. */\n    colorInherit: {\n      color: 'inherit'\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__[\"fade\"])(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main,\n      '&:hover': {\n        backgroundColor: Object(_styles_colorManipulator__WEBPACK_IMPORTED_MODULE_7__[\"fade\"])(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `size=\"small\"`. */\n    sizeSmall: {\n      padding: 3,\n      fontSize: theme.typography.pxToRem(18)\n    },\n\n    /* Styles applied to the children container element. */\n    label: {\n      width: '100%',\n      display: 'flex',\n      alignItems: 'inherit',\n      justifyContent: 'inherit'\n    }\n  };\n};\n/**\n * Refer to the [Icons](/components/icons/) section of the documentation\n * regarding the available icon options.\n */\n\nvar IconButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function IconButton(props, ref) {\n  var _props$edge = props.edge,\n      edge = _props$edge === void 0 ? false : _props$edge,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'default' : _props$color,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableFocusRi = props.disableFocusRipple,\n      disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 'medium' : _props$size,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"edge\", \"children\", \"classes\", \"className\", \"color\", \"disabled\", \"disableFocusRipple\", \"size\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_ButtonBase__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, color !== 'default' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(color))], disabled && classes.disabled, size === \"small\" && classes[\"size\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(size))], {\n      'start': classes.edgeStart,\n      'end': classes.edgeEnd\n    }[edge]),\n    centerRipple: true,\n    focusRipple: !disableFocusRipple,\n    disabled: disabled,\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"span\", {\n    className: classes.label\n  }, children));\n});\n true ? IconButton.propTypes = {\n  /**\n   * The icon element.\n   */\n  children: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, function (props) {\n    var found = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].toArray(props.children).some(function (child) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"isValidElement\"](child) && child.props.onClick;\n    });\n\n    if (found) {\n      return new Error(['Material-UI: You are providing an onClick event listener ' + 'to a child of a button element.', 'Firefox will never trigger the event.', 'You should move the onClick listener to the parent button element.', 'https://github.com/mui-org/material-ui/issues/13957'].join('\\n'));\n    }\n\n    return null;\n  }),\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'inherit', 'primary', 'secondary']),\n\n  /**\n   * If `true`, the button will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the  keyboard focus ripple will be disabled.\n   */\n  disableFocusRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the ripple effect will be disabled.\n   */\n  disableRipple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If given, uses a negative margin to counteract the padding on one\n   * side (this is often helpful for aligning the left or right\n   * side of the icon with content above or below, without ruining the border\n   * size and shape).\n   */\n  edge: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['start', 'end', false]),\n\n  /**\n   * The size of the button.\n   * `small` is equivalent to the dense button styling.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['small', 'medium'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiIconButton'\n})(IconButton));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IconButton */ \"./jaas-client/node_modules/@material-ui/core/esm/IconButton/IconButton.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _IconButton__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js ***!
+  \***********************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var light = theme.palette.type === 'light';\n  var bottomLineColor = light ? 'rgba(0, 0, 0, 0.42)' : 'rgba(255, 255, 255, 0.7)';\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative'\n    },\n\n    /* Styles applied to the root element if the component is a descendant of `FormControl`. */\n    formControl: {\n      'label + &': {\n        marginTop: 16\n      }\n    },\n\n    /* Styles applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Styles applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if color secondary. */\n    colorSecondary: {\n      '&$underline:after': {\n        borderBottomColor: theme.palette.secondary.main\n      }\n    },\n\n    /* Styles applied to the root element if `disableUnderline={false}`. */\n    underline: {\n      '&:after': {\n        borderBottom: \"2px solid \".concat(theme.palette.primary.main),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\"',\n        position: 'absolute',\n        right: 0,\n        transform: 'scaleX(0)',\n        transition: theme.transitions.create('transform', {\n          duration: theme.transitions.duration.shorter,\n          easing: theme.transitions.easing.easeOut\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&$focused:after': {\n        transform: 'scaleX(1)'\n      },\n      '&$error:after': {\n        borderBottomColor: theme.palette.error.main,\n        transform: 'scaleX(1)' // error is always underlined in red\n\n      },\n      '&:before': {\n        borderBottom: \"1px solid \".concat(bottomLineColor),\n        left: 0,\n        bottom: 0,\n        // Doing the other way around crash on IE 11 \"''\" https://github.com/cssinjs/jss/issues/242\n        content: '\"\\\\00a0\"',\n        position: 'absolute',\n        right: 0,\n        transition: theme.transitions.create('border-bottom-color', {\n          duration: theme.transitions.duration.shorter\n        }),\n        pointerEvents: 'none' // Transparent to the hover style.\n\n      },\n      '&:hover:not($disabled):before': {\n        borderBottom: \"2px solid \".concat(theme.palette.text.primary),\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          borderBottom: \"1px solid \".concat(bottomLineColor)\n        }\n      },\n      '&$disabled:before': {\n        borderBottomStyle: 'dotted'\n      }\n    },\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {},\n\n    /* Styles applied to the root element if `fullWidth={true}`. */\n    fullWidth: {},\n\n    /* Styles applied to the `input` element. */\n    input: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {},\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {},\n\n    /* Styles applied to the `input` element if `type=\"search\"`. */\n    inputTypeSearch: {}\n  };\n};\nvar Input = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Input(props, ref) {\n  var disableUnderline = props.disableUnderline,\n      classes = props.classes,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"disableUnderline\", \"classes\", \"fullWidth\", \"inputComponent\", \"multiline\", \"type\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, classes, {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, !disableUnderline && classes.underline),\n      underline: null\n    }),\n    fullWidth: fullWidth,\n    inputComponent: inputComponent,\n    multiline: multiline,\n    ref: ref,\n    type: type\n  }, other));\n});\n true ? Input.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will not have an underline.\n   */\n  disableUnderline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\nInput.muiName = 'Input';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiInput'\n})(Input));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Input/index.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Input/index.js ***!
+  \***********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/Input.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Input__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Input/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js ***!
+  \*******************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_FormControlContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/FormControlContext */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/FormControlContext.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _TextareaAutosize__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../TextareaAutosize */ \"./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utils */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js\");\n\n\n\n\n/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var light = theme.palette.type === 'light';\n  var placeholder = {\n    color: 'currentColor',\n    opacity: light ? 0.42 : 0.5,\n    transition: theme.transitions.create('opacity', {\n      duration: theme.transitions.duration.shorter\n    })\n  };\n  var placeholderHidden = {\n    opacity: '0 !important'\n  };\n  var placeholderVisible = {\n    opacity: light ? 0.42 : 0.5\n  };\n  return {\n    '@global': {\n      '@keyframes mui-auto-fill': {},\n      '@keyframes mui-auto-fill-cancel': {}\n    },\n\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, theme.typography.body1, {\n      color: theme.palette.text.primary,\n      lineHeight: '1.1876em',\n      // Reset (19px), match the native input line-height\n      boxSizing: 'border-box',\n      // Prevent padding issue with fullWidth.\n      position: 'relative',\n      cursor: 'text',\n      display: 'inline-flex',\n      alignItems: 'center',\n      '&$disabled': {\n        color: theme.palette.text.disabled,\n        cursor: 'default'\n      }\n    }),\n\n    /* Styles applied to the root element if the component is a descendant of `FormControl`. */\n    formControl: {},\n\n    /* Styles applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Styles applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `startAdornment` is provided. */\n    adornedStart: {},\n\n    /* Styles applied to the root element if `endAdornment` is provided. */\n    adornedEnd: {},\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {\n      padding: \"\".concat(8 - 2, \"px 0 \").concat(8 - 1, \"px\"),\n      '&$marginDense': {\n        paddingTop: 4 - 1\n      }\n    },\n\n    /* Styles applied to the root element if the color is secondary. */\n    colorSecondary: {},\n\n    /* Styles applied to the root element if `fullWidth={true}`. */\n    fullWidth: {\n      width: '100%'\n    },\n\n    /* Styles applied to the `input` element. */\n    input: {\n      font: 'inherit',\n      letterSpacing: 'inherit',\n      color: 'currentColor',\n      padding: \"\".concat(8 - 2, \"px 0 \").concat(8 - 1, \"px\"),\n      border: 0,\n      boxSizing: 'content-box',\n      background: 'none',\n      height: '1.1876em',\n      // Reset (19px), match the native input line-height\n      margin: 0,\n      // Reset for Safari\n      WebkitTapHighlightColor: 'transparent',\n      display: 'block',\n      // Make the flex item shrink with Firefox\n      minWidth: 0,\n      width: '100%',\n      // Fix IE 11 width issue\n      animationName: 'mui-auto-fill-cancel',\n      animationDuration: '10ms',\n      '&::-webkit-input-placeholder': placeholder,\n      '&::-moz-placeholder': placeholder,\n      // Firefox 19+\n      '&:-ms-input-placeholder': placeholder,\n      // IE 11\n      '&::-ms-input-placeholder': placeholder,\n      // Edge\n      '&:focus': {\n        outline: 0\n      },\n      // Reset Firefox invalid required input style\n      '&:invalid': {\n        boxShadow: 'none'\n      },\n      '&::-webkit-search-decoration': {\n        // Remove the padding when type=search.\n        '-webkit-appearance': 'none'\n      },\n      // Show and hide the placeholder logic\n      'label[data-shrink=false] + $formControl &': {\n        '&::-webkit-input-placeholder': placeholderHidden,\n        '&::-moz-placeholder': placeholderHidden,\n        // Firefox 19+\n        '&:-ms-input-placeholder': placeholderHidden,\n        // IE 11\n        '&::-ms-input-placeholder': placeholderHidden,\n        // Edge\n        '&:focus::-webkit-input-placeholder': placeholderVisible,\n        '&:focus::-moz-placeholder': placeholderVisible,\n        // Firefox 19+\n        '&:focus:-ms-input-placeholder': placeholderVisible,\n        // IE 11\n        '&:focus::-ms-input-placeholder': placeholderVisible // Edge\n\n      },\n      '&$disabled': {\n        opacity: 1 // Reset iOS opacity\n\n      },\n      '&:-webkit-autofill': {\n        animationDuration: '5000s',\n        animationName: 'mui-auto-fill'\n      }\n    },\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {\n      paddingTop: 4 - 1\n    },\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {\n      height: 'auto',\n      resize: 'none',\n      padding: 0\n    },\n\n    /* Styles applied to the `input` element if `type=\"search\"`. */\n    inputTypeSearch: {\n      // Improve type search style.\n      '-moz-appearance': 'textfield',\n      '-webkit-appearance': 'textfield'\n    },\n\n    /* Styles applied to the `input` element if `startAdornment` is provided. */\n    inputAdornedStart: {},\n\n    /* Styles applied to the `input` element if `endAdornment` is provided. */\n    inputAdornedEnd: {},\n\n    /* Styles applied to the `input` element if `hiddenLabel={true}`. */\n    inputHiddenLabel: {}\n  };\n};\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_3__[\"useLayoutEffect\"];\n/**\n * `InputBase` contains as few styles as possible.\n * It aims to be a simple building block for creating an input.\n * It contains a load of style reset and some state logic.\n */\n\nvar InputBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function InputBase(props, ref) {\n  var ariaDescribedby = props['aria-describedby'],\n      autoComplete = props.autoComplete,\n      autoFocus = props.autoFocus,\n      classes = props.classes,\n      className = props.className,\n      color = props.color,\n      defaultValue = props.defaultValue,\n      disabled = props.disabled,\n      endAdornment = props.endAdornment,\n      error = props.error,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      id = props.id,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      _props$inputProps = props.inputProps,\n      inputPropsProp = _props$inputProps === void 0 ? {} : _props$inputProps,\n      inputRefProp = props.inputRef,\n      margin = props.margin,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onClick = props.onClick,\n      onFocus = props.onFocus,\n      onKeyDown = props.onKeyDown,\n      onKeyUp = props.onKeyUp,\n      placeholder = props.placeholder,\n      readOnly = props.readOnly,\n      renderSuffix = props.renderSuffix,\n      rows = props.rows,\n      rowsMax = props.rowsMax,\n      rowsMin = props.rowsMin,\n      startAdornment = props.startAdornment,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      valueProp = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"aria-describedby\", \"autoComplete\", \"autoFocus\", \"classes\", \"className\", \"color\", \"defaultValue\", \"disabled\", \"endAdornment\", \"error\", \"fullWidth\", \"id\", \"inputComponent\", \"inputProps\", \"inputRef\", \"margin\", \"multiline\", \"name\", \"onBlur\", \"onChange\", \"onClick\", \"onFocus\", \"onKeyDown\", \"onKeyUp\", \"placeholder\", \"readOnly\", \"renderSuffix\", \"rows\", \"rowsMax\", \"rowsMin\", \"startAdornment\", \"type\", \"value\"]);\n\n  var value = inputPropsProp.value != null ? inputPropsProp.value : valueProp;\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"](value != null),\n      isControlled = _React$useRef.current;\n\n  var inputRef = react__WEBPACK_IMPORTED_MODULE_3__[\"useRef\"]();\n  var handleInputRefWarning = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (instance) {\n    if (true) {\n      if (instance && instance.nodeName !== 'INPUT' && !instance.focus) {\n        console.error(['Material-UI: You have provided a `inputComponent` to the input component', 'that does not correctly handle the `inputRef` prop.', 'Make sure the `inputRef` prop is called with a HTMLInputElement.'].join('\\n'));\n      }\n    }\n  }, []);\n  var handleInputPropsRefProp = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(inputPropsProp.ref, handleInputRefWarning);\n  var handleInputRefProp = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(inputRefProp, handleInputPropsRefProp);\n  var handleInputRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(inputRef, handleInputRefProp);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_3__[\"useState\"](false),\n      focused = _React$useState[0],\n      setFocused = _React$useState[1];\n\n  var muiFormControl = Object(_FormControl_FormControlContext__WEBPACK_IMPORTED_MODULE_7__[\"useFormControl\"])();\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n      if (muiFormControl) {\n        return muiFormControl.registerEffect();\n      }\n\n      return undefined;\n    }, [muiFormControl]);\n  }\n\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['color', 'disabled', 'error', 'hiddenLabel', 'margin', 'required', 'filled']\n  });\n  fcs.focused = muiFormControl ? muiFormControl.focused : focused; // The blur won't fire when the disabled state is set on a focused input.\n  // We need to book keep the focused state manually.\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    if (!muiFormControl && disabled && focused) {\n      setFocused(false);\n\n      if (onBlur) {\n        onBlur();\n      }\n    }\n  }, [muiFormControl, disabled, focused, onBlur]);\n  var onFilled = muiFormControl && muiFormControl.onFilled;\n  var onEmpty = muiFormControl && muiFormControl.onEmpty;\n  var checkDirty = react__WEBPACK_IMPORTED_MODULE_3__[\"useCallback\"](function (obj) {\n    if (Object(_utils__WEBPACK_IMPORTED_MODULE_12__[\"isFilled\"])(obj)) {\n      if (onFilled) {\n        onFilled();\n      }\n    } else if (onEmpty) {\n      onEmpty();\n    }\n  }, [onFilled, onEmpty]);\n  useEnhancedEffect(function () {\n    if (isControlled) {\n      checkDirty({\n        value: value\n      });\n    }\n  }, [value, checkDirty, isControlled]);\n\n  var handleFocus = function handleFocus(event) {\n    // Fix a bug with IE 11 where the focus/blur events are triggered\n    // while the input is disabled.\n    if (fcs.disabled) {\n      event.stopPropagation();\n      return;\n    }\n\n    if (onFocus) {\n      onFocus(event);\n    }\n\n    if (inputPropsProp.onFocus) {\n      inputPropsProp.onFocus(event);\n    }\n\n    if (muiFormControl && muiFormControl.onFocus) {\n      muiFormControl.onFocus(event);\n    } else {\n      setFocused(true);\n    }\n  };\n\n  var handleBlur = function handleBlur(event) {\n    if (onBlur) {\n      onBlur(event);\n    }\n\n    if (inputPropsProp.onBlur) {\n      inputPropsProp.onBlur(event);\n    }\n\n    if (muiFormControl && muiFormControl.onBlur) {\n      muiFormControl.onBlur(event);\n    } else {\n      setFocused(false);\n    }\n  };\n\n  var handleChange = function handleChange(event) {\n    if (!isControlled) {\n      var element = event.target || inputRef.current;\n\n      if (element == null) {\n        throw new Error( true ? \"Material-UI: Expected valid input target. Did you use a custom `inputComponent` and forget to forward refs? See https://material-ui.com/r/input-component-ref-interface for more info.\" : undefined);\n      }\n\n      checkDirty({\n        value: element.value\n      });\n    }\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    if (inputPropsProp.onChange) {\n      inputPropsProp.onChange.apply(inputPropsProp, [event].concat(args));\n    } // Perform in the willUpdate\n\n\n    if (onChange) {\n      onChange.apply(void 0, [event].concat(args));\n    }\n  }; // Check the input state on mount, in case it was filled by the user\n  // or auto filled by the browser before the hydration (for SSR).\n\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    checkDirty(inputRef.current);\n  }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n  var handleClick = function handleClick(event) {\n    if (inputRef.current && event.currentTarget === event.target) {\n      inputRef.current.focus();\n    }\n\n    if (onClick) {\n      onClick(event);\n    }\n  };\n\n  var InputComponent = inputComponent;\n\n  var inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, inputPropsProp, {\n    ref: handleInputRef\n  });\n\n  if (typeof InputComponent !== 'string') {\n    inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      // Rename ref to inputRef as we don't know the\n      // provided `inputComponent` structure.\n      inputRef: handleInputRef,\n      type: type\n    }, inputProps, {\n      ref: null\n    });\n  } else if (multiline) {\n    if (rows && !rowsMax && !rowsMin) {\n      InputComponent = 'textarea';\n    } else {\n      inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        rows: rows,\n        rowsMax: rowsMax\n      }, inputProps);\n      InputComponent = _TextareaAutosize__WEBPACK_IMPORTED_MODULE_11__[\"default\"];\n    }\n  } else {\n    inputProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      type: type\n    }, inputProps);\n  }\n\n  var handleAutoFill = function handleAutoFill(event) {\n    // Provide a fake value as Chrome might not let you access it for security reasons.\n    checkDirty(event.animationName === 'mui-auto-fill-cancel' ? inputRef.current : {\n      value: 'x'\n    });\n  };\n\n  react__WEBPACK_IMPORTED_MODULE_3__[\"useEffect\"](function () {\n    if (muiFormControl) {\n      muiFormControl.setAdornedStart(Boolean(startAdornment));\n    }\n  }, [muiFormControl, startAdornment]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(fcs.color || 'primary'))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fullWidth && classes.fullWidth, fcs.focused && classes.focused, muiFormControl && classes.formControl, multiline && classes.multiline, startAdornment && classes.adornedStart, endAdornment && classes.adornedEnd, fcs.margin === 'dense' && classes.marginDense),\n    onClick: handleClick,\n    ref: ref\n  }, other), startAdornment, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_FormControl_FormControlContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"].Provider, {\n    value: null\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](InputComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    \"aria-invalid\": fcs.error,\n    \"aria-describedby\": ariaDescribedby,\n    autoComplete: autoComplete,\n    autoFocus: autoFocus,\n    defaultValue: defaultValue,\n    disabled: fcs.disabled,\n    id: id,\n    onAnimationStart: handleAutoFill,\n    name: name,\n    placeholder: placeholder,\n    readOnly: readOnly,\n    required: fcs.required,\n    rows: rows,\n    value: value,\n    onKeyDown: onKeyDown,\n    onKeyUp: onKeyUp\n  }, inputProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.input, inputPropsProp.className, fcs.disabled && classes.disabled, multiline && classes.inputMultiline, fcs.hiddenLabel && classes.inputHiddenLabel, startAdornment && classes.inputAdornedStart, endAdornment && classes.inputAdornedEnd, type === 'search' && classes.inputTypeSearch, fcs.margin === 'dense' && classes.inputMarginDense),\n    onBlur: handleBlur,\n    onChange: handleChange,\n    onFocus: handleFocus\n  }))), endAdornment, renderSuffix ? renderSuffix(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, fcs, {\n    startAdornment: startAdornment\n  })) : null);\n});\n true ? InputBase.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * @ignore\n   */\n  'aria-describedby': prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"refType\"],\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * Callback fired when the input is blurred.\n   *\n   * Notice that the first argument (event) might be undefined.\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onKeyUp: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  renderSuffix: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * Minimum number of rows to display when multiline option is set to true.\n   */\n  rowsMin: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiInputBase'\n})(InputBase));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/InputBase.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _InputBase__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js ***!
+  \***************************************************************************/
+/*! exports provided: hasValue, isFilled, isAdornedStart */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasValue\", function() { return hasValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFilled\", function() { return isFilled; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isAdornedStart\", function() { return isAdornedStart; });\n// Supports determination of isControlled().\n// Controlled input accepts its current value as a prop.\n//\n// @see https://facebook.github.io/react/docs/forms.html#controlled-components\n// @param value\n// @returns {boolean} true if string (including '') or number (including zero)\nfunction hasValue(value) {\n  return value != null && !(Array.isArray(value) && value.length === 0);\n} // Determine if field is empty or filled.\n// Response determines if label is presented above field or as placeholder.\n//\n// @param obj\n// @param SSR\n// @returns {boolean} False when not present or empty string.\n//                    True when any number or string with length.\n\nfunction isFilled(obj) {\n  var SSR = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n  return obj && (hasValue(obj.value) && obj.value !== '' || SSR && hasValue(obj.defaultValue) && obj.defaultValue !== '');\n} // Determine if an Input is adorned on start.\n// It's corresponding to the left with LTR.\n//\n// @param obj\n// @returns {boolean} False when no adornments.\n//                    True when adorned at the start.\n\nfunction isAdornedStart(obj) {\n  return obj.startAdornment;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js ***!
+  \*********************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _FormLabel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../FormLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormLabel/index.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      display: 'block',\n      transformOrigin: 'top left'\n    },\n\n    /* Pseudo-class applied to the root element if `focused={true}`. */\n    focused: {},\n\n    /* Pseudo-class applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Pseudo-class applied to the root element if `required={true}`. */\n    required: {},\n\n    /* Pseudo-class applied to the asterisk element. */\n    asterisk: {},\n\n    /* Styles applied to the root element if the component is a descendant of `FormControl`. */\n    formControl: {\n      position: 'absolute',\n      left: 0,\n      top: 0,\n      // slight alteration to spec spacing to match visual spec result\n      transform: 'translate(0, 24px) scale(1)'\n    },\n\n    /* Styles applied to the root element if `margin=\"dense\"`. */\n    marginDense: {\n      // Compensation for the `Input.inputDense` style.\n      transform: 'translate(0, 21px) scale(1)'\n    },\n\n    /* Styles applied to the `input` element if `shrink={true}`. */\n    shrink: {\n      transform: 'translate(0, 1.5px) scale(0.75)',\n      transformOrigin: 'top left'\n    },\n\n    /* Styles applied to the `input` element if `disableAnimation={false}`. */\n    animated: {\n      transition: theme.transitions.create(['color', 'transform'], {\n        duration: theme.transitions.duration.shorter,\n        easing: theme.transitions.easing.easeOut\n      })\n    },\n\n    /* Styles applied to the root element if `variant=\"filled\"`. */\n    filled: {\n      // Chrome's autofill feature gives the input field a yellow background.\n      // Since the input field is behind the label in the HTML tree,\n      // the input field is drawn last and hides the label with an opaque background color.\n      // zIndex: 1 will raise the label above opaque background-colors of input.\n      zIndex: 1,\n      pointerEvents: 'none',\n      transform: 'translate(12px, 20px) scale(1)',\n      '&$marginDense': {\n        transform: 'translate(12px, 17px) scale(1)'\n      },\n      '&$shrink': {\n        transform: 'translate(12px, 10px) scale(0.75)',\n        '&$marginDense': {\n          transform: 'translate(12px, 7px) scale(0.75)'\n        }\n      }\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"`. */\n    outlined: {\n      // see comment above on filled.zIndex\n      zIndex: 1,\n      pointerEvents: 'none',\n      transform: 'translate(14px, 20px) scale(1)',\n      '&$marginDense': {\n        transform: 'translate(14px, 12px) scale(1)'\n      },\n      '&$shrink': {\n        transform: 'translate(14px, -6px) scale(0.75)'\n      }\n    }\n  };\n};\nvar InputLabel = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function InputLabel(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$disableAnimati = props.disableAnimation,\n      disableAnimation = _props$disableAnimati === void 0 ? false : _props$disableAnimati,\n      margin = props.margin,\n      shrinkProp = props.shrink,\n      variant = props.variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"disableAnimation\", \"margin\", \"shrink\", \"variant\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n  var shrink = shrinkProp;\n\n  if (typeof shrink === 'undefined' && muiFormControl) {\n    shrink = muiFormControl.filled || muiFormControl.focused || muiFormControl.adornedStart;\n  }\n\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_5__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['margin', 'variant']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormLabel__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"data-shrink\": shrink,\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, muiFormControl && classes.formControl, !disableAnimation && classes.animated, shrink && classes.shrink, fcs.margin === 'dense' && classes.marginDense, {\n      'filled': classes.filled,\n      'outlined': classes.outlined\n    }[fcs.variant]),\n    classes: {\n      focused: classes.focused,\n      disabled: classes.disabled,\n      error: classes.error,\n      required: classes.required,\n      asterisk: classes.asterisk\n    },\n    ref: ref\n  }, other));\n});\n true ? InputLabel.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The contents of the `InputLabel`.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * If `true`, the transition animation is disabled.\n   */\n  disableAnimation: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, apply disabled class.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input of this label is focused.\n   */\n  focused: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense']),\n\n  /**\n   * if `true`, the label will indicate that the input is required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label is shrunk.\n   */\n  shrink: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiInputLabel'\n})(InputLabel));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _InputLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./InputLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/InputLabel/InputLabel.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _InputLabel__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js ***!
+  \*********************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/useIsFocusVisible */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {},\n\n  /* Styles applied to the root element if `underline=\"none\"`. */\n  underlineNone: {\n    textDecoration: 'none'\n  },\n\n  /* Styles applied to the root element if `underline=\"hover\"`. */\n  underlineHover: {\n    textDecoration: 'none',\n    '&:hover': {\n      textDecoration: 'underline'\n    }\n  },\n\n  /* Styles applied to the root element if `underline=\"always\"`. */\n  underlineAlways: {\n    textDecoration: 'underline'\n  },\n  // Same reset as ButtonBase.root\n\n  /* Styles applied to the root element if `component=\"button\"`. */\n  button: {\n    position: 'relative',\n    WebkitTapHighlightColor: 'transparent',\n    backgroundColor: 'transparent',\n    // Reset default value\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0,\n    border: 0,\n    margin: 0,\n    // Remove the margin in Safari\n    borderRadius: 0,\n    padding: 0,\n    // Remove the padding in Firefox\n    cursor: 'pointer',\n    userSelect: 'none',\n    verticalAlign: 'middle',\n    '-moz-appearance': 'none',\n    // Reset\n    '-webkit-appearance': 'none',\n    // Reset\n    '&::-moz-focus-inner': {\n      borderStyle: 'none' // Remove Firefox dotted outline.\n\n    },\n    '&$focusVisible': {\n      outline: 'auto'\n    }\n  },\n\n  /* Pseudo-class applied to the root element if the link is keyboard focused. */\n  focusVisible: {}\n};\nvar Link = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Link(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'a' : _props$component,\n      onBlur = props.onBlur,\n      onFocus = props.onFocus,\n      TypographyClasses = props.TypographyClasses,\n      _props$underline = props.underline,\n      underline = _props$underline === void 0 ? 'hover' : _props$underline,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'inherit' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"color\", \"component\", \"onBlur\", \"onFocus\", \"TypographyClasses\", \"underline\", \"variant\"]);\n\n  var _useIsFocusVisible = Object(_utils_useIsFocusVisible__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(),\n      isFocusVisible = _useIsFocusVisible.isFocusVisible,\n      onBlurVisible = _useIsFocusVisible.onBlurVisible,\n      focusVisibleRef = _useIsFocusVisible.ref;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](false),\n      focusVisible = _React$useState[0],\n      setFocusVisible = _React$useState[1];\n\n  var handlerRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(ref, focusVisibleRef);\n\n  var handleBlur = function handleBlur(event) {\n    if (focusVisible) {\n      onBlurVisible();\n      setFocusVisible(false);\n    }\n\n    if (onBlur) {\n      onBlur(event);\n    }\n  };\n\n  var handleFocus = function handleFocus(event) {\n    if (isFocusVisible(event)) {\n      setFocusVisible(true);\n    }\n\n    if (onFocus) {\n      onFocus(event);\n    }\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Typography__WEBPACK_IMPORTED_MODULE_10__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes[\"underline\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(underline))], className, focusVisible && classes.focusVisible, component === 'button' && classes.button),\n    classes: TypographyClasses,\n    color: color,\n    component: component,\n    onBlur: handleBlur,\n    onFocus: handleFocus,\n    ref: handlerRef,\n    variant: variant\n  }, other));\n});\n true ? Link.propTypes = {\n  /**\n   * The content of the link.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node.isRequired,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the link.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['initial', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary', 'error']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: _material_ui_utils__WEBPACK_IMPORTED_MODULE_7__[\"elementTypeAcceptingRef\"],\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * `classes` prop applied to the [`Typography`](/api/typography/) element.\n   */\n  TypographyClasses: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Controls when the link should have an underline.\n   */\n  underline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['none', 'hover', 'always']),\n\n  /**\n   * Applies the theme typography styles.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiLink'\n})(Link));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Link/index.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Link/index.js ***!
+  \**********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Link__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Link */ \"./jaas-client/node_modules/@material-ui/core/esm/Link/Link.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Link__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Link/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/List/List.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/List/List.js ***!
+  \*********************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _ListContext__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ListContext */ \"./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js\");\n\n\n\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    listStyle: 'none',\n    margin: 0,\n    padding: 0,\n    position: 'relative'\n  },\n\n  /* Styles applied to the root element if `disablePadding={false}`. */\n  padding: {\n    paddingTop: 8,\n    paddingBottom: 8\n  },\n\n  /* Styles applied to the root element if dense. */\n  dense: {},\n\n  /* Styles applied to the root element if a `subheader` is provided. */\n  subheader: {\n    paddingTop: 0\n  }\n};\nvar List = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function List(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'ul' : _props$component,\n      _props$dense = props.dense,\n      dense = _props$dense === void 0 ? false : _props$dense,\n      _props$disablePadding = props.disablePadding,\n      disablePadding = _props$disablePadding === void 0 ? false : _props$disablePadding,\n      subheader = props.subheader,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"component\", \"dense\", \"disablePadding\", \"subheader\"]);\n\n  var context = react__WEBPACK_IMPORTED_MODULE_2__[\"useMemo\"](function () {\n    return {\n      dense: dense\n    };\n  }, [dense]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_ListContext__WEBPACK_IMPORTED_MODULE_6__[\"default\"].Provider, {\n    value: context\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, dense && classes.dense, !disablePadding && classes.padding, subheader && classes.subheader),\n    ref: ref\n  }, other), subheader, children));\n});\n true ? List.propTypes = {\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, compact vertical padding designed for keyboard and mouse input will be used for\n   * the list and list items.\n   * The prop is available to descendant components as the `dense` context.\n   */\n  dense: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, vertical padding will be removed from the list.\n   */\n  disablePadding: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The content of the subheader, normally `ListSubheader`.\n   */\n  subheader: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiList'\n})(List));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/List/List.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * @ignore - internal component.\n */\n\nvar ListContext = react__WEBPACK_IMPORTED_MODULE_0__[\"createContext\"]({});\n\nif (true) {\n  ListContext.displayName = 'ListContext';\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ListContext);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/List/index.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/List/index.js ***!
+  \**********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./List */ \"./jaas-client/node_modules/@material-ui/core/esm/List/List.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _List__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/List/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js ***!
+  \*****************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _ButtonBase__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ButtonBase */ \"./jaas-client/node_modules/@material-ui/core/esm/ButtonBase/index.js\");\n/* harmony import */ var _utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/isMuiElement */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _List_ListContext__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../List/ListContext */ \"./jaas-client/node_modules/@material-ui/core/esm/List/ListContext.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the (normally root) `component` element. May be wrapped by a `container`. */\n    root: {\n      display: 'flex',\n      justifyContent: 'flex-start',\n      alignItems: 'center',\n      position: 'relative',\n      textDecoration: 'none',\n      width: '100%',\n      boxSizing: 'border-box',\n      textAlign: 'left',\n      paddingTop: 8,\n      paddingBottom: 8,\n      '&$focusVisible': {\n        backgroundColor: theme.palette.action.selected\n      },\n      '&$selected, &$selected:hover': {\n        backgroundColor: theme.palette.action.selected\n      },\n      '&$disabled': {\n        opacity: 0.5\n      }\n    },\n\n    /* Styles applied to the `container` element if `children` includes `ListItemSecondaryAction`. */\n    container: {\n      position: 'relative'\n    },\n\n    /* Pseudo-class applied to the `component`'s `focusVisibleClassName` prop if `button={true}`. */\n    focusVisible: {},\n\n    /* Styles applied to the `component` element if dense. */\n    dense: {\n      paddingTop: 4,\n      paddingBottom: 4\n    },\n\n    /* Styles applied to the `component` element if `alignItems=\"flex-start\"`. */\n    alignItemsFlexStart: {\n      alignItems: 'flex-start'\n    },\n\n    /* Pseudo-class applied to the inner `component` element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the inner `component` element if `divider={true}`. */\n    divider: {\n      borderBottom: \"1px solid \".concat(theme.palette.divider),\n      backgroundClip: 'padding-box'\n    },\n\n    /* Styles applied to the inner `component` element if `disableGutters={false}`. */\n    gutters: {\n      paddingLeft: 16,\n      paddingRight: 16\n    },\n\n    /* Styles applied to the inner `component` element if `button={true}`. */\n    button: {\n      transition: theme.transitions.create('background-color', {\n        duration: theme.transitions.duration.shortest\n      }),\n      '&:hover': {\n        textDecoration: 'none',\n        backgroundColor: theme.palette.action.hover,\n        // Reset on touch devices, it doesn't add specificity\n        '@media (hover: none)': {\n          backgroundColor: 'transparent'\n        }\n      }\n    },\n\n    /* Styles applied to the `component` element if `children` includes `ListItemSecondaryAction`. */\n    secondaryAction: {\n      // Add some space to avoid collision as `ListItemSecondaryAction`\n      // is absolutely positioned.\n      paddingRight: 48\n    },\n\n    /* Pseudo-class applied to the root element if `selected={true}`. */\n    selected: {}\n  };\n};\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_2__[\"useLayoutEffect\"];\n/**\n * Uses an additional container component if `ListItemSecondaryAction` is the last child.\n */\n\nvar ListItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function ListItem(props, ref) {\n  var _props$alignItems = props.alignItems,\n      alignItems = _props$alignItems === void 0 ? 'center' : _props$alignItems,\n      _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,\n      _props$button = props.button,\n      button = _props$button === void 0 ? false : _props$button,\n      childrenProp = props.children,\n      classes = props.classes,\n      className = props.className,\n      componentProp = props.component,\n      _props$ContainerCompo = props.ContainerComponent,\n      ContainerComponent = _props$ContainerCompo === void 0 ? 'li' : _props$ContainerCompo,\n      _props$ContainerProps = props.ContainerProps;\n  _props$ContainerProps = _props$ContainerProps === void 0 ? {} : _props$ContainerProps;\n\n  var ContainerClassName = _props$ContainerProps.className,\n      ContainerProps = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_props$ContainerProps, [\"className\"]),\n      _props$dense = props.dense,\n      dense = _props$dense === void 0 ? false : _props$dense,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$disableGutters = props.disableGutters,\n      disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n      _props$divider = props.divider,\n      divider = _props$divider === void 0 ? false : _props$divider,\n      focusVisibleClassName = props.focusVisibleClassName,\n      _props$selected = props.selected,\n      selected = _props$selected === void 0 ? false : _props$selected,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"alignItems\", \"autoFocus\", \"button\", \"children\", \"classes\", \"className\", \"component\", \"ContainerComponent\", \"ContainerProps\", \"dense\", \"disabled\", \"disableGutters\", \"divider\", \"focusVisibleClassName\", \"selected\"]);\n\n  var context = react__WEBPACK_IMPORTED_MODULE_2__[\"useContext\"](_List_ListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"]);\n  var childContext = {\n    dense: dense || context.dense || false,\n    alignItems: alignItems\n  };\n  var listItemRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  useEnhancedEffect(function () {\n    if (autoFocus) {\n      if (listItemRef.current) {\n        listItemRef.current.focus();\n      } else if (true) {\n        console.error('Material-UI: Unable to set focus to a ListItem whose component has not been rendered.');\n      }\n    }\n  }, [autoFocus]);\n  var children = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].toArray(childrenProp);\n  var hasSecondaryAction = children.length && Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(children[children.length - 1], ['ListItemSecondaryAction']);\n  var handleOwnRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    listItemRef.current = react_dom__WEBPACK_IMPORTED_MODULE_11__[\"findDOMNode\"](instance);\n  }, []);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleOwnRef, ref);\n\n  var componentProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, childContext.dense && classes.dense, !disableGutters && classes.gutters, divider && classes.divider, disabled && classes.disabled, button && classes.button, alignItems !== \"center\" && classes.alignItemsFlexStart, hasSecondaryAction && classes.secondaryAction, selected && classes.selected),\n    disabled: disabled\n  }, other);\n\n  var Component = componentProp || 'li';\n\n  if (button) {\n    componentProps.component = componentProp || 'div';\n    componentProps.focusVisibleClassName = Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.focusVisible, focusVisibleClassName);\n    Component = _ButtonBase__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\n  }\n\n  if (hasSecondaryAction) {\n    // Use div by default.\n    Component = !componentProps.component && !componentProp ? 'div' : Component; // Avoid nesting of li > li.\n\n    if (ContainerComponent === 'li') {\n      if (Component === 'li') {\n        Component = 'div';\n      } else if (componentProps.component === 'li') {\n        componentProps.component = 'div';\n      }\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_List_ListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Provider, {\n      value: childContext\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](ContainerComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.container, ContainerClassName),\n      ref: handleRef\n    }, ContainerProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, componentProps, children), children.pop()));\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_List_ListContext__WEBPACK_IMPORTED_MODULE_10__[\"default\"].Provider, {\n    value: childContext\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    ref: handleRef\n  }, componentProps), children));\n});\n true ? ListItem.propTypes = {\n  /**\n   * Defines the `align-items` style property.\n   */\n  alignItems: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['flex-start', 'center']),\n\n  /**\n   * If `true`, the list item will be focused during the first mount.\n   * Focus will also be triggered if the value changes from false to true.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the list item will be a button (using `ButtonBase`). Props intended\n   * for `ButtonBase` can then be applied to `ListItem`.\n   */\n  button: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The content of the component. If a `ListItemSecondaryAction` is used it must\n   * be the last child.\n   */\n  children: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, function (props) {\n    var children = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].toArray(props.children); // React.Children.toArray(props.children).findLastIndex(isListItemSecondaryAction)\n\n    var secondaryActionIndex = -1;\n\n    for (var i = children.length - 1; i >= 0; i -= 1) {\n      var child = children[i];\n\n      if (Object(_utils_isMuiElement__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(child, ['ListItemSecondaryAction'])) {\n        secondaryActionIndex = i;\n        break;\n      }\n    } //  is ListItemSecondaryAction the last child of ListItem\n\n\n    if (secondaryActionIndex !== -1 && secondaryActionIndex !== children.length - 1) {\n      return new Error('Material-UI: You used an element after ListItemSecondaryAction. ' + 'For ListItem to detect that it has a secondary action ' + 'you must pass it as the last child to ListItem.');\n    }\n\n    return null;\n  }),\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   * By default, it's a `li` when `button` is `false` and a `div` when `button` is `true`.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * The container component used when a `ListItemSecondaryAction` is the last child.\n   */\n  ContainerComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * Props applied to the container component if used.\n   */\n  ContainerProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * If `true`, compact vertical padding designed for keyboard and mouse input will be used.\n   */\n  dense: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the list item will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the left and right padding is removed.\n   */\n  disableGutters: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, a 1px light border is added to the bottom of the list item.\n   */\n  divider: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  focusVisibleClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Use to apply selected styling.\n   */\n  selected: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiListItem'\n})(ListItem));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js":
+/*!**************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js ***!
+  \**************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ListItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ListItem */ \"./jaas-client/node_modules/@material-ui/core/esm/ListItem/ListItem.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ListItem__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js ***!
+  \*********************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Popover__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Popover */ \"./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js\");\n/* harmony import */ var _MenuList__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../MenuList */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _utils_setRef__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/setRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar RTL_ORIGIN = {\n  vertical: 'top',\n  horizontal: 'right'\n};\nvar LTR_ORIGIN = {\n  vertical: 'top',\n  horizontal: 'left'\n};\nvar styles = {\n  /* Styles applied to the `Paper` component. */\n  paper: {\n    // specZ: The maximum height of a simple menu should be one or more rows less than the view\n    // height. This ensures a tapable area outside of the simple menu with which to dismiss\n    // the menu.\n    maxHeight: 'calc(100% - 96px)',\n    // Add iOS momentum scrolling.\n    WebkitOverflowScrolling: 'touch'\n  },\n\n  /* Styles applied to the `List` component via `MenuList`. */\n  list: {\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0\n  }\n};\nvar Menu = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Menu(props, ref) {\n  var _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? true : _props$autoFocus,\n      children = props.children,\n      classes = props.classes,\n      _props$disableAutoFoc = props.disableAutoFocusItem,\n      disableAutoFocusItem = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc,\n      _props$MenuListProps = props.MenuListProps,\n      MenuListProps = _props$MenuListProps === void 0 ? {} : _props$MenuListProps,\n      onClose = props.onClose,\n      onEntering = props.onEntering,\n      open = props.open,\n      _props$PaperProps = props.PaperProps,\n      PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,\n      PopoverClasses = props.PopoverClasses,\n      _props$transitionDura = props.transitionDuration,\n      transitionDuration = _props$transitionDura === void 0 ? 'auto' : _props$transitionDura,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'selectedMenu' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"autoFocus\", \"children\", \"classes\", \"disableAutoFocusItem\", \"MenuListProps\", \"onClose\", \"onEntering\", \"open\", \"PaperProps\", \"PopoverClasses\", \"transitionDuration\", \"variant\"]);\n\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_12__[\"default\"])();\n  var autoFocusItem = autoFocus && !disableAutoFocusItem && open;\n  var menuListActionsRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var contentAnchorRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n\n  var getContentAnchorEl = function getContentAnchorEl() {\n    return contentAnchorRef.current;\n  };\n\n  var handleEntering = function handleEntering(element, isAppearing) {\n    if (menuListActionsRef.current) {\n      menuListActionsRef.current.adjustStyleForScrollbar(element, theme);\n    }\n\n    if (onEntering) {\n      onEntering(element, isAppearing);\n    }\n  };\n\n  var handleListKeyDown = function handleListKeyDown(event) {\n    if (event.key === 'Tab') {\n      event.preventDefault();\n\n      if (onClose) {\n        onClose(event, 'tabKeyDown');\n      }\n    }\n  };\n  /**\n   * the index of the item should receive focus\n   * in a `variant=\"selectedMenu\"` it's the first `selected` item\n   * otherwise it's the very first item.\n   */\n\n\n  var activeItemIndex = -1; // since we inject focus related props into children we have to do a lookahead\n  // to check if there is a `selected` item. We're looking for the last `selected`\n  // item and use the first valid item as a fallback\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].map(children, function (child, index) {\n    if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"isValidElement\"](child)) {\n      return;\n    }\n\n    if (true) {\n      if (Object(react_is__WEBPACK_IMPORTED_MODULE_3__[\"isFragment\"])(child)) {\n        console.error([\"Material-UI: The Menu component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n      }\n    }\n\n    if (!child.props.disabled) {\n      if (variant !== \"menu\" && child.props.selected) {\n        activeItemIndex = index;\n      } else if (activeItemIndex === -1) {\n        activeItemIndex = index;\n      }\n    }\n  });\n  var items = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].map(children, function (child, index) {\n    if (index === activeItemIndex) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](child, {\n        ref: function ref(instance) {\n          // #StrictMode ready\n          contentAnchorRef.current = react_dom__WEBPACK_IMPORTED_MODULE_10__[\"findDOMNode\"](instance);\n          Object(_utils_setRef__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(child.ref, instance);\n        }\n      });\n    }\n\n    return child;\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Popover__WEBPACK_IMPORTED_MODULE_8__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    getContentAnchorEl: getContentAnchorEl,\n    classes: PopoverClasses,\n    onClose: onClose,\n    onEntering: handleEntering,\n    anchorOrigin: theme.direction === 'rtl' ? RTL_ORIGIN : LTR_ORIGIN,\n    transformOrigin: theme.direction === 'rtl' ? RTL_ORIGIN : LTR_ORIGIN,\n    PaperProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, PaperProps, {\n      classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, PaperProps.classes, {\n        root: classes.paper\n      })\n    }),\n    open: open,\n    ref: ref,\n    transitionDuration: transitionDuration\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_MenuList__WEBPACK_IMPORTED_MODULE_9__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    onKeyDown: handleListKeyDown,\n    actions: menuListActionsRef,\n    autoFocus: autoFocus && (activeItemIndex === -1 || disableAutoFocusItem),\n    autoFocusItem: autoFocusItem,\n    variant: variant\n  }, MenuListProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.list, MenuListProps.className)\n  }), items));\n});\n true ? Menu.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A HTML element, or a function that returns it.\n   * It's used to set the position of the menu.\n   */\n  anchorEl: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]),\n\n  /**\n   * If `true` (Default) will focus the `[role=\"menu\"]` if no focusable child is found. Disabled\n   * children are not focusable. If you set this prop to `false` focus will be placed\n   * on the parent modal container. This has severe accessibility implications\n   * and should only be considered if you manage focus otherwise.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Menu contents, normally `MenuItem`s.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * When opening the menu will not focus the active item but the `[role=\"menu\"]`\n   * unless `autoFocus` is also set to `false`. Not using the default means not\n   * following WAI-ARIA authoring practices. Please be considerate about possible\n   * accessibility implications.\n   */\n  disableAutoFocusItem: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Props applied to the [`MenuList`](/api/menu-list/) element.\n   */\n  MenuListProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   *\n   * @param {object} event The event source of the callback.\n   * @param {string} reason Can be: `\"escapeKeyDown\"`, `\"backdropClick\"`, `\"tabKeyDown\"`.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the Menu enters.\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu has entered.\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu is entering.\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired before the Menu exits.\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu has exited.\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the Menu is exiting.\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the menu is visible.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,\n\n  /**\n   * @ignore\n   */\n  PaperProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * `classes` prop applied to the [`Popover`](/api/popover/) element.\n   */\n  PopoverClasses: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * The length of the transition in `ms`, or 'auto'\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['auto']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  })]),\n\n  /**\n   * The variant to use. Use `menu` to prevent selected items from impacting the initial focus\n   * and the vertical alignment relative to the anchor element.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['menu', 'selectedMenu'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(styles, {\n  name: 'MuiMenu'\n})(Menu));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js ***!
+  \**********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Menu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Menu */ \"./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Menu__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js ***!
+  \*****************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _ListItem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ListItem */ \"./jaas-client/node_modules/@material-ui/core/esm/ListItem/index.js\");\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.typography.body1, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      minHeight: 48,\n      paddingTop: 6,\n      paddingBottom: 6,\n      boxSizing: 'border-box',\n      width: 'auto',\n      overflow: 'hidden',\n      whiteSpace: 'nowrap'\n    }, theme.breakpoints.up('sm'), {\n      minHeight: 'auto'\n    })),\n    // TODO v5: remove\n\n    /* Styles applied to the root element if `disableGutters={false}`. */\n    gutters: {},\n\n    /* Styles applied to the root element if `selected={true}`. */\n    selected: {},\n\n    /* Styles applied to the root element if dense. */\n    dense: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({}, theme.typography.body2, {\n      minHeight: 'auto'\n    })\n  };\n};\nvar MenuItem = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function MenuItem(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      component = _props$component === void 0 ? 'li' : _props$component,\n      _props$disableGutters = props.disableGutters,\n      disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters,\n      ListItemClasses = props.ListItemClasses,\n      _props$role = props.role,\n      role = _props$role === void 0 ? 'menuitem' : _props$role,\n      selected = props.selected,\n      tabIndexProp = props.tabIndex,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"classes\", \"className\", \"component\", \"disableGutters\", \"ListItemClasses\", \"role\", \"selected\", \"tabIndex\"]);\n\n  var tabIndex;\n\n  if (!props.disabled) {\n    tabIndex = tabIndexProp !== undefined ? tabIndexProp : -1;\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_ListItem__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n    button: true,\n    role: role,\n    tabIndex: tabIndex,\n    component: component,\n    selected: selected,\n    disableGutters: disableGutters,\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__[\"default\"])({\n      dense: classes.dense\n    }, ListItemClasses),\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, selected && classes.selected, !disableGutters && classes.gutters),\n    ref: ref\n  }, other));\n});\n true ? MenuItem.propTypes = {\n  /**\n   * Menu item contents.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * If `true`, compact vertical padding designed for keyboard and mouse input will be used.\n   */\n  dense: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the left and right padding is removed.\n   */\n  disableGutters: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * `classes` prop applied to the [`ListItem`](/api/list-item/) element.\n   */\n  ListItemClasses: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  role: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  selected: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiMenuItem'\n})(MenuItem));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js":
+/*!**************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js ***!
+  \**************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _MenuItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MenuItem */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuItem/MenuItem.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _MenuItem__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js ***!
+  \*****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../List */ \"./jaas-client/node_modules/@material-ui/core/esm/List/index.js\");\n/* harmony import */ var _utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/getScrollbarSize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\n\n\n\n\nfunction nextItem(list, item, disableListWrap) {\n  if (list === item) {\n    return list.firstChild;\n  }\n\n  if (item && item.nextElementSibling) {\n    return item.nextElementSibling;\n  }\n\n  return disableListWrap ? null : list.firstChild;\n}\n\nfunction previousItem(list, item, disableListWrap) {\n  if (list === item) {\n    return disableListWrap ? list.firstChild : list.lastChild;\n  }\n\n  if (item && item.previousElementSibling) {\n    return item.previousElementSibling;\n  }\n\n  return disableListWrap ? null : list.lastChild;\n}\n\nfunction textCriteriaMatches(nextFocus, textCriteria) {\n  if (textCriteria === undefined) {\n    return true;\n  }\n\n  var text = nextFocus.innerText;\n\n  if (text === undefined) {\n    // jsdom doesn't support innerText\n    text = nextFocus.textContent;\n  }\n\n  text = text.trim().toLowerCase();\n\n  if (text.length === 0) {\n    return false;\n  }\n\n  if (textCriteria.repeating) {\n    return text[0] === textCriteria.keys[0];\n  }\n\n  return text.indexOf(textCriteria.keys.join('')) === 0;\n}\n\nfunction moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, traversalFunction, textCriteria) {\n  var wrappedOnce = false;\n  var nextFocus = traversalFunction(list, currentFocus, currentFocus ? disableListWrap : false);\n\n  while (nextFocus) {\n    // Prevent infinite loop.\n    if (nextFocus === list.firstChild) {\n      if (wrappedOnce) {\n        return;\n      }\n\n      wrappedOnce = true;\n    } // Same logic as useAutocomplete.js\n\n\n    var nextFocusDisabled = disabledItemsFocusable ? false : nextFocus.disabled || nextFocus.getAttribute('aria-disabled') === 'true';\n\n    if (!nextFocus.hasAttribute('tabindex') || !textCriteriaMatches(nextFocus, textCriteria) || nextFocusDisabled) {\n      // Move to the next element.\n      nextFocus = traversalFunction(list, nextFocus, disableListWrap);\n    } else {\n      nextFocus.focus();\n      return;\n    }\n  }\n}\n\nvar useEnhancedEffect = typeof window === 'undefined' ? react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"] : react__WEBPACK_IMPORTED_MODULE_2__[\"useLayoutEffect\"];\n/**\n * A permanently displayed menu following https://www.w3.org/TR/wai-aria-practices/#menubutton.\n * It's exposed to help customization of the [`Menu`](/api/menu/) component. If you\n * use it separately you need to move focus into the component manually. Once\n * the focus is placed inside the component it is fully keyboard accessible.\n */\n\nvar MenuList = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function MenuList(props, ref) {\n  var actions = props.actions,\n      _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,\n      _props$autoFocusItem = props.autoFocusItem,\n      autoFocusItem = _props$autoFocusItem === void 0 ? false : _props$autoFocusItem,\n      children = props.children,\n      className = props.className,\n      _props$disabledItemsF = props.disabledItemsFocusable,\n      disabledItemsFocusable = _props$disabledItemsF === void 0 ? false : _props$disabledItemsF,\n      _props$disableListWra = props.disableListWrap,\n      disableListWrap = _props$disableListWra === void 0 ? false : _props$disableListWra,\n      onKeyDown = props.onKeyDown,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'selectedMenu' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"actions\", \"autoFocus\", \"autoFocusItem\", \"children\", \"className\", \"disabledItemsFocusable\", \"disableListWrap\", \"onKeyDown\", \"variant\"]);\n\n  var listRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var textCriteriaRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"]({\n    keys: [],\n    repeating: true,\n    previousKeyMatched: true,\n    lastTime: null\n  });\n  useEnhancedEffect(function () {\n    if (autoFocus) {\n      listRef.current.focus();\n    }\n  }, [autoFocus]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useImperativeHandle\"](actions, function () {\n    return {\n      adjustStyleForScrollbar: function adjustStyleForScrollbar(containerElement, theme) {\n        // Let's ignore that piece of logic if users are already overriding the width\n        // of the menu.\n        var noExplicitWidth = !listRef.current.style.width;\n\n        if (containerElement.clientHeight < listRef.current.clientHeight && noExplicitWidth) {\n          var scrollbarSize = \"\".concat(Object(_utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(true), \"px\");\n          listRef.current.style[theme.direction === 'rtl' ? 'paddingLeft' : 'paddingRight'] = scrollbarSize;\n          listRef.current.style.width = \"calc(100% + \".concat(scrollbarSize, \")\");\n        }\n\n        return listRef.current;\n      }\n    };\n  }, []);\n\n  var handleKeyDown = function handleKeyDown(event) {\n    var list = listRef.current;\n    var key = event.key;\n    /**\n     * @type {Element} - will always be defined since we are in a keydown handler\n     * attached to an element. A keydown event is either dispatched to the activeElement\n     * or document.body or document.documentElement. Only the first case will\n     * trigger this specific handler.\n     */\n\n    var currentFocus = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(list).activeElement;\n\n    if (key === 'ArrowDown') {\n      // Prevent scroll of the page\n      event.preventDefault();\n      moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, nextItem);\n    } else if (key === 'ArrowUp') {\n      event.preventDefault();\n      moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, previousItem);\n    } else if (key === 'Home') {\n      event.preventDefault();\n      moveFocus(list, null, disableListWrap, disabledItemsFocusable, nextItem);\n    } else if (key === 'End') {\n      event.preventDefault();\n      moveFocus(list, null, disableListWrap, disabledItemsFocusable, previousItem);\n    } else if (key.length === 1) {\n      var criteria = textCriteriaRef.current;\n      var lowerKey = key.toLowerCase();\n      var currTime = performance.now();\n\n      if (criteria.keys.length > 0) {\n        // Reset\n        if (currTime - criteria.lastTime > 500) {\n          criteria.keys = [];\n          criteria.repeating = true;\n          criteria.previousKeyMatched = true;\n        } else if (criteria.repeating && lowerKey !== criteria.keys[0]) {\n          criteria.repeating = false;\n        }\n      }\n\n      criteria.lastTime = currTime;\n      criteria.keys.push(lowerKey);\n      var keepFocusOnCurrent = currentFocus && !criteria.repeating && textCriteriaMatches(currentFocus, criteria);\n\n      if (criteria.previousKeyMatched && (keepFocusOnCurrent || moveFocus(list, currentFocus, false, disabledItemsFocusable, nextItem, criteria))) {\n        event.preventDefault();\n      } else {\n        criteria.previousKeyMatched = false;\n      }\n    }\n\n    if (onKeyDown) {\n      onKeyDown(event);\n    }\n  };\n\n  var handleOwnRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    listRef.current = react_dom__WEBPACK_IMPORTED_MODULE_5__[\"findDOMNode\"](instance);\n  }, []);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleOwnRef, ref);\n  /**\n   * the index of the item should receive focus\n   * in a `variant=\"selectedMenu\"` it's the first `selected` item\n   * otherwise it's the very first item.\n   */\n\n  var activeItemIndex = -1; // since we inject focus related props into children we have to do a lookahead\n  // to check if there is a `selected` item. We're looking for the last `selected`\n  // item and use the first valid item as a fallback\n\n  react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].forEach(children, function (child, index) {\n    if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"isValidElement\"](child)) {\n      return;\n    }\n\n    if (true) {\n      if (Object(react_is__WEBPACK_IMPORTED_MODULE_3__[\"isFragment\"])(child)) {\n        console.error([\"Material-UI: The Menu component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n      }\n    }\n\n    if (!child.props.disabled) {\n      if (variant === 'selectedMenu' && child.props.selected) {\n        activeItemIndex = index;\n      } else if (activeItemIndex === -1) {\n        activeItemIndex = index;\n      }\n    }\n  });\n  var items = react__WEBPACK_IMPORTED_MODULE_2__[\"Children\"].map(children, function (child, index) {\n    if (index === activeItemIndex) {\n      var newChildProps = {};\n\n      if (autoFocusItem) {\n        newChildProps.autoFocus = true;\n      }\n\n      if (child.props.tabIndex === undefined && variant === 'selectedMenu') {\n        newChildProps.tabIndex = 0;\n      }\n\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](child, newChildProps);\n    }\n\n    return child;\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_List__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    role: \"menu\",\n    ref: handleRef,\n    className: className,\n    onKeyDown: handleKeyDown,\n    tabIndex: autoFocus ? 0 : -1\n  }, other), items);\n});\n true ? MenuList.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, will focus the `[role=\"menu\"]` container and move into tab order.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, will focus the first menuitem if `variant=\"menu\"` or selected item\n   * if `variant=\"selectedMenu\"`.\n   */\n  autoFocusItem: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * MenuList contents, normally `MenuItem`s.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * If `true`, will allow focus on disabled items.\n   */\n  disabledItemsFocusable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the menu items will not wrap focus.\n   */\n  disableListWrap: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * The variant to use. Use `menu` to prevent selected items from impacting the initial focus\n   * and the vertical alignment relative to the anchor element.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['menu', 'selectedMenu'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (MenuList);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js":
+/*!**************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js ***!
+  \**************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _MenuList__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MenuList */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuList/MenuList.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _MenuList__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/MenuList/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js ***!
+  \***********************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _Portal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Portal */ \"./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js\");\n/* harmony import */ var _utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/createChainedFunction */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils/useEventCallback */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js\");\n/* harmony import */ var _styles_zIndex__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../styles/zIndex */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js\");\n/* harmony import */ var _ModalManager__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ModalManager */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js\");\n/* harmony import */ var _Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Unstable_TrapFocus */ \"./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js\");\n/* harmony import */ var _SimpleBackdrop__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./SimpleBackdrop */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getContainer(container) {\n  container = typeof container === 'function' ? container() : container;\n  return react_dom__WEBPACK_IMPORTED_MODULE_3__[\"findDOMNode\"](container);\n}\n\nfunction getHasTransition(props) {\n  return props.children ? props.children.props.hasOwnProperty('in') : false;\n} // A modal manager used to track and manage the state of open Modals.\n// Modals don't open on the server so this won't conflict with concurrent requests.\n\n\nvar defaultManager = new _ModalManager__WEBPACK_IMPORTED_MODULE_13__[\"default\"]();\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'fixed',\n      zIndex: theme.zIndex.modal,\n      right: 0,\n      bottom: 0,\n      top: 0,\n      left: 0\n    },\n\n    /* Styles applied to the root element if the `Modal` has exited. */\n    hidden: {\n      visibility: 'hidden'\n    }\n  };\n};\n/**\n * Modal is a lower-level construct that is leveraged by the following components:\n *\n * - [Dialog](/api/dialog/)\n * - [Drawer](/api/drawer/)\n * - [Menu](/api/menu/)\n * - [Popover](/api/popover/)\n *\n * If you are creating a modal dialog, you probably want to use the [Dialog](/api/dialog/) component\n * rather than directly using Modal.\n *\n * This component shares many concepts with [react-overlays](https://react-bootstrap.github.io/react-overlays/#modals).\n */\n\nvar Modal = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Modal(inProps, ref) {\n  var theme = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_5__[\"useTheme\"])();\n  var props = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_5__[\"getThemeProps\"])({\n    name: 'MuiModal',\n    props: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, inProps),\n    theme: theme\n  });\n\n  var _props$BackdropCompon = props.BackdropComponent,\n      BackdropComponent = _props$BackdropCompon === void 0 ? _SimpleBackdrop__WEBPACK_IMPORTED_MODULE_15__[\"default\"] : _props$BackdropCompon,\n      BackdropProps = props.BackdropProps,\n      children = props.children,\n      _props$closeAfterTran = props.closeAfterTransition,\n      closeAfterTransition = _props$closeAfterTran === void 0 ? false : _props$closeAfterTran,\n      container = props.container,\n      _props$disableAutoFoc = props.disableAutoFocus,\n      disableAutoFocus = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc,\n      _props$disableBackdro = props.disableBackdropClick,\n      disableBackdropClick = _props$disableBackdro === void 0 ? false : _props$disableBackdro,\n      _props$disableEnforce = props.disableEnforceFocus,\n      disableEnforceFocus = _props$disableEnforce === void 0 ? false : _props$disableEnforce,\n      _props$disableEscapeK = props.disableEscapeKeyDown,\n      disableEscapeKeyDown = _props$disableEscapeK === void 0 ? false : _props$disableEscapeK,\n      _props$disablePortal = props.disablePortal,\n      disablePortal = _props$disablePortal === void 0 ? false : _props$disablePortal,\n      _props$disableRestore = props.disableRestoreFocus,\n      disableRestoreFocus = _props$disableRestore === void 0 ? false : _props$disableRestore,\n      _props$disableScrollL = props.disableScrollLock,\n      disableScrollLock = _props$disableScrollL === void 0 ? false : _props$disableScrollL,\n      _props$hideBackdrop = props.hideBackdrop,\n      hideBackdrop = _props$hideBackdrop === void 0 ? false : _props$hideBackdrop,\n      _props$keepMounted = props.keepMounted,\n      keepMounted = _props$keepMounted === void 0 ? false : _props$keepMounted,\n      _props$manager = props.manager,\n      manager = _props$manager === void 0 ? defaultManager : _props$manager,\n      onBackdropClick = props.onBackdropClick,\n      onClose = props.onClose,\n      onEscapeKeyDown = props.onEscapeKeyDown,\n      onRendered = props.onRendered,\n      open = props.open,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"BackdropComponent\", \"BackdropProps\", \"children\", \"closeAfterTransition\", \"container\", \"disableAutoFocus\", \"disableBackdropClick\", \"disableEnforceFocus\", \"disableEscapeKeyDown\", \"disablePortal\", \"disableRestoreFocus\", \"disableScrollLock\", \"hideBackdrop\", \"keepMounted\", \"manager\", \"onBackdropClick\", \"onClose\", \"onEscapeKeyDown\", \"onRendered\", \"open\"]);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"](true),\n      exited = _React$useState[0],\n      setExited = _React$useState[1];\n\n  var modal = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"]({});\n  var mountNodeRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var modalRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(modalRef, ref);\n  var hasTransition = getHasTransition(props);\n\n  var getDoc = function getDoc() {\n    return Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(mountNodeRef.current);\n  };\n\n  var getModal = function getModal() {\n    modal.current.modalRef = modalRef.current;\n    modal.current.mountNode = mountNodeRef.current;\n    return modal.current;\n  };\n\n  var handleMounted = function handleMounted() {\n    manager.mount(getModal(), {\n      disableScrollLock: disableScrollLock\n    }); // Fix a bug on Chrome where the scroll isn't initially 0.\n\n    modalRef.current.scrollTop = 0;\n  };\n\n  var handleOpen = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(function () {\n    var resolvedContainer = getContainer(container) || getDoc().body;\n    manager.add(getModal(), resolvedContainer); // The element was already mounted.\n\n    if (modalRef.current) {\n      handleMounted();\n    }\n  });\n  var isTopModal = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    return manager.isTopModal(getModal());\n  }, [manager]);\n  var handlePortalRef = Object(_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(function (node) {\n    mountNodeRef.current = node;\n\n    if (!node) {\n      return;\n    }\n\n    if (onRendered) {\n      onRendered();\n    }\n\n    if (open && isTopModal()) {\n      handleMounted();\n    } else {\n      Object(_ModalManager__WEBPACK_IMPORTED_MODULE_13__[\"ariaHidden\"])(modalRef.current, true);\n    }\n  });\n  var handleClose = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    manager.remove(getModal());\n  }, [manager]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    return function () {\n      handleClose();\n    };\n  }, [handleClose]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (open) {\n      handleOpen();\n    } else if (!hasTransition || !closeAfterTransition) {\n      handleClose();\n    }\n  }, [open, handleClose, hasTransition, closeAfterTransition, handleOpen]);\n\n  if (!keepMounted && !open && (!hasTransition || exited)) {\n    return null;\n  }\n\n  var handleEnter = function handleEnter() {\n    setExited(false);\n  };\n\n  var handleExited = function handleExited() {\n    setExited(true);\n\n    if (closeAfterTransition) {\n      handleClose();\n    }\n  };\n\n  var handleBackdropClick = function handleBackdropClick(event) {\n    if (event.target !== event.currentTarget) {\n      return;\n    }\n\n    if (onBackdropClick) {\n      onBackdropClick(event);\n    }\n\n    if (!disableBackdropClick && onClose) {\n      onClose(event, 'backdropClick');\n    }\n  };\n\n  var handleKeyDown = function handleKeyDown(event) {\n    // The handler doesn't take event.defaultPrevented into account:\n    //\n    // event.preventDefault() is meant to stop default behaviours like\n    // clicking a checkbox to check it, hitting a button to submit a form,\n    // and hitting left arrow to move the cursor in a text input etc.\n    // Only special HTML elements have these default behaviors.\n    if (event.key !== 'Escape' || !isTopModal()) {\n      return;\n    }\n\n    if (onEscapeKeyDown) {\n      onEscapeKeyDown(event);\n    }\n\n    if (!disableEscapeKeyDown) {\n      // Swallow the event, in case someone is listening for the escape key on the body.\n      event.stopPropagation();\n\n      if (onClose) {\n        onClose(event, 'escapeKeyDown');\n      }\n    }\n  };\n\n  var inlineStyle = styles(theme || {\n    zIndex: _styles_zIndex__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n  });\n  var childProps = {};\n\n  if (children.props.tabIndex === undefined) {\n    childProps.tabIndex = children.props.tabIndex || '-1';\n  } // It's a Transition like component\n\n\n  if (hasTransition) {\n    childProps.onEnter = Object(_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleEnter, children.props.onEnter);\n    childProps.onExited = Object(_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(handleExited, children.props.onExited);\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Portal__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n    ref: handlePortalRef,\n    container: container,\n    disablePortal: disablePortal\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    ref: handleRef,\n    onKeyDown: handleKeyDown,\n    role: \"presentation\"\n  }, other, {\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, inlineStyle.root, !open && exited ? inlineStyle.hidden : {}, other.style)\n  }), hideBackdrop ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](BackdropComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    open: open,\n    onClick: handleBackdropClick\n  }, BackdropProps)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n    disableEnforceFocus: disableEnforceFocus,\n    disableAutoFocus: disableAutoFocus,\n    disableRestoreFocus: disableRestoreFocus,\n    getDoc: getDoc,\n    isEnabled: isTopModal,\n    open: open\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](children, childProps))));\n});\n true ? Modal.propTypes = {\n  /**\n   * A backdrop component. This prop enables custom backdrop rendering.\n   */\n  BackdropComponent: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType,\n\n  /**\n   * Props applied to the [`Backdrop`](/api/backdrop/) element.\n   */\n  BackdropProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * A single child content element.\n   */\n  children: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"elementAcceptingRef\"].isRequired,\n\n  /**\n   * When set to true the Modal waits until a nested Transition is completed before closing.\n   */\n  closeAfterTransition: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * A HTML element, component instance, or function that returns either.\n   * The `container` will have the portal children appended to it.\n   *\n   * By default, it uses the body of the top-level document object,\n   * so it's simply `document.body` most of the time.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.instanceOf(react__WEBPACK_IMPORTED_MODULE_2__[\"Component\"]), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]),\n\n  /**\n   * If `true`, the modal will not automatically shift focus to itself when it opens, and\n   * replace it to the last focused element when it closes.\n   * This also works correctly with any modal children that have the `disableAutoFocus` prop.\n   *\n   * Generally this should never be set to `true` as it makes the modal less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableAutoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, clicking the backdrop will not fire `onClose`.\n   */\n  disableBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the modal will not prevent focus from leaving the modal while open.\n   *\n   * Generally this should never be set to `true` as it makes the modal less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableEnforceFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, hitting escape will not fire `onClose`.\n   */\n  disableEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Disable the portal behavior.\n   * The children stay within it's parent DOM hierarchy.\n   */\n  disablePortal: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the modal will not restore focus to previously focused element once\n   * modal is hidden.\n   */\n  disableRestoreFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Disable the scroll lock behavior.\n   */\n  disableScrollLock: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the backdrop is not rendered.\n   */\n  hideBackdrop: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * Always keep the children in the DOM.\n   * This prop can be useful in SEO situation or\n   * when you want to maximize the responsiveness of the Modal.\n   */\n  keepMounted: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  manager: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Callback fired when the backdrop is clicked.\n   */\n  onBackdropClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   * The `reason` parameter can optionally be used to control the response to `onClose`.\n   *\n   * @param {object} event The event source of the callback.\n   * @param {string} reason Can be: `\"escapeKeyDown\"`, `\"backdropClick\"`.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the escape key is pressed,\n   * `disableEscapeKeyDown` is false and the modal is in focus.\n   */\n  onEscapeKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired once the children has been mounted into the `container`.\n   * It signals that the `open={true}` prop took effect.\n   *\n   * This prop will be deprecated and removed in v5, the ref can be used instead.\n   */\n  onRendered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * If `true`, the modal is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Modal);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js ***!
+  \******************************************************************************/
+/*! exports provided: ariaHidden, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ariaHidden\", function() { return ariaHidden; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ModalManager; });\n/* harmony import */ var _babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/classCallCheck */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getScrollbarSize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_ownerWindow__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/ownerWindow */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js\");\n\n\n\n\n\n // Is a vertical scrollbar displayed?\n\nfunction isOverflowing(container) {\n  var doc = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(container);\n\n  if (doc.body === container) {\n    return Object(_utils_ownerWindow__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(doc).innerWidth > doc.documentElement.clientWidth;\n  }\n\n  return container.scrollHeight > container.clientHeight;\n}\n\nfunction ariaHidden(node, show) {\n  if (show) {\n    node.setAttribute('aria-hidden', 'true');\n  } else {\n    node.removeAttribute('aria-hidden');\n  }\n}\n\nfunction getPaddingRight(node) {\n  return parseInt(window.getComputedStyle(node)['padding-right'], 10) || 0;\n}\n\nfunction ariaHiddenSiblings(container, mountNode, currentNode) {\n  var nodesToExclude = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n  var show = arguments.length > 4 ? arguments[4] : undefined;\n  var blacklist = [mountNode, currentNode].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(nodesToExclude));\n  var blacklistTagNames = ['TEMPLATE', 'SCRIPT', 'STYLE'];\n  [].forEach.call(container.children, function (node) {\n    if (node.nodeType === 1 && blacklist.indexOf(node) === -1 && blacklistTagNames.indexOf(node.tagName) === -1) {\n      ariaHidden(node, show);\n    }\n  });\n}\n\nfunction findIndexOf(containerInfo, callback) {\n  var idx = -1;\n  containerInfo.some(function (item, index) {\n    if (callback(item)) {\n      idx = index;\n      return true;\n    }\n\n    return false;\n  });\n  return idx;\n}\n\nfunction handleContainer(containerInfo, props) {\n  var restoreStyle = [];\n  var restorePaddings = [];\n  var container = containerInfo.container;\n  var fixedNodes;\n\n  if (!props.disableScrollLock) {\n    if (isOverflowing(container)) {\n      // Compute the size before applying overflow hidden to avoid any scroll jumps.\n      var scrollbarSize = Object(_utils_getScrollbarSize__WEBPACK_IMPORTED_MODULE_3__[\"default\"])();\n      restoreStyle.push({\n        value: container.style.paddingRight,\n        key: 'padding-right',\n        el: container\n      }); // Use computed style, here to get the real padding to add our scrollbar width.\n\n      container.style['padding-right'] = \"\".concat(getPaddingRight(container) + scrollbarSize, \"px\"); // .mui-fixed is a global helper.\n\n      fixedNodes = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(container).querySelectorAll('.mui-fixed');\n      [].forEach.call(fixedNodes, function (node) {\n        restorePaddings.push(node.style.paddingRight);\n        node.style.paddingRight = \"\".concat(getPaddingRight(node) + scrollbarSize, \"px\");\n      });\n    } // Improve Gatsby support\n    // https://css-tricks.com/snippets/css/force-vertical-scrollbar/\n\n\n    var parent = container.parentElement;\n    var scrollContainer = parent.nodeName === 'HTML' && window.getComputedStyle(parent)['overflow-y'] === 'scroll' ? parent : container; // Block the scroll even if no scrollbar is visible to account for mobile keyboard\n    // screensize shrink.\n\n    restoreStyle.push({\n      value: scrollContainer.style.overflow,\n      key: 'overflow',\n      el: scrollContainer\n    });\n    scrollContainer.style.overflow = 'hidden';\n  }\n\n  var restore = function restore() {\n    if (fixedNodes) {\n      [].forEach.call(fixedNodes, function (node, i) {\n        if (restorePaddings[i]) {\n          node.style.paddingRight = restorePaddings[i];\n        } else {\n          node.style.removeProperty('padding-right');\n        }\n      });\n    }\n\n    restoreStyle.forEach(function (_ref) {\n      var value = _ref.value,\n          el = _ref.el,\n          key = _ref.key;\n\n      if (value) {\n        el.style.setProperty(key, value);\n      } else {\n        el.style.removeProperty(key);\n      }\n    });\n  };\n\n  return restore;\n}\n\nfunction getHiddenSiblings(container) {\n  var hiddenSiblings = [];\n  [].forEach.call(container.children, function (node) {\n    if (node.getAttribute && node.getAttribute('aria-hidden') === 'true') {\n      hiddenSiblings.push(node);\n    }\n  });\n  return hiddenSiblings;\n}\n/**\n * @ignore - do not document.\n *\n * Proper state management for containers and the modals in those containers.\n * Simplified, but inspired by react-overlay's ModalManager class.\n * Used by the Modal to ensure proper styling of containers.\n */\n\n\nvar ModalManager = /*#__PURE__*/function () {\n  function ModalManager() {\n    Object(_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(this, ModalManager);\n\n    // this.modals[modalIndex] = modal\n    this.modals = []; // this.containers[containerIndex] = {\n    //   modals: [],\n    //   container,\n    //   restore: null,\n    // }\n\n    this.containers = [];\n  }\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(ModalManager, [{\n    key: \"add\",\n    value: function add(modal, container) {\n      var modalIndex = this.modals.indexOf(modal);\n\n      if (modalIndex !== -1) {\n        return modalIndex;\n      }\n\n      modalIndex = this.modals.length;\n      this.modals.push(modal); // If the modal we are adding is already in the DOM.\n\n      if (modal.modalRef) {\n        ariaHidden(modal.modalRef, false);\n      }\n\n      var hiddenSiblingNodes = getHiddenSiblings(container);\n      ariaHiddenSiblings(container, modal.mountNode, modal.modalRef, hiddenSiblingNodes, true);\n      var containerIndex = findIndexOf(this.containers, function (item) {\n        return item.container === container;\n      });\n\n      if (containerIndex !== -1) {\n        this.containers[containerIndex].modals.push(modal);\n        return modalIndex;\n      }\n\n      this.containers.push({\n        modals: [modal],\n        container: container,\n        restore: null,\n        hiddenSiblingNodes: hiddenSiblingNodes\n      });\n      return modalIndex;\n    }\n  }, {\n    key: \"mount\",\n    value: function mount(modal, props) {\n      var containerIndex = findIndexOf(this.containers, function (item) {\n        return item.modals.indexOf(modal) !== -1;\n      });\n      var containerInfo = this.containers[containerIndex];\n\n      if (!containerInfo.restore) {\n        containerInfo.restore = handleContainer(containerInfo, props);\n      }\n    }\n  }, {\n    key: \"remove\",\n    value: function remove(modal) {\n      var modalIndex = this.modals.indexOf(modal);\n\n      if (modalIndex === -1) {\n        return modalIndex;\n      }\n\n      var containerIndex = findIndexOf(this.containers, function (item) {\n        return item.modals.indexOf(modal) !== -1;\n      });\n      var containerInfo = this.containers[containerIndex];\n      containerInfo.modals.splice(containerInfo.modals.indexOf(modal), 1);\n      this.modals.splice(modalIndex, 1); // If that was the last modal in a container, clean up the container.\n\n      if (containerInfo.modals.length === 0) {\n        // The modal might be closed before it had the chance to be mounted in the DOM.\n        if (containerInfo.restore) {\n          containerInfo.restore();\n        }\n\n        if (modal.modalRef) {\n          // In case the modal wasn't in the DOM yet.\n          ariaHidden(modal.modalRef, true);\n        }\n\n        ariaHiddenSiblings(containerInfo.container, modal.mountNode, modal.modalRef, containerInfo.hiddenSiblingNodes, false);\n        this.containers.splice(containerIndex, 1);\n      } else {\n        // Otherwise make sure the next top modal is visible to a screen reader.\n        var nextTop = containerInfo.modals[containerInfo.modals.length - 1]; // as soon as a modal is adding its modalRef is undefined. it can't set\n        // aria-hidden because the dom element doesn't exist either\n        // when modal was unmounted before modalRef gets null\n\n        if (nextTop.modalRef) {\n          ariaHidden(nextTop.modalRef, false);\n        }\n      }\n\n      return modalIndex;\n    }\n  }, {\n    key: \"isTopModal\",\n    value: function isTopModal(modal) {\n      return this.modals.length > 0 && this.modals[this.modals.length - 1] === modal;\n    }\n  }]);\n\n  return ModalManager;\n}();\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js ***!
+  \********************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {\n    zIndex: -1,\n    position: 'fixed',\n    right: 0,\n    bottom: 0,\n    top: 0,\n    left: 0,\n    backgroundColor: 'rgba(0, 0, 0, 0.5)',\n    WebkitTapHighlightColor: 'transparent'\n  },\n\n  /* Styles applied to the root element if `invisible={true}`. */\n  invisible: {\n    backgroundColor: 'transparent'\n  }\n};\n/**\n * @ignore - internal component.\n */\n\nvar SimpleBackdrop = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function SimpleBackdrop(props, ref) {\n  var _props$invisible = props.invisible,\n      invisible = _props$invisible === void 0 ? false : _props$invisible,\n      open = props.open,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"invisible\", \"open\"]);\n\n  return open ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"aria-hidden\": true,\n    ref: ref\n  }, other, {\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, styles.root, invisible ? styles.invisible : {}, other.style)\n  })) : null;\n});\n true ? SimpleBackdrop.propTypes = {\n  /**\n   * If `true`, the backdrop is invisible.\n   * It can be used when rendering a popover or a custom select component.\n   */\n  invisible: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the backdrop is open.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (SimpleBackdrop);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js ***!
+  \***********************************************************************/
+/*! exports provided: default, ModalManager */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Modal */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/Modal.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Modal__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _ModalManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ModalManager */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/ModalManager.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ModalManager\", function() { return _ModalManager__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js":
+/*!*************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js ***!
+  \*************************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _NativeSelectInput__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./NativeSelectInput */ \"./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../internal/svg-icons/ArrowDropDown */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js\");\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/index.js\");\n\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the select component `root` class. */\n    root: {},\n\n    /* Styles applied to the select component `select` class. */\n    select: {\n      '-moz-appearance': 'none',\n      // Reset\n      '-webkit-appearance': 'none',\n      // Reset\n      // When interacting quickly, the text can end up selected.\n      // Native select can't be selected either.\n      userSelect: 'none',\n      borderRadius: 0,\n      // Reset\n      minWidth: 16,\n      // So it doesn't collapse.\n      cursor: 'pointer',\n      '&:focus': {\n        // Show that it's not an text input\n        backgroundColor: theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.05)' : 'rgba(255, 255, 255, 0.05)',\n        borderRadius: 0 // Reset Chrome style\n\n      },\n      // Remove IE 11 arrow\n      '&::-ms-expand': {\n        display: 'none'\n      },\n      '&$disabled': {\n        cursor: 'default'\n      },\n      '&[multiple]': {\n        height: 'auto'\n      },\n      '&:not([multiple]) option, &:not([multiple]) optgroup': {\n        backgroundColor: theme.palette.background.paper\n      },\n      '&&': {\n        paddingRight: 24\n      }\n    },\n\n    /* Styles applied to the select component if `variant=\"filled\"`. */\n    filled: {\n      '&&': {\n        paddingRight: 32\n      }\n    },\n\n    /* Styles applied to the select component if `variant=\"outlined\"`. */\n    outlined: {\n      borderRadius: theme.shape.borderRadius,\n      '&&': {\n        paddingRight: 32\n      }\n    },\n\n    /* Styles applied to the select component `selectMenu` class. */\n    selectMenu: {\n      height: 'auto',\n      // Resets for multpile select with chips\n      minHeight: '1.1876em',\n      // Required for select\\text-field height consistency\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap',\n      overflow: 'hidden'\n    },\n\n    /* Pseudo-class applied to the select component `disabled` class. */\n    disabled: {},\n\n    /* Styles applied to the icon component. */\n    icon: {\n      // We use a position absolute over a flexbox in order to forward the pointer events\n      // to the input and to support wrapping tags..\n      position: 'absolute',\n      right: 0,\n      top: 'calc(50% - 12px)',\n      // Center vertically\n      pointerEvents: 'none',\n      // Don't block pointer events on the select under the icon.\n      color: theme.palette.action.active,\n      '&$disabled': {\n        color: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the icon component if the popup is open. */\n    iconOpen: {\n      transform: 'rotate(180deg)'\n    },\n\n    /* Styles applied to the icon component if `variant=\"filled\"`. */\n    iconFilled: {\n      right: 7\n    },\n\n    /* Styles applied to the icon component if `variant=\"outlined\"`. */\n    iconOutlined: {\n      right: 7\n    },\n\n    /* Styles applied to the underlying native input component. */\n    nativeInput: {\n      bottom: 0,\n      left: 0,\n      position: 'absolute',\n      opacity: 0,\n      pointerEvents: 'none',\n      width: '100%'\n    }\n  };\n};\nvar defaultInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Input__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null);\n/**\n * An alternative to `<Select native />` with a much smaller bundle size footprint.\n */\n\nvar NativeSelect = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function NativeSelect(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      _props$IconComponent = props.IconComponent,\n      IconComponent = _props$IconComponent === void 0 ? _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_8__[\"default\"] : _props$IconComponent,\n      _props$input = props.input,\n      input = _props$input === void 0 ? defaultInput : _props$input,\n      inputProps = props.inputProps,\n      variant = props.variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"IconComponent\", \"input\", \"inputProps\", \"variant\"]);\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['variant']\n  });\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](input, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    // Most of the logic is implemented in `NativeSelectInput`.\n    // The `Select` component is a simple API wrapper to expose something better to play with.\n    inputComponent: _NativeSelectInput__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n    inputProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      children: children,\n      classes: classes,\n      IconComponent: IconComponent,\n      variant: fcs.variant,\n      type: undefined\n    }, inputProps, input ? input.props.inputProps : {}),\n    ref: ref\n  }, other));\n});\n true ? NativeSelect.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The option elements to populate the select with.\n   * Can be some `<option>` elements.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * An `Input` element; does not have to be a material-ui specific `Input`.\n   */\n  input: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.element,\n\n  /**\n   * Attributes applied to the `select` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The input value. The DOM API casts this to a string.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\nNativeSelect.muiName = 'Select';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiNativeSelect'\n})(NativeSelect));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js":
+/*!******************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js ***!
+  \******************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n/**\n * @ignore - internal component.\n */\n\nvar NativeSelectInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function NativeSelectInput(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      disabled = props.disabled,\n      IconComponent = props.IconComponent,\n      inputRef = props.inputRef,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"className\", \"disabled\", \"IconComponent\", \"inputRef\", \"variant\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_2__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"select\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, // TODO v5: merge root and select\n    classes.select, classes[variant], className, disabled && classes.disabled),\n    disabled: disabled,\n    ref: inputRef || ref\n  }, other)), props.multiple ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](IconComponent, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.icon, classes[\"icon\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(variant))], disabled && classes.disabled)\n  }));\n});\n true ? NativeSelectInput.propTypes = {\n  /**\n   * The option elements to populate the select with.\n   * Can be some `<option>` elements.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * The CSS class name of the select element.\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the select will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType.isRequired,\n\n  /**\n   * Use that prop to pass a ref to the native select element.\n   * @deprecated\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * @ignore\n   */\n  multiple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `select` or hidden `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The input value.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['standard', 'outlined', 'filled'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (NativeSelectInput);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js":
+/*!****************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js ***!
+  \****************************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _styles_useTheme__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles/useTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'absolute',\n      bottom: 0,\n      right: 0,\n      top: -5,\n      left: 0,\n      margin: 0,\n      padding: '0 8px',\n      pointerEvents: 'none',\n      borderRadius: 'inherit',\n      borderStyle: 'solid',\n      borderWidth: 1,\n      overflow: 'hidden'\n    },\n\n    /* Styles applied to the legend element when `labelWidth` is provided. */\n    legend: {\n      textAlign: 'left',\n      padding: 0,\n      lineHeight: '11px',\n      // sync with `height` in `legend` styles\n      transition: theme.transitions.create('width', {\n        duration: 150,\n        easing: theme.transitions.easing.easeOut\n      })\n    },\n\n    /* Styles applied to the legend element. */\n    legendLabelled: {\n      display: 'block',\n      width: 'auto',\n      textAlign: 'left',\n      padding: 0,\n      height: 11,\n      // sync with `lineHeight` in `legend` styles\n      fontSize: '0.75em',\n      visibility: 'hidden',\n      maxWidth: 0.01,\n      transition: theme.transitions.create('max-width', {\n        duration: 50,\n        easing: theme.transitions.easing.easeOut\n      }),\n      '& > span': {\n        paddingLeft: 5,\n        paddingRight: 5,\n        display: 'inline-block'\n      }\n    },\n\n    /* Styles applied to the legend element is notched. */\n    legendNotched: {\n      maxWidth: 1000,\n      transition: theme.transitions.create('max-width', {\n        duration: 100,\n        easing: theme.transitions.easing.easeOut,\n        delay: 50\n      })\n    }\n  };\n};\n/**\n * @ignore - internal component.\n */\n\nvar NotchedOutline = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function NotchedOutline(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      label = props.label,\n      labelWidthProp = props.labelWidth,\n      notched = props.notched,\n      style = props.style,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"label\", \"labelWidth\", \"notched\", \"style\"]);\n\n  var theme = Object(_styles_useTheme__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var align = theme.direction === 'rtl' ? 'right' : 'left';\n\n  if (label !== undefined) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"fieldset\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      \"aria-hidden\": true,\n      className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className),\n      ref: ref,\n      style: style\n    }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"legend\", {\n      className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.legendLabelled, notched && classes.legendNotched)\n    }, label ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", null, label) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", {\n      dangerouslySetInnerHTML: {\n        __html: '&#8203;'\n      }\n    })));\n  }\n\n  var labelWidth = labelWidthProp > 0 ? labelWidthProp * 0.75 + 8 : 0.01;\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"fieldset\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    \"aria-hidden\": true,\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, \"padding\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(align)), 8), style),\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className),\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"legend\", {\n    className: classes.legend,\n    style: {\n      // IE 11: fieldset with legend does not render\n      // a border radius. This maintains consistency\n      // by always having a legend rendered\n      width: notched ? labelWidth : 0.01\n    }\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"span\", {\n    dangerouslySetInnerHTML: {\n      __html: '&#8203;'\n    }\n  })));\n});\n true ? NotchedOutline.propTypes = {\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * The label.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * The width of the label.\n   */\n  labelWidth: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number.isRequired,\n\n  /**\n   * If `true`, the outline is notched to accommodate the label.\n   */\n  notched: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool.isRequired,\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'PrivateNotchedOutline'\n})(NotchedOutline));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js":
+/*!***************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js ***!
+  \***************************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _InputBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../InputBase */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/index.js\");\n/* harmony import */ var _NotchedOutline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./NotchedOutline */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var borderColor = theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)';\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      position: 'relative',\n      borderRadius: theme.shape.borderRadius,\n      '&:hover $notchedOutline': {\n        borderColor: theme.palette.text.primary\n      },\n      // Reset on touch devices, it doesn't add specificity\n      '@media (hover: none)': {\n        '&:hover $notchedOutline': {\n          borderColor: borderColor\n        }\n      },\n      '&$focused $notchedOutline': {\n        borderColor: theme.palette.primary.main,\n        borderWidth: 2\n      },\n      '&$error $notchedOutline': {\n        borderColor: theme.palette.error.main\n      },\n      '&$disabled $notchedOutline': {\n        borderColor: theme.palette.action.disabled\n      }\n    },\n\n    /* Styles applied to the root element if the color is secondary. */\n    colorSecondary: {\n      '&$focused $notchedOutline': {\n        borderColor: theme.palette.secondary.main\n      }\n    },\n\n    /* Styles applied to the root element if the component is focused. */\n    focused: {},\n\n    /* Styles applied to the root element if `disabled={true}`. */\n    disabled: {},\n\n    /* Styles applied to the root element if `startAdornment` is provided. */\n    adornedStart: {\n      paddingLeft: 14\n    },\n\n    /* Styles applied to the root element if `endAdornment` is provided. */\n    adornedEnd: {\n      paddingRight: 14\n    },\n\n    /* Pseudo-class applied to the root element if `error={true}`. */\n    error: {},\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    marginDense: {},\n\n    /* Styles applied to the root element if `multiline={true}`. */\n    multiline: {\n      padding: '18.5px 14px',\n      '&$marginDense': {\n        paddingTop: 10.5,\n        paddingBottom: 10.5\n      }\n    },\n\n    /* Styles applied to the `NotchedOutline` element. */\n    notchedOutline: {\n      borderColor: borderColor\n    },\n\n    /* Styles applied to the `input` element. */\n    input: {\n      padding: '18.5px 14px',\n      '&:-webkit-autofill': {\n        WebkitBoxShadow: theme.palette.type === 'light' ? null : '0 0 0 100px #266798 inset',\n        WebkitTextFillColor: theme.palette.type === 'light' ? null : '#fff',\n        caretColor: theme.palette.type === 'light' ? null : '#fff',\n        borderRadius: 'inherit'\n      }\n    },\n\n    /* Styles applied to the `input` element if `margin=\"dense\"`. */\n    inputMarginDense: {\n      paddingTop: 10.5,\n      paddingBottom: 10.5\n    },\n\n    /* Styles applied to the `input` element if `multiline={true}`. */\n    inputMultiline: {\n      padding: 0\n    },\n\n    /* Styles applied to the `input` element if `startAdornment` is provided. */\n    inputAdornedStart: {\n      paddingLeft: 0\n    },\n\n    /* Styles applied to the `input` element if `endAdornment` is provided. */\n    inputAdornedEnd: {\n      paddingRight: 0\n    }\n  };\n};\nvar OutlinedInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function OutlinedInput(props, ref) {\n  var classes = props.classes,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      _props$inputComponent = props.inputComponent,\n      inputComponent = _props$inputComponent === void 0 ? 'input' : _props$inputComponent,\n      label = props.label,\n      _props$labelWidth = props.labelWidth,\n      labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      notched = props.notched,\n      _props$type = props.type,\n      type = _props$type === void 0 ? 'text' : _props$type,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"fullWidth\", \"inputComponent\", \"label\", \"labelWidth\", \"multiline\", \"notched\", \"type\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputBase__WEBPACK_IMPORTED_MODULE_6__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    renderSuffix: function renderSuffix(state) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_NotchedOutline__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n        className: classes.notchedOutline,\n        label: label,\n        labelWidth: labelWidth,\n        notched: typeof notched !== 'undefined' ? notched : Boolean(state.startAdornment || state.filled || state.focused)\n      });\n    },\n    classes: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, classes, {\n      root: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, classes.underline),\n      notchedOutline: null\n    }),\n    fullWidth: fullWidth,\n    inputComponent: inputComponent,\n    multiline: multiline,\n    ref: ref,\n    type: type\n  }, other));\n});\n true ? OutlinedInput.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default `input` element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * End `InputAdornment` for this component.\n   */\n  endAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `true`, the input will indicate an error. This is normally obtained via context from\n   * FormControl.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the `input` element.\n   * Either a string to use a HTML element or a component.\n   */\n  inputComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * The label of the input. It is only used for layout. The actual labelling\n   * is handled by `InputLabel`. If specified `labelWidth` is ignored.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The width of the label. Is ignored if `label` is provided. Prefer `label`\n   * if the input label appears with a strike through.\n   */\n  labelWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * If `dense`, will adjust vertical spacing. This is normally obtained via context from\n   * FormControl.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none']),\n\n  /**\n   * If `true`, a textarea element will be rendered.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the outline is notched to accommodate the label.\n   */\n  notched: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Start `InputAdornment` for this component.\n   */\n  startAdornment: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any\n} : undefined;\nOutlinedInput.muiName = 'Input';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiOutlinedInput'\n})(OutlinedInput));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _OutlinedInput__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./OutlinedInput */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _OutlinedInput__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js ***!
+  \***********************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  var elevations = {};\n  theme.shadows.forEach(function (shadow, index) {\n    elevations[\"elevation\".concat(index)] = {\n      boxShadow: shadow\n    };\n  });\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    /* Styles applied to the root element. */\n    root: {\n      backgroundColor: theme.palette.background.paper,\n      color: theme.palette.text.primary,\n      transition: theme.transitions.create('box-shadow')\n    },\n\n    /* Styles applied to the root element if `square={false}`. */\n    rounded: {\n      borderRadius: theme.shape.borderRadius\n    },\n\n    /* Styles applied to the root element if `variant=\"outlined\"`. */\n    outlined: {\n      border: \"1px solid \".concat(theme.palette.divider)\n    }\n  }, elevations);\n};\nvar Paper = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Paper(props, ref) {\n  var classes = props.classes,\n      className = props.className,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'div' : _props$component,\n      _props$square = props.square,\n      square = _props$square === void 0 ? false : _props$square,\n      _props$elevation = props.elevation,\n      elevation = _props$elevation === void 0 ? 1 : _props$elevation,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'elevation' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(props, [\"classes\", \"className\", \"component\", \"square\", \"elevation\", \"variant\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, variant === 'outlined' ? classes.outlined : classes[\"elevation\".concat(elevation)], !square && classes.rounded),\n    ref: ref\n  }, other));\n});\n true ? Paper.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * Shadow depth, corresponds to `dp` in the spec.\n   * It accepts values between 0 and 24 inclusive.\n   */\n  elevation: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, function (props) {\n    var classes = props.classes,\n        elevation = props.elevation; // in case `withStyles` fails to inject we don't need this warning\n\n    if (classes === undefined) {\n      return null;\n    }\n\n    if (elevation != null && classes[\"elevation\".concat(elevation)] === undefined) {\n      return new Error(\"Material-UI: This elevation `\".concat(elevation, \"` is not implemented.\"));\n    }\n\n    return null;\n  }),\n\n  /**\n   * If `true`, rounded corners are disabled.\n   */\n  square: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['elevation', 'outlined'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(styles, {\n  name: 'MuiPaper'\n})(Paper));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js ***!
+  \***********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Paper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Paper */ \"./jaas-client/node_modules/@material-ui/core/esm/Paper/Paper.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Paper__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js ***!
+  \***************************************************************************/
+/*! exports provided: getOffsetTop, getOffsetLeft, styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getOffsetTop\", function() { return getOffsetTop; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getOffsetLeft\", function() { return getOffsetLeft; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/debounce */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_ownerWindow__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/ownerWindow */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js\");\n/* harmony import */ var _utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/createChainedFunction */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Modal */ \"./jaas-client/node_modules/@material-ui/core/esm/Modal/index.js\");\n/* harmony import */ var _Grow__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Grow */ \"./jaas-client/node_modules/@material-ui/core/esm/Grow/index.js\");\n/* harmony import */ var _Paper__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Paper */ \"./jaas-client/node_modules/@material-ui/core/esm/Paper/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getOffsetTop(rect, vertical) {\n  var offset = 0;\n\n  if (typeof vertical === 'number') {\n    offset = vertical;\n  } else if (vertical === 'center') {\n    offset = rect.height / 2;\n  } else if (vertical === 'bottom') {\n    offset = rect.height;\n  }\n\n  return offset;\n}\nfunction getOffsetLeft(rect, horizontal) {\n  var offset = 0;\n\n  if (typeof horizontal === 'number') {\n    offset = horizontal;\n  } else if (horizontal === 'center') {\n    offset = rect.width / 2;\n  } else if (horizontal === 'right') {\n    offset = rect.width;\n  }\n\n  return offset;\n}\n\nfunction getTransformOriginValue(transformOrigin) {\n  return [transformOrigin.horizontal, transformOrigin.vertical].map(function (n) {\n    return typeof n === 'number' ? \"\".concat(n, \"px\") : n;\n  }).join(' ');\n} // Sum the scrollTop between two elements.\n\n\nfunction getScrollParent(parent, child) {\n  var element = child;\n  var scrollTop = 0;\n\n  while (element && element !== parent) {\n    element = element.parentElement;\n    scrollTop += element.scrollTop;\n  }\n\n  return scrollTop;\n}\n\nfunction getAnchorEl(anchorEl) {\n  return typeof anchorEl === 'function' ? anchorEl() : anchorEl;\n}\n\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {},\n\n  /* Styles applied to the `Paper` component. */\n  paper: {\n    position: 'absolute',\n    overflowY: 'auto',\n    overflowX: 'hidden',\n    // So we see the popover when it's empty.\n    // It's most likely on issue on userland.\n    minWidth: 16,\n    minHeight: 16,\n    maxWidth: 'calc(100% - 32px)',\n    maxHeight: 'calc(100% - 32px)',\n    // We disable the focus ring for mouse, touch and keyboard users.\n    outline: 0\n  }\n};\nvar Popover = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Popover(props, ref) {\n  var action = props.action,\n      anchorEl = props.anchorEl,\n      _props$anchorOrigin = props.anchorOrigin,\n      anchorOrigin = _props$anchorOrigin === void 0 ? {\n    vertical: 'top',\n    horizontal: 'left'\n  } : _props$anchorOrigin,\n      anchorPosition = props.anchorPosition,\n      _props$anchorReferenc = props.anchorReference,\n      anchorReference = _props$anchorReferenc === void 0 ? 'anchorEl' : _props$anchorReferenc,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      containerProp = props.container,\n      _props$elevation = props.elevation,\n      elevation = _props$elevation === void 0 ? 8 : _props$elevation,\n      getContentAnchorEl = props.getContentAnchorEl,\n      _props$marginThreshol = props.marginThreshold,\n      marginThreshold = _props$marginThreshol === void 0 ? 16 : _props$marginThreshol,\n      onEnter = props.onEnter,\n      onEntered = props.onEntered,\n      onEntering = props.onEntering,\n      onExit = props.onExit,\n      onExited = props.onExited,\n      onExiting = props.onExiting,\n      open = props.open,\n      _props$PaperProps = props.PaperProps,\n      PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps,\n      _props$transformOrigi = props.transformOrigin,\n      transformOrigin = _props$transformOrigi === void 0 ? {\n    vertical: 'top',\n    horizontal: 'left'\n  } : _props$transformOrigi,\n      _props$TransitionComp = props.TransitionComponent,\n      TransitionComponent = _props$TransitionComp === void 0 ? _Grow__WEBPACK_IMPORTED_MODULE_13__[\"default\"] : _props$TransitionComp,\n      _props$transitionDura = props.transitionDuration,\n      transitionDurationProp = _props$transitionDura === void 0 ? 'auto' : _props$transitionDura,\n      _props$TransitionProp = props.TransitionProps,\n      TransitionProps = _props$TransitionProp === void 0 ? {} : _props$TransitionProp,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"action\", \"anchorEl\", \"anchorOrigin\", \"anchorPosition\", \"anchorReference\", \"children\", \"classes\", \"className\", \"container\", \"elevation\", \"getContentAnchorEl\", \"marginThreshold\", \"onEnter\", \"onEntered\", \"onEntering\", \"onExit\", \"onExited\", \"onExiting\", \"open\", \"PaperProps\", \"transformOrigin\", \"TransitionComponent\", \"transitionDuration\", \"TransitionProps\"]);\n\n  var paperRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](); // Returns the top/left offset of the position\n  // to attach to on the anchor element (or body if none is provided)\n\n  var getAnchorOffset = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (contentAnchorOffset) {\n    if (anchorReference === 'anchorPosition') {\n      if (true) {\n        if (!anchorPosition) {\n          console.error('Material-UI: You need to provide a `anchorPosition` prop when using ' + '<Popover anchorReference=\"anchorPosition\" />.');\n        }\n      }\n\n      return anchorPosition;\n    }\n\n    var resolvedAnchorEl = getAnchorEl(anchorEl); // If an anchor element wasn't provided, just use the parent body element of this Popover\n\n    var anchorElement = resolvedAnchorEl && resolvedAnchorEl.nodeType === 1 ? resolvedAnchorEl : Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(paperRef.current).body;\n    var anchorRect = anchorElement.getBoundingClientRect();\n\n    if (true) {\n      var box = anchorElement.getBoundingClientRect();\n\n      if ( true && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n        console.warn(['Material-UI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n      }\n    }\n\n    var anchorVertical = contentAnchorOffset === 0 ? anchorOrigin.vertical : 'center';\n    return {\n      top: anchorRect.top + getOffsetTop(anchorRect, anchorVertical),\n      left: anchorRect.left + getOffsetLeft(anchorRect, anchorOrigin.horizontal)\n    };\n  }, [anchorEl, anchorOrigin.horizontal, anchorOrigin.vertical, anchorPosition, anchorReference]); // Returns the vertical offset of inner content to anchor the transform on if provided\n\n  var getContentAnchorOffset = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (element) {\n    var contentAnchorOffset = 0;\n\n    if (getContentAnchorEl && anchorReference === 'anchorEl') {\n      var contentAnchorEl = getContentAnchorEl(element);\n\n      if (contentAnchorEl && element.contains(contentAnchorEl)) {\n        var scrollTop = getScrollParent(element, contentAnchorEl);\n        contentAnchorOffset = contentAnchorEl.offsetTop + contentAnchorEl.clientHeight / 2 - scrollTop || 0;\n      } // != the default value\n\n\n      if (true) {\n        if (anchorOrigin.vertical !== 'top') {\n          console.error(['Material-UI: You can not change the default `anchorOrigin.vertical` value ', 'when also providing the `getContentAnchorEl` prop to the popover component.', 'Only use one of the two props.', 'Set `getContentAnchorEl` to `null | undefined`' + ' or leave `anchorOrigin.vertical` unchanged.'].join('\\n'));\n        }\n      }\n    }\n\n    return contentAnchorOffset;\n  }, [anchorOrigin.vertical, anchorReference, getContentAnchorEl]); // Return the base transform origin using the element\n  // and taking the content anchor offset into account if in use\n\n  var getTransformOrigin = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (elemRect) {\n    var contentAnchorOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    return {\n      vertical: getOffsetTop(elemRect, transformOrigin.vertical) + contentAnchorOffset,\n      horizontal: getOffsetLeft(elemRect, transformOrigin.horizontal)\n    };\n  }, [transformOrigin.horizontal, transformOrigin.vertical]);\n  var getPositioningStyle = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (element) {\n    // Check if the parent has requested anchoring on an inner content node\n    var contentAnchorOffset = getContentAnchorOffset(element);\n    var elemRect = {\n      width: element.offsetWidth,\n      height: element.offsetHeight\n    }; // Get the transform origin point on the element itself\n\n    var elemTransformOrigin = getTransformOrigin(elemRect, contentAnchorOffset);\n\n    if (anchorReference === 'none') {\n      return {\n        top: null,\n        left: null,\n        transformOrigin: getTransformOriginValue(elemTransformOrigin)\n      };\n    } // Get the offset of of the anchoring element\n\n\n    var anchorOffset = getAnchorOffset(contentAnchorOffset); // Calculate element positioning\n\n    var top = anchorOffset.top - elemTransformOrigin.vertical;\n    var left = anchorOffset.left - elemTransformOrigin.horizontal;\n    var bottom = top + elemRect.height;\n    var right = left + elemRect.width; // Use the parent window of the anchorEl if provided\n\n    var containerWindow = Object(_utils_ownerWindow__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(getAnchorEl(anchorEl)); // Window thresholds taking required margin into account\n\n    var heightThreshold = containerWindow.innerHeight - marginThreshold;\n    var widthThreshold = containerWindow.innerWidth - marginThreshold; // Check if the vertical axis needs shifting\n\n    if (top < marginThreshold) {\n      var diff = top - marginThreshold;\n      top -= diff;\n      elemTransformOrigin.vertical += diff;\n    } else if (bottom > heightThreshold) {\n      var _diff = bottom - heightThreshold;\n\n      top -= _diff;\n      elemTransformOrigin.vertical += _diff;\n    }\n\n    if (true) {\n      if (elemRect.height > heightThreshold && elemRect.height && heightThreshold) {\n        console.error(['Material-UI: The popover component is too tall.', \"Some part of it can not be seen on the screen (\".concat(elemRect.height - heightThreshold, \"px).\"), 'Please consider adding a `max-height` to improve the user-experience.'].join('\\n'));\n      }\n    } // Check if the horizontal axis needs shifting\n\n\n    if (left < marginThreshold) {\n      var _diff2 = left - marginThreshold;\n\n      left -= _diff2;\n      elemTransformOrigin.horizontal += _diff2;\n    } else if (right > widthThreshold) {\n      var _diff3 = right - widthThreshold;\n\n      left -= _diff3;\n      elemTransformOrigin.horizontal += _diff3;\n    }\n\n    return {\n      top: \"\".concat(Math.round(top), \"px\"),\n      left: \"\".concat(Math.round(left), \"px\"),\n      transformOrigin: getTransformOriginValue(elemTransformOrigin)\n    };\n  }, [anchorEl, anchorReference, getAnchorOffset, getContentAnchorOffset, getTransformOrigin, marginThreshold]);\n  var setPositioningStyles = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    var element = paperRef.current;\n\n    if (!element) {\n      return;\n    }\n\n    var positioning = getPositioningStyle(element);\n\n    if (positioning.top !== null) {\n      element.style.top = positioning.top;\n    }\n\n    if (positioning.left !== null) {\n      element.style.left = positioning.left;\n    }\n\n    element.style.transformOrigin = positioning.transformOrigin;\n  }, [getPositioningStyle]);\n\n  var handleEntering = function handleEntering(element, isAppearing) {\n    if (onEntering) {\n      onEntering(element, isAppearing);\n    }\n\n    setPositioningStyles();\n  };\n\n  var handlePaperRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    paperRef.current = react_dom__WEBPACK_IMPORTED_MODULE_4__[\"findDOMNode\"](instance);\n  }, []);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (open) {\n      setPositioningStyles();\n    }\n  });\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useImperativeHandle\"](action, function () {\n    return open ? {\n      updatePosition: function updatePosition() {\n        setPositioningStyles();\n      }\n    } : null;\n  }, [open, setPositioningStyles]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    if (!open) {\n      return undefined;\n    }\n\n    var handleResize = Object(_utils_debounce__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(function () {\n      setPositioningStyles();\n    });\n    window.addEventListener('resize', handleResize);\n    return function () {\n      handleResize.clear();\n      window.removeEventListener('resize', handleResize);\n    };\n  }, [open, setPositioningStyles]);\n  var transitionDuration = transitionDurationProp;\n\n  if (transitionDurationProp === 'auto' && !TransitionComponent.muiSupportAuto) {\n    transitionDuration = undefined;\n  } // If the container prop is provided, use that\n  // If the anchorEl prop is provided, use its parent body element as the container\n  // If neither are provided let the Modal take care of choosing the container\n\n\n  var container = containerProp || (anchorEl ? Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(getAnchorEl(anchorEl)).body : undefined);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Modal__WEBPACK_IMPORTED_MODULE_12__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    container: container,\n    open: open,\n    ref: ref,\n    BackdropProps: {\n      invisible: true\n    },\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(classes.root, className)\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](TransitionComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    appear: true,\n    in: open,\n    onEnter: onEnter,\n    onEntered: onEntered,\n    onExit: onExit,\n    onExited: onExited,\n    onExiting: onExiting,\n    timeout: transitionDuration\n  }, TransitionProps, {\n    onEntering: Object(_utils_createChainedFunction__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(handleEntering, TransitionProps.onEntering)\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Paper__WEBPACK_IMPORTED_MODULE_14__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    elevation: elevation,\n    ref: handlePaperRef\n  }, PaperProps, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(classes.paper, PaperProps.className)\n  }), children)));\n});\n true ? Popover.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A ref for imperative actions.\n   * It currently only supports updatePosition() action.\n   */\n  action: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * A HTML element, or a function that returns it.\n   * It's used to set the position of the popover.\n   */\n  anchorEl: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func]), function (props) {\n    if (props.open && (!props.anchorReference || props.anchorReference === 'anchorEl')) {\n      var resolvedAnchorEl = getAnchorEl(props.anchorEl);\n\n      if (resolvedAnchorEl && resolvedAnchorEl.nodeType === 1) {\n        var box = resolvedAnchorEl.getBoundingClientRect();\n\n        if ( true && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {\n          return new Error(['Material-UI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', \"Make sure the element is present in the document or that it's not display none.\"].join('\\n'));\n        }\n      } else {\n        return new Error(['Material-UI: The `anchorEl` prop provided to the component is invalid.', \"It should be an Element instance but it's `\".concat(resolvedAnchorEl, \"` instead.\")].join('\\n'));\n      }\n    }\n\n    return null;\n  }),\n\n  /**\n   * This is the point on the anchor where the popover's\n   * `anchorEl` will attach to. This is not used when the\n   * anchorReference is 'anchorPosition'.\n   *\n   * Options:\n   * vertical: [top, center, bottom];\n   * horizontal: [left, center, right].\n   */\n  anchorOrigin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    horizontal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['center', 'left', 'right']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired,\n    vertical: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['bottom', 'center', 'top']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired\n  }),\n\n  /**\n   * This is the position that may be used\n   * to set the position of the popover.\n   * The coordinates are relative to\n   * the application's client area.\n   */\n  anchorPosition: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    left: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number.isRequired,\n    top: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number.isRequired\n  }),\n\n  /**\n   * This determines which anchor prop to refer to to set\n   * the position of the popover.\n   */\n  anchorReference: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['anchorEl', 'anchorPosition', 'none']),\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * A HTML element, component instance, or function that returns either.\n   * The `container` will passed to the Modal component.\n   *\n   * By default, it uses the body of the anchorEl's top-level document object,\n   * so it's simply `document.body` most of the time.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.instanceOf(react__WEBPACK_IMPORTED_MODULE_2__[\"Component\"]), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func]),\n\n  /**\n   * The elevation of the popover.\n   */\n  elevation: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * This function is called in order to retrieve the content anchor element.\n   * It's the opposite of the `anchorEl` prop.\n   * The content anchor element should be an element inside the popover.\n   * It's used to correctly scroll and set the position of the popover.\n   * The positioning strategy tries to make the content anchor element just above the\n   * anchor element.\n   */\n  getContentAnchorEl: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Specifies how close to the edge of the window the popover can appear.\n   */\n  marginThreshold: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired before the component is entering.\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component has entered.\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component is entering.\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired before the component is exiting.\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component has exited.\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component is exiting.\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * If `true`, the popover is visible.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool.isRequired,\n\n  /**\n   * Props applied to the [`Paper`](/api/paper/) element.\n   */\n  PaperProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .shape({\n    component: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"elementTypeAcceptingRef\"]\n  }),\n\n  /**\n   * This is the point on the popover which\n   * will attach to the anchor's origin.\n   *\n   * Options:\n   * vertical: [top, center, bottom, x(px)];\n   * horizontal: [left, center, right, x(px)].\n   */\n  transformOrigin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    horizontal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['center', 'left', 'right']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired,\n    vertical: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['bottom', 'center', 'top']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number]).isRequired\n  }),\n\n  /**\n   * The component used for the transition.\n   * [Follow this guide](/components/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.\n   */\n  TransitionComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * Set to 'auto' to automatically calculate transition time based on height.\n   */\n  transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['auto']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.shape({\n    appear: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    enter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n    exit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number\n  })]),\n\n  /**\n   * Props applied to the [`Transition`](http://reactcommunity.org/react-transition-group/transition#Transition-props) element.\n   */\n  TransitionProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_11__[\"default\"])(styles, {\n  name: 'MuiPopover'\n})(Popover));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Popover__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popover */ \"./jaas-client/node_modules/@material-ui/core/esm/Popover/Popover.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Popover__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Popover/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_setRef__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/setRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\nfunction getContainer(container) {\n  container = typeof container === 'function' ? container() : container; // #StrictMode ready\n\n  return react_dom__WEBPACK_IMPORTED_MODULE_1__[\"findDOMNode\"](container);\n}\n\nvar useEnhancedEffect = typeof window !== 'undefined' ? react__WEBPACK_IMPORTED_MODULE_0__[\"useLayoutEffect\"] : react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"];\n/**\n * Portals provide a first-class way to render children into a DOM node\n * that exists outside the DOM hierarchy of the parent component.\n */\n\nvar Portal = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"forwardRef\"](function Portal(props, ref) {\n  var children = props.children,\n      container = props.container,\n      _props$disablePortal = props.disablePortal,\n      disablePortal = _props$disablePortal === void 0 ? false : _props$disablePortal,\n      onRendered = props.onRendered;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"](null),\n      mountNode = _React$useState[0],\n      setMountNode = _React$useState[1];\n\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"](children) ? children.ref : null, ref);\n  useEnhancedEffect(function () {\n    if (!disablePortal) {\n      setMountNode(getContainer(container) || document.body);\n    }\n  }, [container, disablePortal]);\n  useEnhancedEffect(function () {\n    if (mountNode && !disablePortal) {\n      Object(_utils_setRef__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(ref, mountNode);\n      return function () {\n        Object(_utils_setRef__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(ref, null);\n      };\n    }\n\n    return undefined;\n  }, [ref, mountNode, disablePortal]);\n  useEnhancedEffect(function () {\n    if (onRendered && (mountNode || disablePortal)) {\n      onRendered();\n    }\n  }, [onRendered, mountNode, disablePortal]);\n\n  if (disablePortal) {\n    if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"](children)) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"](children, {\n        ref: handleRef\n      });\n    }\n\n    return children;\n  }\n\n  return mountNode ? /*#__PURE__*/react_dom__WEBPACK_IMPORTED_MODULE_1__[\"createPortal\"](children, mountNode) : mountNode;\n});\n true ? Portal.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * The children to render into the `container`.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n\n  /**\n   * A HTML element, component instance, or function that returns either.\n   * The `container` will have the portal children appended to it.\n   *\n   * By default, it uses the body of the top-level document object,\n   * so it's simply `document.body` most of the time.\n   */\n  container: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a\n  /* @typescript-to-proptypes-ignore */\n  .oneOfType([_material_ui_utils__WEBPACK_IMPORTED_MODULE_3__[\"HTMLElementType\"], prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func]),\n\n  /**\n   * Disable the portal behavior.\n   * The children stay within it's parent DOM hierarchy.\n   */\n  disablePortal: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Callback fired once the children has been mounted into the `container`.\n   *\n   * This prop will be deprecated and removed in v5, the ref can be used instead.\n   */\n  onRendered: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func\n} : undefined;\n\nif (true) {\n  // eslint-disable-next-line\n  Portal['propTypes' + ''] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_3__[\"exactProp\"])(Portal.propTypes);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Portal);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Portal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Portal */ \"./jaas-client/node_modules/@material-ui/core/esm/Portal/Portal.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Portal__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Portal/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js ***!
+  \*************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _SelectInput__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./SelectInput */ \"./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js\");\n/* harmony import */ var _FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/formControlState */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/formControlState.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../internal/svg-icons/ArrowDropDown */ \"./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js\");\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/index.js\");\n/* harmony import */ var _NativeSelect_NativeSelect__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../NativeSelect/NativeSelect */ \"./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js\");\n/* harmony import */ var _NativeSelect_NativeSelectInput__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../NativeSelect/NativeSelectInput */ \"./jaas-client/node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js\");\n/* harmony import */ var _FilledInput__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../FilledInput */ \"./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js\");\n/* harmony import */ var _OutlinedInput__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../OutlinedInput */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar styles = _NativeSelect_NativeSelect__WEBPACK_IMPORTED_MODULE_11__[\"styles\"];\n\nvar _ref = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Input__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null);\n\nvar _ref2 = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FilledInput__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null);\n\nvar Select = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Select(props, ref) {\n  var _props$autoWidth = props.autoWidth,\n      autoWidth = _props$autoWidth === void 0 ? false : _props$autoWidth,\n      children = props.children,\n      classes = props.classes,\n      _props$displayEmpty = props.displayEmpty,\n      displayEmpty = _props$displayEmpty === void 0 ? false : _props$displayEmpty,\n      _props$IconComponent = props.IconComponent,\n      IconComponent = _props$IconComponent === void 0 ? _internal_svg_icons_ArrowDropDown__WEBPACK_IMPORTED_MODULE_9__[\"default\"] : _props$IconComponent,\n      id = props.id,\n      input = props.input,\n      inputProps = props.inputProps,\n      label = props.label,\n      labelId = props.labelId,\n      _props$labelWidth = props.labelWidth,\n      labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth,\n      MenuProps = props.MenuProps,\n      _props$multiple = props.multiple,\n      multiple = _props$multiple === void 0 ? false : _props$multiple,\n      _props$native = props.native,\n      native = _props$native === void 0 ? false : _props$native,\n      onClose = props.onClose,\n      onOpen = props.onOpen,\n      open = props.open,\n      renderValue = props.renderValue,\n      SelectDisplayProps = props.SelectDisplayProps,\n      _props$variant = props.variant,\n      variantProps = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"autoWidth\", \"children\", \"classes\", \"displayEmpty\", \"IconComponent\", \"id\", \"input\", \"inputProps\", \"label\", \"labelId\", \"labelWidth\", \"MenuProps\", \"multiple\", \"native\", \"onClose\", \"onOpen\", \"open\", \"renderValue\", \"SelectDisplayProps\", \"variant\"]);\n\n  var inputComponent = native ? _NativeSelect_NativeSelectInput__WEBPACK_IMPORTED_MODULE_12__[\"default\"] : _SelectInput__WEBPACK_IMPORTED_MODULE_5__[\"default\"];\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_7__[\"default\"])();\n  var fcs = Object(_FormControl_formControlState__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n    props: props,\n    muiFormControl: muiFormControl,\n    states: ['variant']\n  });\n  var variant = fcs.variant || variantProps;\n  var InputComponent = input || {\n    standard: _ref,\n    outlined: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_OutlinedInput__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n      label: label,\n      labelWidth: labelWidth\n    }),\n    filled: _ref2\n  }[variant];\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"cloneElement\"](InputComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    // Most of the logic is implemented in `SelectInput`.\n    // The `Select` component is a simple API wrapper to expose something better to play with.\n    inputComponent: inputComponent,\n    inputProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      children: children,\n      IconComponent: IconComponent,\n      variant: variant,\n      type: undefined,\n      // We render a select. We can ignore the type provided by the `Input`.\n      multiple: multiple\n    }, native ? {\n      id: id\n    } : {\n      autoWidth: autoWidth,\n      displayEmpty: displayEmpty,\n      labelId: labelId,\n      MenuProps: MenuProps,\n      onClose: onClose,\n      onOpen: onOpen,\n      open: open,\n      renderValue: renderValue,\n      SelectDisplayProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        id: id\n      }, SelectDisplayProps)\n    }, inputProps, {\n      classes: inputProps ? Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_4__[\"mergeClasses\"])({\n        baseClasses: classes,\n        newClasses: inputProps.classes,\n        Component: Select\n      }) : classes\n    }, input ? input.props.inputProps : {}),\n    ref: ref\n  }, other));\n});\n true ? Select.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * If `true`, the width of the popover will automatically be set according to the items inside the\n   * menu, otherwise it will be at least the width of the select input.\n   */\n  autoWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The option elements to populate the select with.\n   * Can be some `MenuItem` when `native` is false and `option` when `native` is true.\n   *\n   * ⚠️The `MenuItem` elements **must** be direct descendants when `native` is false.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The default element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, a value is displayed even if no items are selected.\n   *\n   * In order to display a meaningful value, a function should be passed to the `renderValue` prop which returns the value to be displayed when no items are selected.\n   * You can only use it when the `native` prop is `false` (default).\n   */\n  displayEmpty: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType,\n\n  /**\n   * The `id` of the wrapper element or the `select` element when `native`.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * An `Input` element; does not have to be a material-ui specific `Input`.\n   */\n  input: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.element,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   * When `native` is `true`, the attributes are applied on the `select` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * See [OutlinedInput#label](/api/outlined-input/#props)\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * The ID of an element that acts as an additional label. The Select will\n   * be labelled by the additional label and the selected value.\n   */\n  labelId: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * See [OutlinedInput#label](/api/outlined-input/#props)\n   */\n  labelWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n\n  /**\n   * Props applied to the [`Menu`](/api/menu/) element.\n   */\n  MenuProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * If `true`, `value` must be an array and the menu will support multiple selections.\n   */\n  multiple: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the component will be using a native `select` element.\n   */\n  native: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (any).\n   * @param {object} [child] The react element that was selected when `native` is `false` (default).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be opened.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onOpen: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Control `select` open state.\n   * You can only use it when the `native` prop is `false` (default).\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Render the selected value.\n   * You can only use it when the `native` prop is `false` (default).\n   *\n   * @param {any} value The `value` provided to the component.\n   * @returns {ReactNode}\n   */\n  renderValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Props applied to the clickable div element.\n   */\n  SelectDisplayProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The input value. Providing an empty string will select no options.\n   * This prop is required when the `native` prop is `false` (default).\n   * Set to an empty string `''` if you don't want any of the available options to be selected.\n   *\n   * If the value is an object it must have reference equality with the option in order to be selected.\n   * If the value is not an object, the string representation must match with the string representation of the option in order to be selected.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\nSelect.muiName = 'Select';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(styles, {\n  name: 'MuiSelect'\n})(Select));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js ***!
+  \******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n/* harmony import */ var _Menu_Menu__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Menu/Menu */ \"./jaas-client/node_modules/@material-ui/core/esm/Menu/Menu.js\");\n/* harmony import */ var _InputBase_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../InputBase/utils */ \"./jaas-client/node_modules/@material-ui/core/esm/InputBase/utils.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _utils_useControlled__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/useControlled */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction areEqualValues(a, b) {\n  if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(b) === 'object' && b !== null) {\n    return a === b;\n  }\n\n  return String(a) === String(b);\n}\n\nfunction isEmpty(display) {\n  return display == null || typeof display === 'string' && !display.trim();\n}\n/**\n * @ignore - internal component.\n */\n\n\nvar SelectInput = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"forwardRef\"](function SelectInput(props, ref) {\n  var ariaLabel = props['aria-label'],\n      autoFocus = props.autoFocus,\n      autoWidth = props.autoWidth,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      defaultValue = props.defaultValue,\n      disabled = props.disabled,\n      displayEmpty = props.displayEmpty,\n      IconComponent = props.IconComponent,\n      inputRefProp = props.inputRef,\n      labelId = props.labelId,\n      _props$MenuProps = props.MenuProps,\n      MenuProps = _props$MenuProps === void 0 ? {} : _props$MenuProps,\n      multiple = props.multiple,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onClose = props.onClose,\n      onFocus = props.onFocus,\n      onOpen = props.onOpen,\n      openProp = props.open,\n      readOnly = props.readOnly,\n      renderValue = props.renderValue,\n      _props$SelectDisplayP = props.SelectDisplayProps,\n      SelectDisplayProps = _props$SelectDisplayP === void 0 ? {} : _props$SelectDisplayP,\n      tabIndexProp = props.tabIndex,\n      type = props.type,\n      valueProp = props.value,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"aria-label\", \"autoFocus\", \"autoWidth\", \"children\", \"classes\", \"className\", \"defaultValue\", \"disabled\", \"displayEmpty\", \"IconComponent\", \"inputRef\", \"labelId\", \"MenuProps\", \"multiple\", \"name\", \"onBlur\", \"onChange\", \"onClose\", \"onFocus\", \"onOpen\", \"open\", \"readOnly\", \"renderValue\", \"SelectDisplayProps\", \"tabIndex\", \"type\", \"value\", \"variant\"]);\n\n  var _useControlled = Object(_utils_useControlled__WEBPACK_IMPORTED_MODULE_14__[\"default\"])({\n    controlled: valueProp,\n    default: defaultValue,\n    name: 'Select'\n  }),\n      _useControlled2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_useControlled, 2),\n      value = _useControlled2[0],\n      setValue = _useControlled2[1];\n\n  var inputRef = react__WEBPACK_IMPORTED_MODULE_5__[\"useRef\"](null);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_5__[\"useState\"](null),\n      displayNode = _React$useState[0],\n      setDisplayNode = _React$useState[1];\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_5__[\"useRef\"](openProp != null),\n      isOpenControlled = _React$useRef.current;\n\n  var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_5__[\"useState\"](),\n      menuMinWidthState = _React$useState2[0],\n      setMenuMinWidthState = _React$useState2[1];\n\n  var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_5__[\"useState\"](false),\n      openState = _React$useState3[0],\n      setOpenState = _React$useState3[1];\n\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_13__[\"default\"])(ref, inputRefProp);\n  react__WEBPACK_IMPORTED_MODULE_5__[\"useImperativeHandle\"](handleRef, function () {\n    return {\n      focus: function focus() {\n        displayNode.focus();\n      },\n      node: inputRef.current,\n      value: value\n    };\n  }, [displayNode, value]);\n  react__WEBPACK_IMPORTED_MODULE_5__[\"useEffect\"](function () {\n    if (autoFocus && displayNode) {\n      displayNode.focus();\n    }\n  }, [autoFocus, displayNode]);\n  react__WEBPACK_IMPORTED_MODULE_5__[\"useEffect\"](function () {\n    if (displayNode) {\n      var label = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(displayNode).getElementById(labelId);\n\n      if (label) {\n        var handler = function handler() {\n          if (getSelection().isCollapsed) {\n            displayNode.focus();\n          }\n        };\n\n        label.addEventListener('click', handler);\n        return function () {\n          label.removeEventListener('click', handler);\n        };\n      }\n    }\n\n    return undefined;\n  }, [labelId, displayNode]);\n\n  var update = function update(open, event) {\n    if (open) {\n      if (onOpen) {\n        onOpen(event);\n      }\n    } else if (onClose) {\n      onClose(event);\n    }\n\n    if (!isOpenControlled) {\n      setMenuMinWidthState(autoWidth ? null : displayNode.clientWidth);\n      setOpenState(open);\n    }\n  };\n\n  var handleMouseDown = function handleMouseDown(event) {\n    // Ignore everything but left-click\n    if (event.button !== 0) {\n      return;\n    } // Hijack the default focus behavior.\n\n\n    event.preventDefault();\n    displayNode.focus();\n    update(true, event);\n  };\n\n  var handleClose = function handleClose(event) {\n    update(false, event);\n  };\n\n  var childrenArray = react__WEBPACK_IMPORTED_MODULE_5__[\"Children\"].toArray(children); // Support autofill.\n\n  var handleChange = function handleChange(event) {\n    var index = childrenArray.map(function (child) {\n      return child.props.value;\n    }).indexOf(event.target.value);\n\n    if (index === -1) {\n      return;\n    }\n\n    var child = childrenArray[index];\n    setValue(child.props.value);\n\n    if (onChange) {\n      onChange(event, child);\n    }\n  };\n\n  var handleItemClick = function handleItemClick(child) {\n    return function (event) {\n      if (!multiple) {\n        update(false, event);\n      }\n\n      var newValue;\n\n      if (multiple) {\n        newValue = Array.isArray(value) ? value.slice() : [];\n        var itemIndex = value.indexOf(child.props.value);\n\n        if (itemIndex === -1) {\n          newValue.push(child.props.value);\n        } else {\n          newValue.splice(itemIndex, 1);\n        }\n      } else {\n        newValue = child.props.value;\n      }\n\n      if (child.props.onClick) {\n        child.props.onClick(event);\n      }\n\n      if (value === newValue) {\n        return;\n      }\n\n      setValue(newValue);\n\n      if (onChange) {\n        event.persist(); // Preact support, target is read only property on a native event.\n\n        Object.defineProperty(event, 'target', {\n          writable: true,\n          value: {\n            value: newValue,\n            name: name\n          }\n        });\n        onChange(event, child);\n      }\n    };\n  };\n\n  var handleKeyDown = function handleKeyDown(event) {\n    if (!readOnly) {\n      var validKeys = [' ', 'ArrowUp', 'ArrowDown', // The native select doesn't respond to enter on MacOS, but it's recommended by\n      // https://www.w3.org/TR/wai-aria-practices/examples/listbox/listbox-collapsible.html\n      'Enter'];\n\n      if (validKeys.indexOf(event.key) !== -1) {\n        event.preventDefault();\n        update(true, event);\n      }\n    }\n  };\n\n  var open = displayNode !== null && (isOpenControlled ? openProp : openState);\n\n  var handleBlur = function handleBlur(event) {\n    // if open event.stopImmediatePropagation\n    if (!open && onBlur) {\n      event.persist(); // Preact support, target is read only property on a native event.\n\n      Object.defineProperty(event, 'target', {\n        writable: true,\n        value: {\n          value: value,\n          name: name\n        }\n      });\n      onBlur(event);\n    }\n  };\n\n  delete other['aria-invalid'];\n  var display;\n  var displaySingle;\n  var displayMultiple = [];\n  var computeDisplay = false;\n  var foundMatch = false; // No need to display any value if the field is empty.\n\n  if (Object(_InputBase_utils__WEBPACK_IMPORTED_MODULE_12__[\"isFilled\"])({\n    value: value\n  }) || displayEmpty) {\n    if (renderValue) {\n      display = renderValue(value);\n    } else {\n      computeDisplay = true;\n    }\n  }\n\n  var items = childrenArray.map(function (child) {\n    if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"isValidElement\"](child)) {\n      return null;\n    }\n\n    if (true) {\n      if (Object(react_is__WEBPACK_IMPORTED_MODULE_6__[\"isFragment\"])(child)) {\n        console.error([\"Material-UI: The Select component doesn't accept a Fragment as a child.\", 'Consider providing an array instead.'].join('\\n'));\n      }\n    }\n\n    var selected;\n\n    if (multiple) {\n      if (!Array.isArray(value)) {\n        throw new Error( true ? \"Material-UI: The `value` prop must be an array when using the `Select` component with `multiple`.\" : undefined);\n      }\n\n      selected = value.some(function (v) {\n        return areEqualValues(v, child.props.value);\n      });\n\n      if (selected && computeDisplay) {\n        displayMultiple.push(child.props.children);\n      }\n    } else {\n      selected = areEqualValues(value, child.props.value);\n\n      if (selected && computeDisplay) {\n        displaySingle = child.props.children;\n      }\n    }\n\n    if (selected) {\n      foundMatch = true;\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"cloneElement\"](child, {\n      'aria-selected': selected ? 'true' : undefined,\n      onClick: handleItemClick(child),\n      onKeyUp: function onKeyUp(event) {\n        if (event.key === ' ') {\n          // otherwise our MenuItems dispatches a click event\n          // it's not behavior of the native <option> and causes\n          // the select to close immediately since we open on space keydown\n          event.preventDefault();\n        }\n\n        if (child.props.onKeyUp) {\n          child.props.onKeyUp(event);\n        }\n      },\n      role: 'option',\n      selected: selected,\n      value: undefined,\n      // The value is most likely not a valid HTML attribute.\n      'data-value': child.props.value // Instead, we provide it as a data attribute.\n\n    });\n  });\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_5__[\"useEffect\"](function () {\n      if (!foundMatch && !multiple && value !== '') {\n        var values = childrenArray.map(function (child) {\n          return child.props.value;\n        });\n        console.warn([\"Material-UI: You have provided an out-of-range value `\".concat(value, \"` for the select \").concat(name ? \"(name=\\\"\".concat(name, \"\\\") \") : '', \"component.\"), \"Consider providing a value that matches one of the available options or ''.\", \"The available values are \".concat(values.filter(function (x) {\n          return x != null;\n        }).map(function (x) {\n          return \"`\".concat(x, \"`\");\n        }).join(', ') || '\"\"', \".\")].join('\\n'));\n      }\n    }, [foundMatch, childrenArray, multiple, name, value]);\n  }\n\n  if (computeDisplay) {\n    display = multiple ? displayMultiple.join(', ') : displaySingle;\n  } // Avoid performing a layout computation in the render method.\n\n\n  var menuMinWidth = menuMinWidthState;\n\n  if (!autoWidth && isOpenControlled && displayNode) {\n    menuMinWidth = displayNode.clientWidth;\n  }\n\n  var tabIndex;\n\n  if (typeof tabIndexProp !== 'undefined') {\n    tabIndex = tabIndexProp;\n  } else {\n    tabIndex = disabled ? null : 0;\n  }\n\n  var buttonId = SelectDisplayProps.id || (name ? \"mui-component-select-\".concat(name) : undefined);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_5__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](\"div\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(classes.root, // TODO v5: merge root and select\n    classes.select, classes.selectMenu, classes[variant], className, disabled && classes.disabled),\n    ref: setDisplayNode,\n    tabIndex: tabIndex,\n    role: \"button\",\n    \"aria-disabled\": disabled ? 'true' : undefined,\n    \"aria-expanded\": open ? 'true' : undefined,\n    \"aria-haspopup\": \"listbox\",\n    \"aria-label\": ariaLabel,\n    \"aria-labelledby\": [labelId, buttonId].filter(Boolean).join(' ') || undefined,\n    onKeyDown: handleKeyDown,\n    onMouseDown: disabled || readOnly ? null : handleMouseDown,\n    onBlur: handleBlur,\n    onFocus: onFocus\n  }, SelectDisplayProps, {\n    // The id is required for proper a11y\n    id: buttonId\n  }), isEmpty(display) ?\n  /*#__PURE__*/\n  // eslint-disable-next-line react/no-danger\n  react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](\"span\", {\n    dangerouslySetInnerHTML: {\n      __html: '&#8203;'\n    }\n  }) : display), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](\"input\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    value: Array.isArray(value) ? value.join(',') : value,\n    name: name,\n    ref: inputRef,\n    \"aria-hidden\": true,\n    onChange: handleChange,\n    tabIndex: -1,\n    className: classes.nativeInput,\n    autoFocus: autoFocus\n  }, other)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](IconComponent, {\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(classes.icon, classes[\"icon\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(variant))], open && classes.iconOpen, disabled && classes.disabled)\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__[\"createElement\"](_Menu_Menu__WEBPACK_IMPORTED_MODULE_11__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    id: \"menu-\".concat(name || ''),\n    anchorEl: displayNode,\n    open: open,\n    onClose: handleClose\n  }, MenuProps, {\n    MenuListProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      'aria-labelledby': labelId,\n      role: 'listbox',\n      disableListWrap: true\n    }, MenuProps.MenuListProps),\n    PaperProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, MenuProps.PaperProps, {\n      style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        minWidth: menuMinWidth\n      }, MenuProps.PaperProps != null ? MenuProps.PaperProps.style : null)\n    })\n  }), items));\n});\n true ? SelectInput.propTypes = {\n  /**\n   * @ignore\n   */\n  'aria-label': prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * @ignore\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * If `true`, the width of the popover will automatically be set according to the items inside the\n   * menu, otherwise it will be at least the width of the select input.\n   */\n  autoWidth: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * The option elements to populate the select with.\n   * Can be some `<MenuItem>` elements.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object.isRequired,\n\n  /**\n   * The CSS class name of the select element.\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * The default element value. Use when the component is not controlled.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.any,\n\n  /**\n   * If `true`, the select will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * If `true`, the selected item is displayed even if its value is empty.\n   */\n  displayEmpty: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * The icon that displays the arrow.\n   */\n  IconComponent: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.elementType.isRequired,\n\n  /**\n   * Imperative handle implementing `{ value: T, node: HTMLElement, focus(): void }`\n   * Equivalent to `ref`\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__[\"refType\"],\n\n  /**\n   * The ID of an element that acts as an additional label. The Select will\n   * be labelled by the additional label and the selected value.\n   */\n  labelId: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * Props applied to the [`Menu`](/api/menu/) element.\n   */\n  MenuProps: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object,\n\n  /**\n   * If `true`, `value` must be an array and the menu will support multiple selections.\n   */\n  multiple: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * Name attribute of the `select` or hidden `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Callback function fired when a menu item is selected.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (any).\n   * @param {object} [child] The react element that was selected.\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be closed.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onClose: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Callback fired when the component requests to be opened.\n   * Use in controlled mode (see open).\n   *\n   * @param {object} event The event source of the callback.\n   */\n  onOpen: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Control `select` open state.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool,\n\n  /**\n   * Render the selected value.\n   *\n   * @param {any} value The `value` provided to the component.\n   * @returns {ReactNode}\n   */\n  renderValue: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func,\n\n  /**\n   * Props applied to the clickable div element.\n   */\n  SelectDisplayProps: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string]),\n\n  /**\n   * @ignore\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.any,\n\n  /**\n   * The input value.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(['standard', 'outlined', 'filled'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (SelectInput);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Select/SelectInput.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Select/index.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Select/index.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Select__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Select */ \"./jaas-client/node_modules/@material-ui/core/esm/Select/Select.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Select__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Select/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js ***!
+  \***************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      userSelect: 'none',\n      width: '1em',\n      height: '1em',\n      display: 'inline-block',\n      fill: 'currentColor',\n      flexShrink: 0,\n      fontSize: theme.typography.pxToRem(24),\n      transition: theme.transitions.create('fill', {\n        duration: theme.transitions.duration.shorter\n      })\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main\n    },\n\n    /* Styles applied to the root element if `color=\"action\"`. */\n    colorAction: {\n      color: theme.palette.action.active\n    },\n\n    /* Styles applied to the root element if `color=\"error\"`. */\n    colorError: {\n      color: theme.palette.error.main\n    },\n\n    /* Styles applied to the root element if `color=\"disabled\"`. */\n    colorDisabled: {\n      color: theme.palette.action.disabled\n    },\n\n    /* Styles applied to the root element if `fontSize=\"inherit\"`. */\n    fontSizeInherit: {\n      fontSize: 'inherit'\n    },\n\n    /* Styles applied to the root element if `fontSize=\"small\"`. */\n    fontSizeSmall: {\n      fontSize: theme.typography.pxToRem(20)\n    },\n\n    /* Styles applied to the root element if `fontSize=\"large\"`. */\n    fontSizeLarge: {\n      fontSize: theme.typography.pxToRem(35)\n    }\n  };\n};\nvar SvgIcon = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function SvgIcon(props, ref) {\n  var children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'inherit' : _props$color,\n      _props$component = props.component,\n      Component = _props$component === void 0 ? 'svg' : _props$component,\n      _props$fontSize = props.fontSize,\n      fontSize = _props$fontSize === void 0 ? 'default' : _props$fontSize,\n      htmlColor = props.htmlColor,\n      titleAccess = props.titleAccess,\n      _props$viewBox = props.viewBox,\n      viewBox = _props$viewBox === void 0 ? '0 0 24 24' : _props$viewBox,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"fontSize\", \"htmlColor\", \"titleAccess\", \"viewBox\"]);\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, color !== 'inherit' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(color))], fontSize !== 'default' && classes[\"fontSize\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(fontSize))]),\n    focusable: \"false\",\n    viewBox: viewBox,\n    color: htmlColor,\n    \"aria-hidden\": titleAccess ? undefined : true,\n    role: titleAccess ? 'img' : undefined,\n    ref: ref\n  }, other), children, titleAccess ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"title\", null, titleAccess) : null);\n});\n true ? SvgIcon.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * Node passed into the SVG element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   * You can use the `htmlColor` prop to apply a color attribute to the SVG element.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['action', 'disabled', 'error', 'inherit', 'primary', 'secondary']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * The fontSize applied to the icon. Defaults to 24px, but can be configure to inherit font size.\n   */\n  fontSize: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['default', 'inherit', 'large', 'small']),\n\n  /**\n   * Applies a color attribute to the SVG element.\n   */\n  htmlColor: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The shape-rendering attribute. The behavior of the different options is described on the\n   * [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering).\n   * If you are having issues with blurry icons you should investigate this property.\n   */\n  shapeRendering: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Provides a human-readable title for the element that contains it.\n   * https://www.w3.org/TR/SVG-access/#Equivalent\n   */\n  titleAccess: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Allows you to redefine what the coordinates without units mean inside an SVG element.\n   * For example, if the SVG element is 500 (width) by 200 (height),\n   * and you pass viewBox=\"0 0 50 20\",\n   * this means that the coordinates inside the SVG will go from the top left corner (0,0)\n   * to bottom right (50,20) and each unit will be worth 10px.\n   */\n  viewBox: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string\n} : undefined;\nSvgIcon.muiName = 'SvgIcon';\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiSvgIcon'\n})(SvgIcon));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _SvgIcon__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _SvgIcon__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js ***!
+  \*******************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Input */ \"./jaas-client/node_modules/@material-ui/core/esm/Input/index.js\");\n/* harmony import */ var _FilledInput__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FilledInput */ \"./jaas-client/node_modules/@material-ui/core/esm/FilledInput/index.js\");\n/* harmony import */ var _OutlinedInput__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../OutlinedInput */ \"./jaas-client/node_modules/@material-ui/core/esm/OutlinedInput/index.js\");\n/* harmony import */ var _InputLabel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../InputLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/InputLabel/index.js\");\n/* harmony import */ var _FormControl__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../FormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/index.js\");\n/* harmony import */ var _FormHelperText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../FormHelperText */ \"./jaas-client/node_modules/@material-ui/core/esm/FormHelperText/index.js\");\n/* harmony import */ var _Select__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Select */ \"./jaas-client/node_modules/@material-ui/core/esm/Select/index.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar variantComponent = {\n  standard: _Input__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n  filled: _FilledInput__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n  outlined: _OutlinedInput__WEBPACK_IMPORTED_MODULE_8__[\"default\"]\n};\nvar styles = {\n  /* Styles applied to the root element. */\n  root: {}\n};\n/**\n * The `TextField` is a convenience wrapper for the most common cases (80%).\n * It cannot be all things to all people, otherwise the API would grow out of control.\n *\n * ## Advanced Configuration\n *\n * It's important to understand that the text field is a simple abstraction\n * on top of the following components:\n *\n * - [FormControl](/api/form-control/)\n * - [InputLabel](/api/input-label/)\n * - [FilledInput](/api/filled-input/)\n * - [OutlinedInput](/api/outlined-input/)\n * - [Input](/api/input/)\n * - [FormHelperText](/api/form-helper-text/)\n *\n * If you wish to alter the props applied to the `input` element, you can do so as follows:\n *\n * ```jsx\n * const inputProps = {\n *   step: 300,\n * };\n *\n * return <TextField id=\"time\" type=\"time\" inputProps={inputProps} />;\n * ```\n *\n * For advanced cases, please look at the source of TextField by clicking on the\n * \"Edit this page\" button above. Consider either:\n *\n * - using the upper case props for passing values directly to the components\n * - using the underlying components directly as shown in the demos\n */\n\nvar TextField = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function TextField(props, ref) {\n  var autoComplete = props.autoComplete,\n      _props$autoFocus = props.autoFocus,\n      autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,\n      children = props.children,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'primary' : _props$color,\n      defaultValue = props.defaultValue,\n      _props$disabled = props.disabled,\n      disabled = _props$disabled === void 0 ? false : _props$disabled,\n      _props$error = props.error,\n      error = _props$error === void 0 ? false : _props$error,\n      FormHelperTextProps = props.FormHelperTextProps,\n      _props$fullWidth = props.fullWidth,\n      fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n      helperText = props.helperText,\n      hiddenLabel = props.hiddenLabel,\n      id = props.id,\n      InputLabelProps = props.InputLabelProps,\n      inputProps = props.inputProps,\n      InputProps = props.InputProps,\n      inputRef = props.inputRef,\n      label = props.label,\n      _props$multiline = props.multiline,\n      multiline = _props$multiline === void 0 ? false : _props$multiline,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onFocus = props.onFocus,\n      placeholder = props.placeholder,\n      _props$required = props.required,\n      required = _props$required === void 0 ? false : _props$required,\n      rows = props.rows,\n      rowsMax = props.rowsMax,\n      _props$select = props.select,\n      select = _props$select === void 0 ? false : _props$select,\n      SelectProps = props.SelectProps,\n      type = props.type,\n      value = props.value,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'standard' : _props$variant,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"autoComplete\", \"autoFocus\", \"children\", \"classes\", \"className\", \"color\", \"defaultValue\", \"disabled\", \"error\", \"FormHelperTextProps\", \"fullWidth\", \"helperText\", \"hiddenLabel\", \"id\", \"InputLabelProps\", \"inputProps\", \"InputProps\", \"inputRef\", \"label\", \"multiline\", \"name\", \"onBlur\", \"onChange\", \"onFocus\", \"placeholder\", \"required\", \"rows\", \"rowsMax\", \"select\", \"SelectProps\", \"type\", \"value\", \"variant\"]);\n\n  if (true) {\n    if (select && !children) {\n      console.error('Material-UI: `children` must be passed when using the `TextField` component with `select`.');\n    }\n  }\n\n  var InputMore = {};\n\n  if (variant === 'outlined') {\n    if (InputLabelProps && typeof InputLabelProps.shrink !== 'undefined') {\n      InputMore.notched = InputLabelProps.shrink;\n    }\n\n    if (label) {\n      var _InputLabelProps$requ;\n\n      var displayRequired = (_InputLabelProps$requ = InputLabelProps === null || InputLabelProps === void 0 ? void 0 : InputLabelProps.required) !== null && _InputLabelProps$requ !== void 0 ? _InputLabelProps$requ : required;\n      InputMore.label = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_2__[\"Fragment\"], null, label, displayRequired && \"\\xA0*\");\n    }\n  }\n\n  if (select) {\n    // unset defaults from textbox inputs\n    if (!SelectProps || !SelectProps.native) {\n      InputMore.id = undefined;\n    }\n\n    InputMore['aria-describedby'] = undefined;\n  }\n\n  var helperTextId = helperText && id ? \"\".concat(id, \"-helper-text\") : undefined;\n  var inputLabelId = label && id ? \"\".concat(id, \"-label\") : undefined;\n  var InputComponent = variantComponent[variant];\n  var InputElement = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](InputComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"aria-describedby\": helperTextId,\n    autoComplete: autoComplete,\n    autoFocus: autoFocus,\n    defaultValue: defaultValue,\n    fullWidth: fullWidth,\n    multiline: multiline,\n    name: name,\n    rows: rows,\n    rowsMax: rowsMax,\n    type: type,\n    value: value,\n    id: id,\n    inputRef: inputRef,\n    onBlur: onBlur,\n    onChange: onChange,\n    onFocus: onFocus,\n    placeholder: placeholder,\n    inputProps: inputProps\n  }, InputMore, InputProps));\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormControl__WEBPACK_IMPORTED_MODULE_10__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className),\n    disabled: disabled,\n    error: error,\n    fullWidth: fullWidth,\n    hiddenLabel: hiddenLabel,\n    ref: ref,\n    required: required,\n    color: color,\n    variant: variant\n  }, other), label && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_InputLabel__WEBPACK_IMPORTED_MODULE_9__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    htmlFor: id,\n    id: inputLabelId\n  }, InputLabelProps), label), select ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_Select__WEBPACK_IMPORTED_MODULE_12__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    \"aria-describedby\": helperTextId,\n    id: id,\n    labelId: inputLabelId,\n    value: value,\n    input: InputElement\n  }, SelectProps), children) : InputElement, helperText && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](_FormHelperText__WEBPACK_IMPORTED_MODULE_11__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    id: helperTextId\n  }, FormHelperTextProps), helperText));\n});\n true ? TextField.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * This prop helps users to fill forms faster, especially on mobile devices.\n   * The name can be confusing, as it's more like an autofill.\n   * You can learn more about it [following the specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill).\n   */\n  autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['primary', 'secondary']),\n\n  /**\n   * The default value of the `input` element.\n   */\n  defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * If `true`, the `input` element will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the label will be displayed in an error state.\n   */\n  error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Props applied to the [`FormHelperText`](/api/form-helper-text/) element.\n   */\n  FormHelperTextProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * If `true`, the input will take up the full width of its container.\n   */\n  fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The helper text content.\n   */\n  helperText: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * @ignore\n   */\n  hiddenLabel: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * The id of the `input` element.\n   * Use this prop to make `label` and `helperText` accessible for screen readers.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Props applied to the [`InputLabel`](/api/input-label/) element.\n   */\n  InputLabelProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Props applied to the Input element.\n   * It will be a [`FilledInput`](/api/filled-input/),\n   * [`OutlinedInput`](/api/outlined-input/) or [`Input`](/api/input/)\n   * component depending on the `variant` prop value.\n   */\n  InputProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"refType\"],\n\n  /**\n   * The label content.\n   */\n  label: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * If `dense` or `normal`, will adjust vertical spacing of this and contained components.\n   */\n  margin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['dense', 'none', 'normal']),\n\n  /**\n   * If `true`, a textarea element will be rendered instead of an input.\n   */\n  multiline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Name attribute of the `input` element.\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * Callback fired when the value is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new value by accessing `event.target.value` (string).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * The short hint displayed in the input before the user enters a value.\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * If `true`, the label is displayed as required and the `input` element` will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Number of rows to display when multiline option is set to true.\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display when multiline option is set to true.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Render a [`Select`](/api/select/) element while passing the Input element to `Select` as `input` parameter.\n   * If this option is set you must pass the options of the select as children.\n   */\n  select: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Props applied to the [`Select`](/api/select/) element.\n   */\n  SelectProps: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * The size of the text field.\n   */\n  size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['medium', 'small']),\n\n  /**\n   * Type of the `input` element. It should be [a valid HTML5 input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types).\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The value of the `input` element, required for a controlled component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any,\n\n  /**\n   * The variant to use.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['filled', 'outlined', 'standard'])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_13__[\"default\"])(styles, {\n  name: 'MuiTextField'\n})(TextField));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _TextField__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextField */ \"./jaas-client/node_modules/@material-ui/core/esm/TextField/TextField.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _TextField__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js":
+/*!*********************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js ***!
+  \*********************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/debounce */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n\n\n\n\n\n\n\nfunction getStyleValue(computedStyle, property) {\n  return parseInt(computedStyle[property], 10) || 0;\n}\n\nvar useEnhancedEffect = typeof window !== 'undefined' ? react__WEBPACK_IMPORTED_MODULE_2__[\"useLayoutEffect\"] : react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"];\nvar styles = {\n  /* Styles applied to the shadow textarea element. */\n  shadow: {\n    // Visibility needed to hide the extra text area on iPads\n    visibility: 'hidden',\n    // Remove from the content flow\n    position: 'absolute',\n    // Ignore the scrollbar width\n    overflow: 'hidden',\n    height: 0,\n    top: 0,\n    left: 0,\n    // Create a new layer, increase the isolation of the computed values\n    transform: 'translateZ(0)'\n  }\n};\nvar TextareaAutosize = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function TextareaAutosize(props, ref) {\n  var onChange = props.onChange,\n      rows = props.rows,\n      rowsMax = props.rowsMax,\n      _props$rowsMin = props.rowsMin,\n      rowsMinProp = _props$rowsMin === void 0 ? 1 : _props$rowsMin,\n      style = props.style,\n      value = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"onChange\", \"rows\", \"rowsMax\", \"rowsMin\", \"style\", \"value\"]);\n\n  var rowsMin = rows || rowsMinProp;\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](value != null),\n      isControlled = _React$useRef.current;\n\n  var inputRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(ref, inputRef);\n  var shadowRef = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](null);\n  var renders = react__WEBPACK_IMPORTED_MODULE_2__[\"useRef\"](0);\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_2__[\"useState\"]({}),\n      state = _React$useState[0],\n      setState = _React$useState[1];\n\n  var syncHeight = react__WEBPACK_IMPORTED_MODULE_2__[\"useCallback\"](function () {\n    var input = inputRef.current;\n    var computedStyle = window.getComputedStyle(input);\n    var inputShallow = shadowRef.current;\n    inputShallow.style.width = computedStyle.width;\n    inputShallow.value = input.value || props.placeholder || 'x';\n\n    if (inputShallow.value.slice(-1) === '\\n') {\n      // Certain fonts which overflow the line height will cause the textarea\n      // to report a different scrollHeight depending on whether the last line\n      // is empty. Make it non-empty to avoid this issue.\n      inputShallow.value += ' ';\n    }\n\n    var boxSizing = computedStyle['box-sizing'];\n    var padding = getStyleValue(computedStyle, 'padding-bottom') + getStyleValue(computedStyle, 'padding-top');\n    var border = getStyleValue(computedStyle, 'border-bottom-width') + getStyleValue(computedStyle, 'border-top-width'); // The height of the inner content\n\n    var innerHeight = inputShallow.scrollHeight - padding; // Measure height of a textarea with a single row\n\n    inputShallow.value = 'x';\n    var singleRowHeight = inputShallow.scrollHeight - padding; // The height of the outer content\n\n    var outerHeight = innerHeight;\n\n    if (rowsMin) {\n      outerHeight = Math.max(Number(rowsMin) * singleRowHeight, outerHeight);\n    }\n\n    if (rowsMax) {\n      outerHeight = Math.min(Number(rowsMax) * singleRowHeight, outerHeight);\n    }\n\n    outerHeight = Math.max(outerHeight, singleRowHeight); // Take the box sizing into account for applying this value as a style.\n\n    var outerHeightStyle = outerHeight + (boxSizing === 'border-box' ? padding + border : 0);\n    var overflow = Math.abs(outerHeight - innerHeight) <= 1;\n    setState(function (prevState) {\n      // Need a large enough difference to update the height.\n      // This prevents infinite rendering loop.\n      if (renders.current < 20 && (outerHeightStyle > 0 && Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) > 1 || prevState.overflow !== overflow)) {\n        renders.current += 1;\n        return {\n          overflow: overflow,\n          outerHeightStyle: outerHeightStyle\n        };\n      }\n\n      if (true) {\n        if (renders.current === 20) {\n          console.error(['Material-UI: Too many re-renders. The layout is unstable.', 'TextareaAutosize limits the number of renders to prevent an infinite loop.'].join('\\n'));\n        }\n      }\n\n      return prevState;\n    });\n  }, [rowsMax, rowsMin, props.placeholder]);\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    var handleResize = Object(_utils_debounce__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(function () {\n      renders.current = 0;\n      syncHeight();\n    });\n    window.addEventListener('resize', handleResize);\n    return function () {\n      handleResize.clear();\n      window.removeEventListener('resize', handleResize);\n    };\n  }, [syncHeight]);\n  useEnhancedEffect(function () {\n    syncHeight();\n  });\n  react__WEBPACK_IMPORTED_MODULE_2__[\"useEffect\"](function () {\n    renders.current = 0;\n  }, [value]);\n\n  var handleChange = function handleChange(event) {\n    renders.current = 0;\n\n    if (!isControlled) {\n      syncHeight();\n    }\n\n    if (onChange) {\n      onChange(event);\n    }\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_2__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"textarea\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    value: value,\n    onChange: handleChange,\n    ref: handleRef // Apply the rows prop to get a \"correct\" first SSR paint\n    ,\n    rows: rowsMin,\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      height: state.outerHeightStyle,\n      // Need a large enough difference to allow scrolling.\n      // This prevents infinite rendering loop.\n      overflow: state.overflow ? 'hidden' : null\n    }, style)\n  }, other)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](\"textarea\", {\n    \"aria-hidden\": true,\n    className: props.className,\n    readOnly: true,\n    ref: shadowRef,\n    tabIndex: -1,\n    style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, styles.shadow, style)\n  }));\n});\n true ? TextareaAutosize.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   */\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * Use `rowsMin` instead. The prop will be removed in v5.\n   *\n   * @deprecated\n   */\n  rows: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Maximum number of rows to display.\n   */\n  rowsMax: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * Minimum number of rows to display.\n   */\n  rowsMin: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]),\n\n  /**\n   * @ignore\n   */\n  style: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string])\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (TextareaAutosize);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _TextareaAutosize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextareaAutosize */ \"./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _TextareaAutosize__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/TextareaAutosize/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js ***!
+  \*********************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _utils_capitalize__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/capitalize */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js\");\n\n\n\n\n\n\n\nvar styles = function styles(theme) {\n  return {\n    /* Styles applied to the root element. */\n    root: {\n      margin: 0\n    },\n\n    /* Styles applied to the root element if `variant=\"body2\"`. */\n    body2: theme.typography.body2,\n\n    /* Styles applied to the root element if `variant=\"body1\"`. */\n    body1: theme.typography.body1,\n\n    /* Styles applied to the root element if `variant=\"caption\"`. */\n    caption: theme.typography.caption,\n\n    /* Styles applied to the root element if `variant=\"button\"`. */\n    button: theme.typography.button,\n\n    /* Styles applied to the root element if `variant=\"h1\"`. */\n    h1: theme.typography.h1,\n\n    /* Styles applied to the root element if `variant=\"h2\"`. */\n    h2: theme.typography.h2,\n\n    /* Styles applied to the root element if `variant=\"h3\"`. */\n    h3: theme.typography.h3,\n\n    /* Styles applied to the root element if `variant=\"h4\"`. */\n    h4: theme.typography.h4,\n\n    /* Styles applied to the root element if `variant=\"h5\"`. */\n    h5: theme.typography.h5,\n\n    /* Styles applied to the root element if `variant=\"h6\"`. */\n    h6: theme.typography.h6,\n\n    /* Styles applied to the root element if `variant=\"subtitle1\"`. */\n    subtitle1: theme.typography.subtitle1,\n\n    /* Styles applied to the root element if `variant=\"subtitle2\"`. */\n    subtitle2: theme.typography.subtitle2,\n\n    /* Styles applied to the root element if `variant=\"overline\"`. */\n    overline: theme.typography.overline,\n\n    /* Styles applied to the root element if `variant=\"srOnly\"`. Only accessible to screen readers. */\n    srOnly: {\n      position: 'absolute',\n      height: 1,\n      width: 1,\n      overflow: 'hidden'\n    },\n\n    /* Styles applied to the root element if `align=\"left\"`. */\n    alignLeft: {\n      textAlign: 'left'\n    },\n\n    /* Styles applied to the root element if `align=\"center\"`. */\n    alignCenter: {\n      textAlign: 'center'\n    },\n\n    /* Styles applied to the root element if `align=\"right\"`. */\n    alignRight: {\n      textAlign: 'right'\n    },\n\n    /* Styles applied to the root element if `align=\"justify\"`. */\n    alignJustify: {\n      textAlign: 'justify'\n    },\n\n    /* Styles applied to the root element if `nowrap={true}`. */\n    noWrap: {\n      overflow: 'hidden',\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap'\n    },\n\n    /* Styles applied to the root element if `gutterBottom={true}`. */\n    gutterBottom: {\n      marginBottom: '0.35em'\n    },\n\n    /* Styles applied to the root element if `paragraph={true}`. */\n    paragraph: {\n      marginBottom: 16\n    },\n\n    /* Styles applied to the root element if `color=\"inherit\"`. */\n    colorInherit: {\n      color: 'inherit'\n    },\n\n    /* Styles applied to the root element if `color=\"primary\"`. */\n    colorPrimary: {\n      color: theme.palette.primary.main\n    },\n\n    /* Styles applied to the root element if `color=\"secondary\"`. */\n    colorSecondary: {\n      color: theme.palette.secondary.main\n    },\n\n    /* Styles applied to the root element if `color=\"textPrimary\"`. */\n    colorTextPrimary: {\n      color: theme.palette.text.primary\n    },\n\n    /* Styles applied to the root element if `color=\"textSecondary\"`. */\n    colorTextSecondary: {\n      color: theme.palette.text.secondary\n    },\n\n    /* Styles applied to the root element if `color=\"error\"`. */\n    colorError: {\n      color: theme.palette.error.main\n    },\n\n    /* Styles applied to the root element if `display=\"inline\"`. */\n    displayInline: {\n      display: 'inline'\n    },\n\n    /* Styles applied to the root element if `display=\"block\"`. */\n    displayBlock: {\n      display: 'block'\n    }\n  };\n};\nvar defaultVariantMapping = {\n  h1: 'h1',\n  h2: 'h2',\n  h3: 'h3',\n  h4: 'h4',\n  h5: 'h5',\n  h6: 'h6',\n  subtitle1: 'h6',\n  subtitle2: 'h6',\n  body1: 'p',\n  body2: 'p'\n};\nvar Typography = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"forwardRef\"](function Typography(props, ref) {\n  var _props$align = props.align,\n      align = _props$align === void 0 ? 'inherit' : _props$align,\n      classes = props.classes,\n      className = props.className,\n      _props$color = props.color,\n      color = _props$color === void 0 ? 'initial' : _props$color,\n      component = props.component,\n      _props$display = props.display,\n      display = _props$display === void 0 ? 'initial' : _props$display,\n      _props$gutterBottom = props.gutterBottom,\n      gutterBottom = _props$gutterBottom === void 0 ? false : _props$gutterBottom,\n      _props$noWrap = props.noWrap,\n      noWrap = _props$noWrap === void 0 ? false : _props$noWrap,\n      _props$paragraph = props.paragraph,\n      paragraph = _props$paragraph === void 0 ? false : _props$paragraph,\n      _props$variant = props.variant,\n      variant = _props$variant === void 0 ? 'body1' : _props$variant,\n      _props$variantMapping = props.variantMapping,\n      variantMapping = _props$variantMapping === void 0 ? defaultVariantMapping : _props$variantMapping,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"align\", \"classes\", \"className\", \"color\", \"component\", \"display\", \"gutterBottom\", \"noWrap\", \"paragraph\", \"variant\", \"variantMapping\"]);\n\n  var Component = component || (paragraph ? 'p' : variantMapping[variant] || defaultVariantMapping[variant]) || 'span';\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__[\"createElement\"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(classes.root, className, variant !== 'inherit' && classes[variant], color !== 'initial' && classes[\"color\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(color))], noWrap && classes.noWrap, gutterBottom && classes.gutterBottom, paragraph && classes.paragraph, align !== 'inherit' && classes[\"align\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(align))], display !== 'initial' && classes[\"display\".concat(Object(_utils_capitalize__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(display))]),\n    ref: ref\n  }, other));\n});\n true ? Typography.propTypes = {\n  /**\n   * Set the text-align on the component.\n   */\n  align: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['inherit', 'left', 'center', 'right', 'justify']),\n\n  /**\n   * The content of the component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n\n  /**\n   * The color of the component. It supports those theme colors that make sense for this component.\n   */\n  color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['initial', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary', 'error']),\n\n  /**\n   * The component used for the root node.\n   * Either a string to use a HTML element or a component.\n   * Overrides the behavior of the `variantMapping` prop.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a\n  /* @typescript-to-proptypes-ignore */\n  .elementType,\n\n  /**\n   * Controls the display type\n   */\n  display: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['initial', 'block', 'inline']),\n\n  /**\n   * If `true`, the text will have a bottom margin.\n   */\n  gutterBottom: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the text will not wrap, but instead will truncate with a text overflow ellipsis.\n   *\n   * Note that text overflow can only happen with block or inline-block level elements\n   * (the element needs to have a width in order to overflow).\n   */\n  noWrap: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * If `true`, the text will have a bottom margin.\n   */\n  paragraph: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * Applies the theme typography styles.\n   */\n  variant: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption', 'button', 'overline', 'srOnly', 'inherit']),\n\n  /**\n   * The component maps the variant prop to a range of different HTML element types.\n   * For instance, subtitle1 to `<h6>`.\n   * If you wish to change that mapping, you can provide your own.\n   * Alternatively, you can use the `component` prop.\n   */\n  variantMapping: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(styles, {\n  name: 'MuiTypography'\n})(Typography));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/Typography.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Typography__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js":
+/*!*************************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js ***!
+  \*************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utils_ownerDocument__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n/* harmony import */ var _utils_useForkRef__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/useForkRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* eslint-disable consistent-return, jsx-a11y/no-noninteractive-tabindex, camelcase */\n\n\n\n\n\n\n/**\n * Utility component that locks focus inside the component.\n */\n\nfunction Unstable_TrapFocus(props) {\n  var children = props.children,\n      _props$disableAutoFoc = props.disableAutoFocus,\n      disableAutoFocus = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc,\n      _props$disableEnforce = props.disableEnforceFocus,\n      disableEnforceFocus = _props$disableEnforce === void 0 ? false : _props$disableEnforce,\n      _props$disableRestore = props.disableRestoreFocus,\n      disableRestoreFocus = _props$disableRestore === void 0 ? false : _props$disableRestore,\n      getDoc = props.getDoc,\n      isEnabled = props.isEnabled,\n      open = props.open;\n  var ignoreNextEnforceFocus = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"]();\n  var sentinelStart = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](null);\n  var sentinelEnd = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](null);\n  var nodeToRestore = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"]();\n  var rootRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](null); // can be removed once we drop support for non ref forwarding class components\n\n  var handleOwnRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function (instance) {\n    // #StrictMode ready\n    rootRef.current = react_dom__WEBPACK_IMPORTED_MODULE_1__[\"findDOMNode\"](instance);\n  }, []);\n  var handleRef = Object(_utils_useForkRef__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(children.ref, handleOwnRef);\n  var prevOpenRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"]();\n  react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n    prevOpenRef.current = open;\n  }, [open]);\n\n  if (!prevOpenRef.current && open && typeof window !== 'undefined') {\n    // WARNING: Potentially unsafe in concurrent mode.\n    // The way the read on `nodeToRestore` is setup could make this actually safe.\n    // Say we render `open={false}` -> `open={true}` but never commit.\n    // We have now written a state that wasn't committed. But no committed effect\n    // will read this wrong value. We only read from `nodeToRestore` in effects\n    // that were committed on `open={true}`\n    // WARNING: Prevents the instance from being garbage collected. Should only\n    // hold a weak ref.\n    nodeToRestore.current = getDoc().activeElement;\n  }\n\n  react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n    if (!open) {\n      return;\n    }\n\n    var doc = Object(_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(rootRef.current); // We might render an empty child.\n\n    if (!disableAutoFocus && rootRef.current && !rootRef.current.contains(doc.activeElement)) {\n      if (!rootRef.current.hasAttribute('tabIndex')) {\n        if (true) {\n          console.error(['Material-UI: The modal content node does not accept focus.', 'For the benefit of assistive technologies, ' + 'the tabIndex of the node is being set to \"-1\".'].join('\\n'));\n        }\n\n        rootRef.current.setAttribute('tabIndex', -1);\n      }\n\n      rootRef.current.focus();\n    }\n\n    var contain = function contain() {\n      if (!doc.hasFocus() || disableEnforceFocus || !isEnabled() || ignoreNextEnforceFocus.current) {\n        ignoreNextEnforceFocus.current = false;\n        return;\n      }\n\n      if (rootRef.current && !rootRef.current.contains(doc.activeElement)) {\n        rootRef.current.focus();\n      }\n    };\n\n    var loopFocus = function loopFocus(event) {\n      // 9 = Tab\n      if (disableEnforceFocus || !isEnabled() || event.keyCode !== 9) {\n        return;\n      } // Make sure the next tab starts from the right place.\n\n\n      if (doc.activeElement === rootRef.current) {\n        // We need to ignore the next contain as\n        // it will try to move the focus back to the rootRef element.\n        ignoreNextEnforceFocus.current = true;\n\n        if (event.shiftKey) {\n          sentinelEnd.current.focus();\n        } else {\n          sentinelStart.current.focus();\n        }\n      }\n    };\n\n    doc.addEventListener('focus', contain, true);\n    doc.addEventListener('keydown', loopFocus, true); // With Edge, Safari and Firefox, no focus related events are fired when the focused area stops being a focused area\n    // e.g. https://bugzilla.mozilla.org/show_bug.cgi?id=559561.\n    //\n    // The whatwg spec defines how the browser should behave but does not explicitly mention any events:\n    // https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule.\n\n    var interval = setInterval(function () {\n      contain();\n    }, 50);\n    return function () {\n      clearInterval(interval);\n      doc.removeEventListener('focus', contain, true);\n      doc.removeEventListener('keydown', loopFocus, true); // restoreLastFocus()\n\n      if (!disableRestoreFocus) {\n        // In IE 11 it is possible for document.activeElement to be null resulting\n        // in nodeToRestore.current being null.\n        // Not all elements in IE 11 have a focus method.\n        // Once IE 11 support is dropped the focus() call can be unconditional.\n        if (nodeToRestore.current && nodeToRestore.current.focus) {\n          nodeToRestore.current.focus();\n        }\n\n        nodeToRestore.current = null;\n      }\n    };\n  }, [disableAutoFocus, disableEnforceFocus, disableRestoreFocus, isEnabled, open]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"div\", {\n    tabIndex: 0,\n    ref: sentinelStart,\n    \"data-test\": \"sentinelStart\"\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"](children, {\n    ref: handleRef\n  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"div\", {\n    tabIndex: 0,\n    ref: sentinelEnd,\n    \"data-test\": \"sentinelEnd\"\n  }));\n}\n\n true ? Unstable_TrapFocus.propTypes = {\n  // ----------------------------- Warning --------------------------------\n  // | These PropTypes are generated from the TypeScript type definitions |\n  // |     To update them edit the d.ts file and run \"yarn proptypes\"     |\n  // ----------------------------------------------------------------------\n\n  /**\n   * A single child content element.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n\n  /**\n   * If `true`, the trap focus will not automatically shift focus to itself when it opens, and\n   * replace it to the last focused element when it closes.\n   * This also works correctly with any trap focus children that have the `disableAutoFocus` prop.\n   *\n   * Generally this should never be set to `true` as it makes the trap focus less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableAutoFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * If `true`, the trap focus will not prevent focus from leaving the trap focus while open.\n   *\n   * Generally this should never be set to `true` as it makes the trap focus less\n   * accessible to assistive technologies, like screen readers.\n   */\n  disableEnforceFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * If `true`, the trap focus will not restore focus to previously focused element once\n   * trap focus is hidden.\n   */\n  disableRestoreFocus: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Return the document to consider.\n   * We use it to implement the restore focus between different browser documents.\n   */\n  getDoc: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,\n\n  /**\n   * Do we still want to enforce the focus?\n   * This prop helps nesting TrapFocus elements.\n   */\n  isEnabled: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired,\n\n  /**\n   * If `true`, focus will be locked.\n   */\n  open: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired\n} : undefined;\n\nif (true) {\n  // eslint-disable-next-line\n  Unstable_TrapFocus['propTypes' + ''] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"exactProp\"])(Unstable_TrapFocus.propTypes);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Unstable_TrapFocus);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js":
+/*!************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js ***!
+  \************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Unstable_TrapFocus */ \"./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _Unstable_TrapFocus__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/Unstable_TrapFocus/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js ***!
+  \***********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar blue = {\n  50: '#e3f2fd',\n  100: '#bbdefb',\n  200: '#90caf9',\n  300: '#64b5f6',\n  400: '#42a5f5',\n  500: '#2196f3',\n  600: '#1e88e5',\n  700: '#1976d2',\n  800: '#1565c0',\n  900: '#0d47a1',\n  A100: '#82b1ff',\n  A200: '#448aff',\n  A400: '#2979ff',\n  A700: '#2962ff'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (blue);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/common.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/common.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar common = {\n  black: '#000',\n  white: '#fff'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (common);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/common.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/green.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/green.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar green = {\n  50: '#e8f5e9',\n  100: '#c8e6c9',\n  200: '#a5d6a7',\n  300: '#81c784',\n  400: '#66bb6a',\n  500: '#4caf50',\n  600: '#43a047',\n  700: '#388e3c',\n  800: '#2e7d32',\n  900: '#1b5e20',\n  A100: '#b9f6ca',\n  A200: '#69f0ae',\n  A400: '#00e676',\n  A700: '#00c853'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (green);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/green.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js ***!
+  \***********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar grey = {\n  50: '#fafafa',\n  100: '#f5f5f5',\n  200: '#eeeeee',\n  300: '#e0e0e0',\n  400: '#bdbdbd',\n  500: '#9e9e9e',\n  600: '#757575',\n  700: '#616161',\n  800: '#424242',\n  900: '#212121',\n  A100: '#d5d5d5',\n  A200: '#aaaaaa',\n  A400: '#303030',\n  A700: '#616161'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (grey);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar indigo = {\n  50: '#e8eaf6',\n  100: '#c5cae9',\n  200: '#9fa8da',\n  300: '#7986cb',\n  400: '#5c6bc0',\n  500: '#3f51b5',\n  600: '#3949ab',\n  700: '#303f9f',\n  800: '#283593',\n  900: '#1a237e',\n  A100: '#8c9eff',\n  A200: '#536dfe',\n  A400: '#3d5afe',\n  A700: '#304ffe'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (indigo);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar orange = {\n  50: '#fff3e0',\n  100: '#ffe0b2',\n  200: '#ffcc80',\n  300: '#ffb74d',\n  400: '#ffa726',\n  500: '#ff9800',\n  600: '#fb8c00',\n  700: '#f57c00',\n  800: '#ef6c00',\n  900: '#e65100',\n  A100: '#ffd180',\n  A200: '#ffab40',\n  A400: '#ff9100',\n  A700: '#ff6d00'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (orange);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js ***!
+  \***********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar pink = {\n  50: '#fce4ec',\n  100: '#f8bbd0',\n  200: '#f48fb1',\n  300: '#f06292',\n  400: '#ec407a',\n  500: '#e91e63',\n  600: '#d81b60',\n  700: '#c2185b',\n  800: '#ad1457',\n  900: '#880e4f',\n  A100: '#ff80ab',\n  A200: '#ff4081',\n  A400: '#f50057',\n  A700: '#c51162'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (pink);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/colors/red.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/colors/red.js ***!
+  \**********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar red = {\n  50: '#ffebee',\n  100: '#ffcdd2',\n  200: '#ef9a9a',\n  300: '#e57373',\n  400: '#ef5350',\n  500: '#f44336',\n  600: '#e53935',\n  700: '#d32f2f',\n  800: '#c62828',\n  900: '#b71c1c',\n  A100: '#ff8a80',\n  A200: '#ff5252',\n  A400: '#ff1744',\n  A700: '#d50000'\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (red);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/colors/red.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js ***!
+  \*******************************************************************************/
+/*! exports provided: styles, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styles\", function() { return styles; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _utils_useControlled__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/useControlled */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js\");\n/* harmony import */ var _FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../FormControl/useFormControl */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControl/useFormControl.js\");\n/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../styles/withStyles */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js\");\n/* harmony import */ var _IconButton__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../IconButton */ \"./jaas-client/node_modules/@material-ui/core/esm/IconButton/index.js\");\n\n\n\n\n\n\n\n\n\n\n\nvar styles = {\n  root: {\n    padding: 9\n  },\n  checked: {},\n  disabled: {},\n  input: {\n    cursor: 'inherit',\n    position: 'absolute',\n    opacity: 0,\n    width: '100%',\n    height: '100%',\n    top: 0,\n    left: 0,\n    margin: 0,\n    padding: 0,\n    zIndex: 1\n  }\n};\n/**\n * @ignore - internal component.\n */\n\nvar SwitchBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"forwardRef\"](function SwitchBase(props, ref) {\n  var autoFocus = props.autoFocus,\n      checkedProp = props.checked,\n      checkedIcon = props.checkedIcon,\n      classes = props.classes,\n      className = props.className,\n      defaultChecked = props.defaultChecked,\n      disabledProp = props.disabled,\n      icon = props.icon,\n      id = props.id,\n      inputProps = props.inputProps,\n      inputRef = props.inputRef,\n      name = props.name,\n      onBlur = props.onBlur,\n      onChange = props.onChange,\n      onFocus = props.onFocus,\n      readOnly = props.readOnly,\n      required = props.required,\n      tabIndex = props.tabIndex,\n      type = props.type,\n      value = props.value,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(props, [\"autoFocus\", \"checked\", \"checkedIcon\", \"classes\", \"className\", \"defaultChecked\", \"disabled\", \"icon\", \"id\", \"inputProps\", \"inputRef\", \"name\", \"onBlur\", \"onChange\", \"onFocus\", \"readOnly\", \"required\", \"tabIndex\", \"type\", \"value\"]);\n\n  var _useControlled = Object(_utils_useControlled__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({\n    controlled: checkedProp,\n    default: Boolean(defaultChecked),\n    name: 'SwitchBase',\n    state: 'checked'\n  }),\n      _useControlled2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_useControlled, 2),\n      checked = _useControlled2[0],\n      setCheckedState = _useControlled2[1];\n\n  var muiFormControl = Object(_FormControl_useFormControl__WEBPACK_IMPORTED_MODULE_8__[\"default\"])();\n\n  var handleFocus = function handleFocus(event) {\n    if (onFocus) {\n      onFocus(event);\n    }\n\n    if (muiFormControl && muiFormControl.onFocus) {\n      muiFormControl.onFocus(event);\n    }\n  };\n\n  var handleBlur = function handleBlur(event) {\n    if (onBlur) {\n      onBlur(event);\n    }\n\n    if (muiFormControl && muiFormControl.onBlur) {\n      muiFormControl.onBlur(event);\n    }\n  };\n\n  var handleInputChange = function handleInputChange(event) {\n    var newChecked = event.target.checked;\n    setCheckedState(newChecked);\n\n    if (onChange) {\n      // TODO v5: remove the second argument.\n      onChange(event, newChecked);\n    }\n  };\n\n  var disabled = disabledProp;\n\n  if (muiFormControl) {\n    if (typeof disabled === 'undefined') {\n      disabled = muiFormControl.disabled;\n    }\n  }\n\n  var hasLabelFor = type === 'checkbox' || type === 'radio';\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](_IconButton__WEBPACK_IMPORTED_MODULE_10__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    component: \"span\",\n    className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(classes.root, className, checked && classes.checked, disabled && classes.disabled),\n    disabled: disabled,\n    tabIndex: null,\n    role: undefined,\n    onFocus: handleFocus,\n    onBlur: handleBlur,\n    ref: ref\n  }, other), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__[\"createElement\"](\"input\", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    autoFocus: autoFocus,\n    checked: checkedProp,\n    defaultChecked: defaultChecked,\n    className: classes.input,\n    disabled: disabled,\n    id: hasLabelFor && id,\n    name: name,\n    onChange: handleInputChange,\n    readOnly: readOnly,\n    ref: inputRef,\n    required: required,\n    tabIndex: tabIndex,\n    type: type,\n    value: value\n  }, inputProps)), checked ? checkedIcon : icon);\n}); // NB: If changed, please update Checkbox, Switch and Radio\n// so that the API documentation is updated.\n\n true ? SwitchBase.propTypes = {\n  /**\n   * If `true`, the `input` element will be focused during the first mount.\n   */\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the component is checked.\n   */\n  checked: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * The icon to display when the component is checked.\n   */\n  checkedIcon: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node.isRequired,\n\n  /**\n   * Override or extend the styles applied to the component.\n   * See [CSS API](#css) below for more details.\n   */\n  classes: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object.isRequired,\n\n  /**\n   * @ignore\n   */\n  className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  defaultChecked: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the switch will be disabled.\n   */\n  disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * The icon to display when the component is unchecked.\n   */\n  icon: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node.isRequired,\n\n  /**\n   * The id of the `input` element.\n   */\n  id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Attributes) applied to the `input` element.\n   */\n  inputProps: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n\n  /**\n   * Pass a ref to the `input` element.\n   */\n  inputRef: _material_ui_utils__WEBPACK_IMPORTED_MODULE_6__[\"refType\"],\n\n  /*\n   * @ignore\n   */\n  name: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n  /**\n   * @ignore\n   */\n  onBlur: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * Callback fired when the state is changed.\n   *\n   * @param {object} event The event source of the callback.\n   * You can pull out the new checked state by accessing `event.target.checked` (boolean).\n   */\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * @ignore\n   */\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n\n  /**\n   * It prevents the user from changing the value of the field\n   * (not from interacting with the field).\n   */\n  readOnly: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * If `true`, the `input` element will be required.\n   */\n  required: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * @ignore\n   */\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]),\n\n  /**\n   * The input component prop `type`.\n   */\n  type: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string.isRequired,\n\n  /**\n   * The value of the component.\n   */\n  value: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(styles, {\n  name: 'PrivateSwitchBase'\n})(SwitchBase));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/SwitchBase.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js":
+/*!********************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js ***!
+  \********************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M7 10l5 5 5-5z\"\n}), 'ArrowDropDown'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js":
+/*!***************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js ***!
+  \***************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"\n}), 'CheckBox'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js":
+/*!***************************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js ***!
+  \***************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"\n}), 'CheckBoxOutlineBlank'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js":
+/*!****************************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js ***!
+  \****************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z\"\n}), 'IndeterminateCheckBox'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js":
+/*!*************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js ***!
+  \*************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js\");\n\n\n/**\n * @ignore - internal component.\n */\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_utils_createSvgIcon__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"path\", {\n  d: \"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"\n}), 'Person'));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/internal/svg-icons/Person.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js ***!
+  \***********************************************************************************/
+/*! exports provided: hexToRgb, rgbToHex, hslToRgb, decomposeColor, recomposeColor, getContrastRatio, getLuminance, emphasize, fade, darken, lighten */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hexToRgb\", function() { return hexToRgb; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"rgbToHex\", function() { return rgbToHex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hslToRgb\", function() { return hslToRgb; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"decomposeColor\", function() { return decomposeColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"recomposeColor\", function() { return recomposeColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getContrastRatio\", function() { return getContrastRatio; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getLuminance\", function() { return getLuminance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"emphasize\", function() { return emphasize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fade\", function() { return fade; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"darken\", function() { return darken; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"lighten\", function() { return lighten; });\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\n/* eslint-disable no-use-before-define */\n\n/**\n * Returns a number whose value is limited to the given range.\n *\n * @param {number} value The value to be clamped\n * @param {number} min The lower boundary of the output range\n * @param {number} max The upper boundary of the output range\n * @returns {number} A number in the range [min, max]\n */\nfunction clamp(value) {\n  var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n  if (true) {\n    if (value < min || value > max) {\n      console.error(\"Material-UI: The value provided \".concat(value, \" is out of range [\").concat(min, \", \").concat(max, \"].\"));\n    }\n  }\n\n  return Math.min(Math.max(min, value), max);\n}\n/**\n * Converts a color from CSS hex format to CSS rgb format.\n *\n * @param {string} color - Hex color, i.e. #nnn or #nnnnnn\n * @returns {string} A CSS rgb color string\n */\n\n\nfunction hexToRgb(color) {\n  color = color.substr(1);\n  var re = new RegExp(\".{1,\".concat(color.length >= 6 ? 2 : 1, \"}\"), 'g');\n  var colors = color.match(re);\n\n  if (colors && colors[0].length === 1) {\n    colors = colors.map(function (n) {\n      return n + n;\n    });\n  }\n\n  return colors ? \"rgb\".concat(colors.length === 4 ? 'a' : '', \"(\").concat(colors.map(function (n, index) {\n    return index < 3 ? parseInt(n, 16) : Math.round(parseInt(n, 16) / 255 * 1000) / 1000;\n  }).join(', '), \")\") : '';\n}\n\nfunction intToHex(int) {\n  var hex = int.toString(16);\n  return hex.length === 1 ? \"0\".concat(hex) : hex;\n}\n/**\n * Converts a color from CSS rgb format to CSS hex format.\n *\n * @param {string} color - RGB color, i.e. rgb(n, n, n)\n * @returns {string} A CSS rgb color string, i.e. #nnnnnn\n */\n\n\nfunction rgbToHex(color) {\n  // Idempotent\n  if (color.indexOf('#') === 0) {\n    return color;\n  }\n\n  var _decomposeColor = decomposeColor(color),\n      values = _decomposeColor.values;\n\n  return \"#\".concat(values.map(function (n) {\n    return intToHex(n);\n  }).join(''));\n}\n/**\n * Converts a color from hsl format to rgb format.\n *\n * @param {string} color - HSL color values\n * @returns {string} rgb color values\n */\n\nfunction hslToRgb(color) {\n  color = decomposeColor(color);\n  var _color = color,\n      values = _color.values;\n  var h = values[0];\n  var s = values[1] / 100;\n  var l = values[2] / 100;\n  var a = s * Math.min(l, 1 - l);\n\n  var f = function f(n) {\n    var k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (n + h / 30) % 12;\n    return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n  };\n\n  var type = 'rgb';\n  var rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n\n  if (color.type === 'hsla') {\n    type += 'a';\n    rgb.push(values[3]);\n  }\n\n  return recomposeColor({\n    type: type,\n    values: rgb\n  });\n}\n/**\n * Returns an object with the type and values of a color.\n *\n * Note: Does not support rgb % values.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {object} - A MUI color object: {type: string, values: number[]}\n */\n\nfunction decomposeColor(color) {\n  // Idempotent\n  if (color.type) {\n    return color;\n  }\n\n  if (color.charAt(0) === '#') {\n    return decomposeColor(hexToRgb(color));\n  }\n\n  var marker = color.indexOf('(');\n  var type = color.substring(0, marker);\n\n  if (['rgb', 'rgba', 'hsl', 'hsla'].indexOf(type) === -1) {\n    throw new Error( true ? \"Material-UI: Unsupported `\".concat(color, \"` color.\\nWe support the following formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla().\") : undefined);\n  }\n\n  var values = color.substring(marker + 1, color.length - 1).split(',');\n  values = values.map(function (value) {\n    return parseFloat(value);\n  });\n  return {\n    type: type,\n    values: values\n  };\n}\n/**\n * Converts a color object with type and values to a string.\n *\n * @param {object} color - Decomposed color\n * @param {string} color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla'\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\n * @returns {string} A CSS color string\n */\n\nfunction recomposeColor(color) {\n  var type = color.type;\n  var values = color.values;\n\n  if (type.indexOf('rgb') !== -1) {\n    // Only convert the first 3 values to int (i.e. not alpha)\n    values = values.map(function (n, i) {\n      return i < 3 ? parseInt(n, 10) : n;\n    });\n  } else if (type.indexOf('hsl') !== -1) {\n    values[1] = \"\".concat(values[1], \"%\");\n    values[2] = \"\".concat(values[2], \"%\");\n  }\n\n  return \"\".concat(type, \"(\").concat(values.join(', '), \")\");\n}\n/**\n * Calculates the contrast ratio between two colors.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n *\n * @param {string} foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {string} background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {number} A contrast ratio value in the range 0 - 21.\n */\n\nfunction getContrastRatio(foreground, background) {\n  var lumA = getLuminance(foreground);\n  var lumB = getLuminance(background);\n  return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n/**\n * The relative brightness of any point in a color space,\n * normalized to 0 for darkest black and 1 for lightest white.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {number} The relative brightness of the color in the range 0 - 1\n */\n\nfunction getLuminance(color) {\n  color = decomposeColor(color);\n  var rgb = color.type === 'hsl' ? decomposeColor(hslToRgb(color)).values : color.values;\n  rgb = rgb.map(function (val) {\n    val /= 255; // normalized\n\n    return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n  }); // Truncate at 3 digits\n\n  return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3));\n}\n/**\n * Darken or lighten a color, depending on its luminance.\n * Light colors are darkened, dark colors are lightened.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} coefficient=0.15 - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction emphasize(color) {\n  var coefficient = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.15;\n  return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n/**\n * Set the absolute transparency of a color.\n * Any existing alpha values are overwritten.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} value - value to set the alpha channel to in the range 0 -1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction fade(color, value) {\n  color = decomposeColor(color);\n  value = clamp(value);\n\n  if (color.type === 'rgb' || color.type === 'hsl') {\n    color.type += 'a';\n  }\n\n  color.values[3] = value;\n  return recomposeColor(color);\n}\n/**\n * Darkens a color.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction darken(color, coefficient) {\n  color = decomposeColor(color);\n  coefficient = clamp(coefficient);\n\n  if (color.type.indexOf('hsl') !== -1) {\n    color.values[2] *= 1 - coefficient;\n  } else if (color.type.indexOf('rgb') !== -1) {\n    for (var i = 0; i < 3; i += 1) {\n      color.values[i] *= 1 - coefficient;\n    }\n  }\n\n  return recomposeColor(color);\n}\n/**\n * Lightens a color.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\n\nfunction lighten(color, coefficient) {\n  color = decomposeColor(color);\n  coefficient = clamp(coefficient);\n\n  if (color.type.indexOf('hsl') !== -1) {\n    color.values[2] += (100 - color.values[2]) * coefficient;\n  } else if (color.type.indexOf('rgb') !== -1) {\n    for (var i = 0; i < 3; i += 1) {\n      color.values[i] += (255 - color.values[i]) * coefficient;\n    }\n  }\n\n  return recomposeColor(color);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js":
+/*!************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js ***!
+  \************************************************************************************/
+/*! exports provided: keys, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"keys\", function() { return keys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createBreakpoints; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n\n\n// Sorted ASC by size. That's important.\n// It can't be configured as it's used statically for propTypes.\nvar keys = ['xs', 'sm', 'md', 'lg', 'xl']; // Keep in mind that @media is inclusive by the CSS specification.\n\nfunction createBreakpoints(breakpoints) {\n  var _breakpoints$values = breakpoints.values,\n      values = _breakpoints$values === void 0 ? {\n    xs: 0,\n    sm: 600,\n    md: 960,\n    lg: 1280,\n    xl: 1920\n  } : _breakpoints$values,\n      _breakpoints$unit = breakpoints.unit,\n      unit = _breakpoints$unit === void 0 ? 'px' : _breakpoints$unit,\n      _breakpoints$step = breakpoints.step,\n      step = _breakpoints$step === void 0 ? 5 : _breakpoints$step,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(breakpoints, [\"values\", \"unit\", \"step\"]);\n\n  function up(key) {\n    var value = typeof values[key] === 'number' ? values[key] : key;\n    return \"@media (min-width:\".concat(value).concat(unit, \")\");\n  }\n\n  function down(key) {\n    var endIndex = keys.indexOf(key) + 1;\n    var upperbound = values[keys[endIndex]];\n\n    if (endIndex === keys.length) {\n      // xl down applies to all sizes\n      return up('xs');\n    }\n\n    var value = typeof upperbound === 'number' && endIndex > 0 ? upperbound : key;\n    return \"@media (max-width:\".concat(value - step / 100).concat(unit, \")\");\n  }\n\n  function between(start, end) {\n    var endIndex = keys.indexOf(end);\n\n    if (endIndex === keys.length - 1) {\n      return up(start);\n    }\n\n    return \"@media (min-width:\".concat(typeof values[start] === 'number' ? values[start] : start).concat(unit, \") and \") + \"(max-width:\".concat((endIndex !== -1 && typeof values[keys[endIndex + 1]] === 'number' ? values[keys[endIndex + 1]] : end) - step / 100).concat(unit, \")\");\n  }\n\n  function only(key) {\n    return between(key, key);\n  }\n\n  function width(key) {\n    return values[key];\n  }\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    keys: keys,\n    values: values,\n    up: up,\n    down: down,\n    between: between,\n    only: only,\n    width: width\n  }, other);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createMixins; });\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n\n\nfunction createMixins(breakpoints, spacing, mixins) {\n  var _toolbar;\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n    gutters: function gutters() {\n      var styles = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      // To deprecate in v4.1\n      //       warning(\n      //         false,\n      //         [\n      //           'Material-UI: Theme.mixins.gutters() is deprecated.',\n      //           'You can use the source of the mixin directly:',\n      //           `\n      // paddingLeft: theme.spacing(2),\n      // paddingRight: theme.spacing(2),\n      // [theme.breakpoints.up('sm')]: {\n      //   paddingLeft: theme.spacing(3),\n      //   paddingRight: theme.spacing(3),\n      // },\n      // `,\n      //         ].join('\\n'),\n      //       );\n      return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        paddingLeft: spacing(2),\n        paddingRight: spacing(2)\n      }, styles, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, breakpoints.up('sm'), Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        paddingLeft: spacing(3),\n        paddingRight: spacing(3)\n      }, styles[breakpoints.up('sm')])));\n    },\n    toolbar: (_toolbar = {\n      minHeight: 56\n    }, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_toolbar, \"\".concat(breakpoints.up('xs'), \" and (orientation: landscape)\"), {\n      minHeight: 48\n    }), Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_toolbar, breakpoints.up('sm'), {\n      minHeight: 64\n    }), _toolbar)\n  }, mixins);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js ***!
+  \*********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _createBreakpoints__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./createBreakpoints */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createBreakpoints.js\");\n/* harmony import */ var _createMixins__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./createMixins */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createMixins.js\");\n/* harmony import */ var _createPalette__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./createPalette */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js\");\n/* harmony import */ var _createTypography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./createTypography */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js\");\n/* harmony import */ var _shadows__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./shadows */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js\");\n/* harmony import */ var _shape__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./shape */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js\");\n/* harmony import */ var _createSpacing__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./createSpacing */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js\");\n/* harmony import */ var _transitions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./transitions */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js\");\n/* harmony import */ var _zIndex__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./zIndex */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction createMuiTheme() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var _options$breakpoints = options.breakpoints,\n      breakpointsInput = _options$breakpoints === void 0 ? {} : _options$breakpoints,\n      _options$mixins = options.mixins,\n      mixinsInput = _options$mixins === void 0 ? {} : _options$mixins,\n      _options$palette = options.palette,\n      paletteInput = _options$palette === void 0 ? {} : _options$palette,\n      spacingInput = options.spacing,\n      _options$typography = options.typography,\n      typographyInput = _options$typography === void 0 ? {} : _options$typography,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(options, [\"breakpoints\", \"mixins\", \"palette\", \"spacing\", \"typography\"]);\n\n  var palette = Object(_createPalette__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(paletteInput);\n  var breakpoints = Object(_createBreakpoints__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(breakpointsInput);\n  var spacing = Object(_createSpacing__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(spacingInput);\n  var muiTheme = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])({\n    breakpoints: breakpoints,\n    direction: 'ltr',\n    mixins: Object(_createMixins__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(breakpoints, spacing, mixinsInput),\n    overrides: {},\n    // Inject custom styles\n    palette: palette,\n    props: {},\n    // Provide default props\n    shadows: _shadows__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n    typography: Object(_createTypography__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(palette, typographyInput),\n    spacing: spacing,\n    shape: _shape__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n    transitions: _transitions__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n    zIndex: _zIndex__WEBPACK_IMPORTED_MODULE_11__[\"default\"]\n  }, other);\n\n  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    args[_key - 1] = arguments[_key];\n  }\n\n  muiTheme = args.reduce(function (acc, argument) {\n    return Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(acc, argument);\n  }, muiTheme);\n\n  if (true) {\n    var pseudoClasses = ['checked', 'disabled', 'error', 'focused', 'focusVisible', 'required', 'expanded', 'selected'];\n\n    var traverse = function traverse(node, parentKey) {\n      var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n      var key; // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n      for (key in node) {\n        var child = node[key];\n\n        if (depth === 1) {\n          if (key.indexOf('Mui') === 0 && child) {\n            traverse(child, key, depth + 1);\n          }\n        } else if (pseudoClasses.indexOf(key) !== -1 && Object.keys(child).length > 0) {\n          if (true) {\n            console.error([\"Material-UI: The `\".concat(parentKey, \"` component increases \") + \"the CSS specificity of the `\".concat(key, \"` internal state.\"), 'You can not override it like this: ', JSON.stringify(node, null, 2), '', 'Instead, you need to use the $ruleName syntax:', JSON.stringify({\n              root: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, \"&$\".concat(key), child)\n            }, null, 2), '', 'https://material-ui.com/r/pseudo-classes-guide'].join('\\n'));\n          } // Remove the style to prevent global conflicts.\n\n\n          node[key] = {};\n        }\n      }\n    };\n\n    traverse(muiTheme.overrides);\n  }\n\n  return muiTheme;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (createMuiTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js ***!
+  \********************************************************************************/
+/*! exports provided: light, dark, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"light\", function() { return light; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"dark\", function() { return dark; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createPalette; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _colors_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../colors/common */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/common.js\");\n/* harmony import */ var _colors_grey__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../colors/grey */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/grey.js\");\n/* harmony import */ var _colors_indigo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../colors/indigo */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/indigo.js\");\n/* harmony import */ var _colors_pink__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../colors/pink */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/pink.js\");\n/* harmony import */ var _colors_red__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../colors/red */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/red.js\");\n/* harmony import */ var _colors_orange__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../colors/orange */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/orange.js\");\n/* harmony import */ var _colors_blue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../colors/blue */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/blue.js\");\n/* harmony import */ var _colors_green__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../colors/green */ \"./jaas-client/node_modules/@material-ui/core/esm/colors/green.js\");\n/* harmony import */ var _colorManipulator__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./colorManipulator */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/colorManipulator.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar light = {\n  // The colors used to style the text.\n  text: {\n    // The most important text.\n    primary: 'rgba(0, 0, 0, 0.87)',\n    // Secondary text.\n    secondary: 'rgba(0, 0, 0, 0.54)',\n    // Disabled text have even lower visual prominence.\n    disabled: 'rgba(0, 0, 0, 0.38)',\n    // Text hints.\n    hint: 'rgba(0, 0, 0, 0.38)'\n  },\n  // The color used to divide different elements.\n  divider: 'rgba(0, 0, 0, 0.12)',\n  // The background colors used to style the surfaces.\n  // Consistency between these values is important.\n  background: {\n    paper: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"].white,\n    default: _colors_grey__WEBPACK_IMPORTED_MODULE_4__[\"default\"][50]\n  },\n  // The colors used to style the action elements.\n  action: {\n    // The color of an active action like an icon button.\n    active: 'rgba(0, 0, 0, 0.54)',\n    // The color of an hovered action.\n    hover: 'rgba(0, 0, 0, 0.04)',\n    hoverOpacity: 0.04,\n    // The color of a selected action.\n    selected: 'rgba(0, 0, 0, 0.08)',\n    selectedOpacity: 0.08,\n    // The color of a disabled action.\n    disabled: 'rgba(0, 0, 0, 0.26)',\n    // The background color of a disabled action.\n    disabledBackground: 'rgba(0, 0, 0, 0.12)',\n    disabledOpacity: 0.38,\n    focus: 'rgba(0, 0, 0, 0.12)',\n    focusOpacity: 0.12,\n    activatedOpacity: 0.12\n  }\n};\nvar dark = {\n  text: {\n    primary: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"].white,\n    secondary: 'rgba(255, 255, 255, 0.7)',\n    disabled: 'rgba(255, 255, 255, 0.5)',\n    hint: 'rgba(255, 255, 255, 0.5)',\n    icon: 'rgba(255, 255, 255, 0.5)'\n  },\n  divider: 'rgba(255, 255, 255, 0.12)',\n  background: {\n    paper: _colors_grey__WEBPACK_IMPORTED_MODULE_4__[\"default\"][800],\n    default: '#303030'\n  },\n  action: {\n    active: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"].white,\n    hover: 'rgba(255, 255, 255, 0.08)',\n    hoverOpacity: 0.08,\n    selected: 'rgba(255, 255, 255, 0.16)',\n    selectedOpacity: 0.16,\n    disabled: 'rgba(255, 255, 255, 0.3)',\n    disabledBackground: 'rgba(255, 255, 255, 0.12)',\n    disabledOpacity: 0.38,\n    focus: 'rgba(255, 255, 255, 0.12)',\n    focusOpacity: 0.12,\n    activatedOpacity: 0.24\n  }\n};\n\nfunction addLightOrDark(intent, direction, shade, tonalOffset) {\n  var tonalOffsetLight = tonalOffset.light || tonalOffset;\n  var tonalOffsetDark = tonalOffset.dark || tonalOffset * 1.5;\n\n  if (!intent[direction]) {\n    if (intent.hasOwnProperty(shade)) {\n      intent[direction] = intent[shade];\n    } else if (direction === 'light') {\n      intent.light = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"lighten\"])(intent.main, tonalOffsetLight);\n    } else if (direction === 'dark') {\n      intent.dark = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"darken\"])(intent.main, tonalOffsetDark);\n    }\n  }\n}\n\nfunction createPalette(palette) {\n  var _palette$primary = palette.primary,\n      primary = _palette$primary === void 0 ? {\n    light: _colors_indigo__WEBPACK_IMPORTED_MODULE_5__[\"default\"][300],\n    main: _colors_indigo__WEBPACK_IMPORTED_MODULE_5__[\"default\"][500],\n    dark: _colors_indigo__WEBPACK_IMPORTED_MODULE_5__[\"default\"][700]\n  } : _palette$primary,\n      _palette$secondary = palette.secondary,\n      secondary = _palette$secondary === void 0 ? {\n    light: _colors_pink__WEBPACK_IMPORTED_MODULE_6__[\"default\"].A200,\n    main: _colors_pink__WEBPACK_IMPORTED_MODULE_6__[\"default\"].A400,\n    dark: _colors_pink__WEBPACK_IMPORTED_MODULE_6__[\"default\"].A700\n  } : _palette$secondary,\n      _palette$error = palette.error,\n      error = _palette$error === void 0 ? {\n    light: _colors_red__WEBPACK_IMPORTED_MODULE_7__[\"default\"][300],\n    main: _colors_red__WEBPACK_IMPORTED_MODULE_7__[\"default\"][500],\n    dark: _colors_red__WEBPACK_IMPORTED_MODULE_7__[\"default\"][700]\n  } : _palette$error,\n      _palette$warning = palette.warning,\n      warning = _palette$warning === void 0 ? {\n    light: _colors_orange__WEBPACK_IMPORTED_MODULE_8__[\"default\"][300],\n    main: _colors_orange__WEBPACK_IMPORTED_MODULE_8__[\"default\"][500],\n    dark: _colors_orange__WEBPACK_IMPORTED_MODULE_8__[\"default\"][700]\n  } : _palette$warning,\n      _palette$info = palette.info,\n      info = _palette$info === void 0 ? {\n    light: _colors_blue__WEBPACK_IMPORTED_MODULE_9__[\"default\"][300],\n    main: _colors_blue__WEBPACK_IMPORTED_MODULE_9__[\"default\"][500],\n    dark: _colors_blue__WEBPACK_IMPORTED_MODULE_9__[\"default\"][700]\n  } : _palette$info,\n      _palette$success = palette.success,\n      success = _palette$success === void 0 ? {\n    light: _colors_green__WEBPACK_IMPORTED_MODULE_10__[\"default\"][300],\n    main: _colors_green__WEBPACK_IMPORTED_MODULE_10__[\"default\"][500],\n    dark: _colors_green__WEBPACK_IMPORTED_MODULE_10__[\"default\"][700]\n  } : _palette$success,\n      _palette$type = palette.type,\n      type = _palette$type === void 0 ? 'light' : _palette$type,\n      _palette$contrastThre = palette.contrastThreshold,\n      contrastThreshold = _palette$contrastThre === void 0 ? 3 : _palette$contrastThre,\n      _palette$tonalOffset = palette.tonalOffset,\n      tonalOffset = _palette$tonalOffset === void 0 ? 0.2 : _palette$tonalOffset,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(palette, [\"primary\", \"secondary\", \"error\", \"warning\", \"info\", \"success\", \"type\", \"contrastThreshold\", \"tonalOffset\"]); // Use the same logic as\n  // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59\n  // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54\n\n\n  function getContrastText(background) {\n    var contrastText = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"getContrastRatio\"])(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n\n    if (true) {\n      var contrast = Object(_colorManipulator__WEBPACK_IMPORTED_MODULE_11__[\"getContrastRatio\"])(background, contrastText);\n\n      if (contrast < 3) {\n        console.error([\"Material-UI: The contrast ratio of \".concat(contrast, \":1 for \").concat(contrastText, \" on \").concat(background), 'falls below the WCAG recommended absolute minimum contrast ratio of 3:1.', 'https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast'].join('\\n'));\n      }\n    }\n\n    return contrastText;\n  }\n\n  var augmentColor = function augmentColor(color) {\n    var mainShade = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;\n    var lightShade = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 300;\n    var darkShade = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 700;\n    color = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, color);\n\n    if (!color.main && color[mainShade]) {\n      color.main = color[mainShade];\n    }\n\n    if (!color.main) {\n      throw new Error( true ? \"Material-UI: The color provided to augmentColor(color) is invalid.\\nThe color object needs to have a `main` property or a `\".concat(mainShade, \"` property.\") : undefined);\n    }\n\n    if (typeof color.main !== 'string') {\n      throw new Error( true ? \"Material-UI: The color provided to augmentColor(color) is invalid.\\n`color.main` should be a string, but `\".concat(JSON.stringify(color.main), \"` was provided instead.\\n\\nDid you intend to use one of the following approaches?\\n\\nimport {\\xA0green } from \\\"@material-ui/core/colors\\\";\\n\\nconst theme1 = createMuiTheme({ palette: {\\n  primary: green,\\n} });\\n\\nconst theme2 = createMuiTheme({ palette: {\\n  primary: { main: green[500] },\\n} });\") : undefined);\n    }\n\n    addLightOrDark(color, 'light', lightShade, tonalOffset);\n    addLightOrDark(color, 'dark', darkShade, tonalOffset);\n\n    if (!color.contrastText) {\n      color.contrastText = getContrastText(color.main);\n    }\n\n    return color;\n  };\n\n  var types = {\n    dark: dark,\n    light: light\n  };\n\n  if (true) {\n    if (!types[type]) {\n      console.error(\"Material-UI: The palette type `\".concat(type, \"` is not supported.\"));\n    }\n  }\n\n  var paletteOutput = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    // A collection of common colors.\n    common: _colors_common__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n    // The palette type, can be light or dark.\n    type: type,\n    // The colors used to represent primary interface elements for a user.\n    primary: augmentColor(primary),\n    // The colors used to represent secondary interface elements for a user.\n    secondary: augmentColor(secondary, 'A400', 'A200', 'A700'),\n    // The colors used to represent interface elements that the user should be made aware of.\n    error: augmentColor(error),\n    // The colors used to represent potentially dangerous actions or important messages.\n    warning: augmentColor(warning),\n    // The colors used to present information to the user that is neutral and not necessarily important.\n    info: augmentColor(info),\n    // The colors used to indicate the successful completion of an action that user triggered.\n    success: augmentColor(success),\n    // The grey colors.\n    grey: _colors_grey__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n    // Used by `getContrastText()` to maximize the contrast between\n    // the background and the text.\n    contrastThreshold: contrastThreshold,\n    // Takes a background color and returns the text color that maximizes the contrast.\n    getContrastText: getContrastText,\n    // Generate a rich color object.\n    augmentColor: augmentColor,\n    // Used by the functions below to shift a color's luminance by approximately\n    // two indexes within its tonal palette.\n    // E.g., shift from Red 500 to Red 300 or Red 700.\n    tonalOffset: tonalOffset\n  }, types[type]), other);\n  return paletteOutput;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createPalette.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js ***!
+  \********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createSpacing; });\n/* harmony import */ var _material_ui_system__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/system */ \"./jaas-client/node_modules/@material-ui/system/esm/index.js\");\n\nvar warnOnce;\nfunction createSpacing() {\n  var spacingInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 8;\n\n  // Already transformed.\n  if (spacingInput.mui) {\n    return spacingInput;\n  } // Material Design layouts are visually balanced. Most measurements align to an 8dp grid applied, which aligns both spacing and the overall layout.\n  // Smaller components, such as icons and type, can align to a 4dp grid.\n  // https://material.io/design/layout/understanding-layout.html#usage\n\n\n  var transform = Object(_material_ui_system__WEBPACK_IMPORTED_MODULE_0__[\"createUnarySpacing\"])({\n    spacing: spacingInput\n  });\n\n  var spacing = function spacing() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    if (true) {\n      if (!(args.length <= 4)) {\n        console.error(\"Material-UI: Too many arguments provided, expected between 0 and 4, got \".concat(args.length));\n      }\n    }\n\n    if (args.length === 0) {\n      return transform(1);\n    }\n\n    if (args.length === 1) {\n      return transform(args[0]);\n    }\n\n    return args.map(function (argument) {\n      if (typeof argument === 'string') {\n        return argument;\n      }\n\n      var output = transform(argument);\n      return typeof output === 'number' ? \"\".concat(output, \"px\") : output;\n    }).join(' ');\n  }; // Backward compatibility, to remove in v5.\n\n\n  Object.defineProperty(spacing, 'unit', {\n    get: function get() {\n      if (true) {\n        if (!warnOnce || \"development\" === 'test') {\n          console.error(['Material-UI: theme.spacing.unit usage has been deprecated.', 'It will be removed in v5.', 'You can replace `theme.spacing.unit * y` with `theme.spacing(y)`.', '', 'You can use the `https://github.com/mui-org/material-ui/tree/master/packages/material-ui-codemod/README.md#theme-spacing-api` migration helper to make the process smoother.'].join('\\n'));\n        }\n\n        warnOnce = true;\n      }\n\n      return spacingInput;\n    }\n  });\n  spacing.mui = true;\n  return spacing;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createSpacing.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js ***!
+  \***********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createTypography; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\n\n\nfunction round(value) {\n  return Math.round(value * 1e5) / 1e5;\n}\n\nvar caseAllCaps = {\n  textTransform: 'uppercase'\n};\nvar defaultFontFamily = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\n/**\n * @see @link{https://material.io/design/typography/the-type-system.html}\n * @see @link{https://material.io/design/typography/understanding-typography.html}\n */\n\nfunction createTypography(palette, typography) {\n  var _ref = typeof typography === 'function' ? typography(palette) : typography,\n      _ref$fontFamily = _ref.fontFamily,\n      fontFamily = _ref$fontFamily === void 0 ? defaultFontFamily : _ref$fontFamily,\n      _ref$fontSize = _ref.fontSize,\n      fontSize = _ref$fontSize === void 0 ? 14 : _ref$fontSize,\n      _ref$fontWeightLight = _ref.fontWeightLight,\n      fontWeightLight = _ref$fontWeightLight === void 0 ? 300 : _ref$fontWeightLight,\n      _ref$fontWeightRegula = _ref.fontWeightRegular,\n      fontWeightRegular = _ref$fontWeightRegula === void 0 ? 400 : _ref$fontWeightRegula,\n      _ref$fontWeightMedium = _ref.fontWeightMedium,\n      fontWeightMedium = _ref$fontWeightMedium === void 0 ? 500 : _ref$fontWeightMedium,\n      _ref$fontWeightBold = _ref.fontWeightBold,\n      fontWeightBold = _ref$fontWeightBold === void 0 ? 700 : _ref$fontWeightBold,\n      _ref$htmlFontSize = _ref.htmlFontSize,\n      htmlFontSize = _ref$htmlFontSize === void 0 ? 16 : _ref$htmlFontSize,\n      allVariants = _ref.allVariants,\n      pxToRem2 = _ref.pxToRem,\n      other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_ref, [\"fontFamily\", \"fontSize\", \"fontWeightLight\", \"fontWeightRegular\", \"fontWeightMedium\", \"fontWeightBold\", \"htmlFontSize\", \"allVariants\", \"pxToRem\"]);\n\n  if (true) {\n    if (typeof fontSize !== 'number') {\n      console.error('Material-UI: `fontSize` is required to be a number.');\n    }\n\n    if (typeof htmlFontSize !== 'number') {\n      console.error('Material-UI: `htmlFontSize` is required to be a number.');\n    }\n  }\n\n  var coef = fontSize / 14;\n\n  var pxToRem = pxToRem2 || function (size) {\n    return \"\".concat(size / htmlFontSize * coef, \"rem\");\n  };\n\n  var buildVariant = function buildVariant(fontWeight, size, lineHeight, letterSpacing, casing) {\n    return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      fontFamily: fontFamily,\n      fontWeight: fontWeight,\n      fontSize: pxToRem(size),\n      // Unitless following https://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/\n      lineHeight: lineHeight\n    }, fontFamily === defaultFontFamily ? {\n      letterSpacing: \"\".concat(round(letterSpacing / size), \"em\")\n    } : {}, casing, allVariants);\n  };\n\n  var variants = {\n    h1: buildVariant(fontWeightLight, 96, 1.167, -1.5),\n    h2: buildVariant(fontWeightLight, 60, 1.2, -0.5),\n    h3: buildVariant(fontWeightRegular, 48, 1.167, 0),\n    h4: buildVariant(fontWeightRegular, 34, 1.235, 0.25),\n    h5: buildVariant(fontWeightRegular, 24, 1.334, 0),\n    h6: buildVariant(fontWeightMedium, 20, 1.6, 0.15),\n    subtitle1: buildVariant(fontWeightRegular, 16, 1.75, 0.15),\n    subtitle2: buildVariant(fontWeightMedium, 14, 1.57, 0.1),\n    body1: buildVariant(fontWeightRegular, 16, 1.5, 0.15),\n    body2: buildVariant(fontWeightRegular, 14, 1.43, 0.15),\n    button: buildVariant(fontWeightMedium, 14, 1.75, 0.4, caseAllCaps),\n    caption: buildVariant(fontWeightRegular, 12, 1.66, 0.4),\n    overline: buildVariant(fontWeightRegular, 12, 2.66, 1, caseAllCaps)\n  };\n  return Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    htmlFontSize: htmlFontSize,\n    pxToRem: pxToRem,\n    round: round,\n    // TODO v5: remove\n    fontFamily: fontFamily,\n    fontSize: fontSize,\n    fontWeightLight: fontWeightLight,\n    fontWeightRegular: fontWeightRegular,\n    fontWeightMedium: fontWeightMedium,\n    fontWeightBold: fontWeightBold\n  }, variants), other, {\n    clone: false // No need to clone deep\n\n  });\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/createTypography.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createMuiTheme__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createMuiTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/createMuiTheme.js\");\n\nvar defaultTheme = Object(_createMuiTheme__WEBPACK_IMPORTED_MODULE_0__[\"default\"])();\n/* harmony default export */ __webpack_exports__[\"default\"] = (defaultTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js":
+/*!**************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js ***!
+  \**************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar shadowKeyUmbraOpacity = 0.2;\nvar shadowKeyPenumbraOpacity = 0.14;\nvar shadowAmbientShadowOpacity = 0.12;\n\nfunction createShadow() {\n  return [\"\".concat(arguments.length <= 0 ? undefined : arguments[0], \"px \").concat(arguments.length <= 1 ? undefined : arguments[1], \"px \").concat(arguments.length <= 2 ? undefined : arguments[2], \"px \").concat(arguments.length <= 3 ? undefined : arguments[3], \"px rgba(0,0,0,\").concat(shadowKeyUmbraOpacity, \")\"), \"\".concat(arguments.length <= 4 ? undefined : arguments[4], \"px \").concat(arguments.length <= 5 ? undefined : arguments[5], \"px \").concat(arguments.length <= 6 ? undefined : arguments[6], \"px \").concat(arguments.length <= 7 ? undefined : arguments[7], \"px rgba(0,0,0,\").concat(shadowKeyPenumbraOpacity, \")\"), \"\".concat(arguments.length <= 8 ? undefined : arguments[8], \"px \").concat(arguments.length <= 9 ? undefined : arguments[9], \"px \").concat(arguments.length <= 10 ? undefined : arguments[10], \"px \").concat(arguments.length <= 11 ? undefined : arguments[11], \"px rgba(0,0,0,\").concat(shadowAmbientShadowOpacity, \")\")].join(',');\n} // Values from https://github.com/material-components/material-components-web/blob/be8747f94574669cb5e7add1a7c54fa41a89cec7/packages/mdc-elevation/_variables.scss\n\n\nvar shadows = ['none', createShadow(0, 2, 1, -1, 0, 1, 1, 0, 0, 1, 3, 0), createShadow(0, 3, 1, -2, 0, 2, 2, 0, 0, 1, 5, 0), createShadow(0, 3, 3, -2, 0, 3, 4, 0, 0, 1, 8, 0), createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8)];\n/* harmony default export */ __webpack_exports__[\"default\"] = (shadows);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/shadows.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar shape = {\n  borderRadius: 4\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (shape);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/shape.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _defaultTheme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js\");\n\n\n\n\nvar styled = function styled(Component) {\n  var componentCreator = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_1__[\"styled\"])(Component);\n  return function (style, options) {\n    return componentCreator(style, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      defaultTheme: _defaultTheme__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n    }, options));\n  };\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (styled);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/styled.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js ***!
+  \******************************************************************************/
+/*! exports provided: easing, duration, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"easing\", function() { return easing; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"duration\", function() { return duration; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n\n// Follow https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves\n// to learn the context in which each easing should be used.\nvar easing = {\n  // This is the most common easing curve.\n  easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n  // Objects enter the screen at full velocity from off-screen and\n  // slowly decelerate to a resting point.\n  easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n  // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n  easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n  // The sharp curve is used by objects that may return to the screen at any time.\n  sharp: 'cubic-bezier(0.4, 0, 0.6, 1)'\n}; // Follow https://material.io/guidelines/motion/duration-easing.html#duration-easing-common-durations\n// to learn when use what timing\n\nvar duration = {\n  shortest: 150,\n  shorter: 200,\n  short: 250,\n  // most basic recommended timing\n  standard: 300,\n  // this is to be used in complex animations\n  complex: 375,\n  // recommended when something is entering screen\n  enteringScreen: 225,\n  // recommended when something is leaving screen\n  leavingScreen: 195\n};\n\nfunction formatMs(milliseconds) {\n  return \"\".concat(Math.round(milliseconds), \"ms\");\n}\n/**\n * @param {string|Array} props\n * @param {object} param\n * @param {string} param.prop\n * @param {number} param.duration\n * @param {string} param.easing\n * @param {number} param.delay\n */\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  easing: easing,\n  duration: duration,\n  create: function create() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['all'];\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var _options$duration = options.duration,\n        durationOption = _options$duration === void 0 ? duration.standard : _options$duration,\n        _options$easing = options.easing,\n        easingOption = _options$easing === void 0 ? easing.easeInOut : _options$easing,\n        _options$delay = options.delay,\n        delay = _options$delay === void 0 ? 0 : _options$delay,\n        other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(options, [\"duration\", \"easing\", \"delay\"]);\n\n    if (true) {\n      var isString = function isString(value) {\n        return typeof value === 'string';\n      };\n\n      var isNumber = function isNumber(value) {\n        return !isNaN(parseFloat(value));\n      };\n\n      if (!isString(props) && !Array.isArray(props)) {\n        console.error('Material-UI: Argument \"props\" must be a string or Array.');\n      }\n\n      if (!isNumber(durationOption) && !isString(durationOption)) {\n        console.error(\"Material-UI: Argument \\\"duration\\\" must be a number or a string but found \".concat(durationOption, \".\"));\n      }\n\n      if (!isString(easingOption)) {\n        console.error('Material-UI: Argument \"easing\" must be a string.');\n      }\n\n      if (!isNumber(delay) && !isString(delay)) {\n        console.error('Material-UI: Argument \"delay\" must be a number or a string.');\n      }\n\n      if (Object.keys(other).length !== 0) {\n        console.error(\"Material-UI: Unrecognized argument(s) [\".concat(Object.keys(other).join(','), \"].\"));\n      }\n    }\n\n    return (Array.isArray(props) ? props : [props]).map(function (animatedProp) {\n      return \"\".concat(animatedProp, \" \").concat(typeof durationOption === 'string' ? durationOption : formatMs(durationOption), \" \").concat(easingOption, \" \").concat(typeof delay === 'string' ? delay : formatMs(delay));\n    }).join(',');\n  },\n  getAutoHeightDuration: function getAutoHeightDuration(height) {\n    if (!height) {\n      return 0;\n    }\n\n    var constant = height / 36; // https://www.wolframalpha.com/input/?i=(4+%2B+15+*+(x+%2F+36+)+**+0.25+%2B+(x+%2F+36)+%2F+5)+*+10\n\n    return Math.round((4 + 15 * Math.pow(constant, 0.25) + constant / 5) * 10);\n  }\n});\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/transitions.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useTheme; });\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _defaultTheme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js\");\n\n\n\nfunction useTheme() {\n  var theme = Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_0__[\"useTheme\"])() || _defaultTheme__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_1___default.a.useDebugValue(theme);\n  }\n\n  return theme;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/useTheme.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js ***!
+  \*****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/styles */ \"./jaas-client/node_modules/@material-ui/styles/esm/index.js\");\n/* harmony import */ var _defaultTheme__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./defaultTheme */ \"./jaas-client/node_modules/@material-ui/core/esm/styles/defaultTheme.js\");\n\n\n\n\nfunction withStyles(stylesOrCreator, options) {\n  return Object(_material_ui_styles__WEBPACK_IMPORTED_MODULE_1__[\"withStyles\"])(stylesOrCreator, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n    defaultTheme: _defaultTheme__WEBPACK_IMPORTED_MODULE_2__[\"default\"]\n  }, options));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (withStyles);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/withStyles.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n// We need to centralize the zIndex definitions as they work\n// like global values in the browser.\nvar zIndex = {\n  mobileStepper: 1000,\n  speedDial: 1050,\n  appBar: 1100,\n  drawer: 1200,\n  modal: 1300,\n  snackbar: 1400,\n  tooltip: 1500\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (zIndex);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/styles/zIndex.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js ***!
+  \*****************************************************************************/
+/*! exports provided: reflow, getTransitionProps */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reflow\", function() { return reflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getTransitionProps\", function() { return getTransitionProps; });\nvar reflow = function reflow(node) {\n  return node.scrollTop;\n};\nfunction getTransitionProps(props, options) {\n  var timeout = props.timeout,\n      _props$style = props.style,\n      style = _props$style === void 0 ? {} : _props$style;\n  return {\n    duration: style.transitionDuration || typeof timeout === 'number' ? timeout : timeout[options.mode] || 0,\n    delay: style.transitionDelay\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/transitions/utils.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return capitalize; });\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n// It should to be noted that this function isn't equivalent to `text-transform: capitalize`.\n//\n// A strict capitalization should uppercase the first letter of each word a the sentence.\n// We only handle the first word.\nfunction capitalize(string) {\n  if (typeof string !== 'string') {\n    throw new Error( true ? \"Material-UI: capitalize(string) expects a string argument.\" : undefined);\n  }\n\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/capitalize.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js":
+/*!***************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js ***!
+  \***************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createChainedFunction; });\n/**\n * Safe chained function\n *\n * Will only create a new function if needed,\n * otherwise will pass back existing functions or null.\n *\n * @param {function} functions to chain\n * @returns {function|null}\n */\nfunction createChainedFunction() {\n  for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n    funcs[_key] = arguments[_key];\n  }\n\n  return funcs.reduce(function (acc, func) {\n    if (func == null) {\n      return acc;\n    }\n\n    if (true) {\n      if (typeof func !== 'function') {\n        console.error('Material-UI: Invalid Argument Type, must only provide functions, undefined, or null.');\n      }\n    }\n\n    return function chainedFunction() {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      acc.apply(this, args);\n      func.apply(this, args);\n    };\n  }, function () {});\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/createChainedFunction.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createSvgIcon; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _SvgIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../SvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js\");\n\n\n\n/**\n * Private module reserved for @material-ui/x packages.\n */\n\nfunction createSvgIcon(path, displayName) {\n  var Component = function Component(props, ref) {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_SvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      ref: ref\n    }, props), path);\n  };\n\n  if (true) {\n    // Need to set `displayName` on the inner component for React.memo.\n    // React prior to 16.14 ignores `displayName` on the wrapper.\n    Component.displayName = \"\".concat(displayName, \"Icon\");\n  }\n\n  Component.muiName = _SvgIcon__WEBPACK_IMPORTED_MODULE_2__[\"default\"].muiName;\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.memo( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.forwardRef(Component));\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/createSvgIcon.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js":
+/*!**************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js ***!
+  \**************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return debounce; });\n// Corresponds to 10 frames at 60 Hz.\n// A few bytes payload overhead when lodash/debounce is ~3 kB and debounce ~300 B.\nfunction debounce(func) {\n  var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 166;\n  var timeout;\n\n  function debounced() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    // eslint-disable-next-line consistent-this\n    var that = this;\n\n    var later = function later() {\n      func.apply(that, args);\n    };\n\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n  }\n\n  debounced.clear = function () {\n    clearTimeout(timeout);\n  };\n\n  return debounced;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/debounce.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getScrollbarSize; });\n// A change of the browser zoom change the scrollbar size.\n// Credit https://github.com/twbs/bootstrap/blob/3ffe3a5d82f6f561b82ff78d82b32a7d14aed558/js/src/modal.js#L512-L519\nfunction getScrollbarSize() {\n  var scrollDiv = document.createElement('div');\n  scrollDiv.style.width = '99px';\n  scrollDiv.style.height = '99px';\n  scrollDiv.style.position = 'absolute';\n  scrollDiv.style.top = '-9999px';\n  scrollDiv.style.overflow = 'scroll';\n  document.body.appendChild(scrollDiv);\n  var scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n  document.body.removeChild(scrollDiv);\n  return scrollbarSize;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/getScrollbarSize.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js ***!
+  \******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return isMuiElement; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nfunction isMuiElement(element, muiNames) {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"](element) && muiNames.indexOf(element.type.muiName) !== -1;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/isMuiElement.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ownerDocument; });\nfunction ownerDocument(node) {\n  return node && node.ownerDocument || document;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js ***!
+  \*****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ownerWindow; });\n/* harmony import */ var _ownerDocument__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ownerDocument */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/ownerDocument.js\");\n\nfunction ownerWindow(node) {\n  var doc = Object(_ownerDocument__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(node);\n  return doc.defaultView || window;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/ownerWindow.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js":
+/*!************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js ***!
+  \************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return requirePropFactory; });\nfunction requirePropFactory(componentNameInError) {\n  if (false) {}\n\n  var requireProp = function requireProp(requiredProp) {\n    return function (props, propName, componentName, location, propFullName) {\n      var propFullNameSafe = propFullName || propName;\n\n      if (typeof props[propName] !== 'undefined' && !props[requiredProp]) {\n        return new Error(\"The prop `\".concat(propFullNameSafe, \"` of \") + \"`\".concat(componentNameInError, \"` must be used on `\").concat(requiredProp, \"`.\"));\n      }\n\n      return null;\n    };\n  };\n\n  return requireProp;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/requirePropFactory.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return setRef; });\n// TODO v5: consider to make it private\nfunction setRef(ref, value) {\n  if (typeof ref === 'function') {\n    ref(value);\n  } else if (ref) {\n    ref.current = value;\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useControlled; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* eslint-disable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */\n\nfunction useControlled(_ref) {\n  var controlled = _ref.controlled,\n      defaultProp = _ref.default,\n      name = _ref.name,\n      _ref$state = _ref.state,\n      state = _ref$state === void 0 ? 'value' : _ref$state;\n\n  var _React$useRef = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](controlled !== undefined),\n      isControlled = _React$useRef.current;\n\n  var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"](defaultProp),\n      valueState = _React$useState[0],\n      setValue = _React$useState[1];\n\n  var value = isControlled ? controlled : valueState;\n\n  if (true) {\n    react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n      if (isControlled !== (controlled !== undefined)) {\n        console.error([\"Material-UI: A component is changing the \".concat(isControlled ? '' : 'un', \"controlled \").concat(state, \" state of \").concat(name, \" to be \").concat(isControlled ? 'un' : '', \"controlled.\"), 'Elements should not switch from uncontrolled to controlled (or vice versa).', \"Decide between using a controlled or uncontrolled \".concat(name, \" \") + 'element for the lifetime of the component.', \"The nature of the state is determined during the first render, it's considered controlled if the value is not `undefined`.\", 'More info: https://fb.me/react-controlled-components'].join('\\n'));\n      }\n    }, [controlled]);\n\n    var _React$useRef2 = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](defaultProp),\n        defaultValue = _React$useRef2.current;\n\n    react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"](function () {\n      if (!isControlled && defaultValue !== defaultProp) {\n        console.error([\"Material-UI: A component is changing the default \".concat(state, \" state of an uncontrolled \").concat(name, \" after being initialized. \") + \"To suppress this warning opt to use a controlled \".concat(name, \".\")].join('\\n'));\n      }\n    }, [JSON.stringify(defaultProp)]);\n  }\n\n  var setValueIfUncontrolled = react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function (newValue) {\n    if (!isControlled) {\n      setValue(newValue);\n    }\n  }, []);\n  return [value, setValueIfUncontrolled];\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useControlled.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useEventCallback; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nvar useEnhancedEffect = typeof window !== 'undefined' ? react__WEBPACK_IMPORTED_MODULE_0__[\"useLayoutEffect\"] : react__WEBPACK_IMPORTED_MODULE_0__[\"useEffect\"];\n/**\n * https://github.com/facebook/react/issues/14099#issuecomment-440013892\n *\n * @param {function} fn\n */\n\nfunction useEventCallback(fn) {\n  var ref = react__WEBPACK_IMPORTED_MODULE_0__[\"useRef\"](fn);\n  useEnhancedEffect(function () {\n    ref.current = fn;\n  });\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function () {\n    return (0, ref.current).apply(void 0, arguments);\n  }, []);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useEventCallback.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useForkRef; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _setRef__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./setRef */ \"./jaas-client/node_modules/@material-ui/core/esm/utils/setRef.js\");\n\n\nfunction useForkRef(refA, refB) {\n  /**\n   * This will create a new function if the ref props change and are defined.\n   * This means react will call the old forkRef with `null` and the new forkRef\n   * with the ref. Cleanup naturally emerges from this behavior\n   */\n  return react__WEBPACK_IMPORTED_MODULE_0__[\"useMemo\"](function () {\n    if (refA == null && refB == null) {\n      return null;\n    }\n\n    return function (refValue) {\n      Object(_setRef__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(refA, refValue);\n      Object(_setRef__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(refB, refValue);\n    };\n  }, [refA, refB]);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useForkRef.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js ***!
+  \***********************************************************************************/
+/*! exports provided: teardown, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"teardown\", function() { return teardown; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useIsFocusVisible; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n// based on https://github.com/WICG/focus-visible/blob/v4.1.5/src/focus-visible.js\n\n\nvar hadKeyboardEvent = true;\nvar hadFocusVisibleRecently = false;\nvar hadFocusVisibleRecentlyTimeout = null;\nvar inputTypesWhitelist = {\n  text: true,\n  search: true,\n  url: true,\n  tel: true,\n  email: true,\n  password: true,\n  number: true,\n  date: true,\n  month: true,\n  week: true,\n  time: true,\n  datetime: true,\n  'datetime-local': true\n};\n/**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} node\n * @return {boolean}\n */\n\nfunction focusTriggersKeyboardModality(node) {\n  var type = node.type,\n      tagName = node.tagName;\n\n  if (tagName === 'INPUT' && inputTypesWhitelist[type] && !node.readOnly) {\n    return true;\n  }\n\n  if (tagName === 'TEXTAREA' && !node.readOnly) {\n    return true;\n  }\n\n  if (node.isContentEditable) {\n    return true;\n  }\n\n  return false;\n}\n/**\n * Keep track of our keyboard modality state with `hadKeyboardEvent`.\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * @param {KeyboardEvent} event\n */\n\n\nfunction handleKeyDown(event) {\n  if (event.metaKey || event.altKey || event.ctrlKey) {\n    return;\n  }\n\n  hadKeyboardEvent = true;\n}\n/**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n */\n\n\nfunction handlePointerDown() {\n  hadKeyboardEvent = false;\n}\n\nfunction handleVisibilityChange() {\n  if (this.visibilityState === 'hidden') {\n    // If the tab becomes active again, the browser will handle calling focus\n    // on the element (Safari actually calls it twice).\n    // If this tab change caused a blur on an element with focus-visible,\n    // re-apply the class when the user switches back to the tab.\n    if (hadFocusVisibleRecently) {\n      hadKeyboardEvent = true;\n    }\n  }\n}\n\nfunction prepare(doc) {\n  doc.addEventListener('keydown', handleKeyDown, true);\n  doc.addEventListener('mousedown', handlePointerDown, true);\n  doc.addEventListener('pointerdown', handlePointerDown, true);\n  doc.addEventListener('touchstart', handlePointerDown, true);\n  doc.addEventListener('visibilitychange', handleVisibilityChange, true);\n}\n\nfunction teardown(doc) {\n  doc.removeEventListener('keydown', handleKeyDown, true);\n  doc.removeEventListener('mousedown', handlePointerDown, true);\n  doc.removeEventListener('pointerdown', handlePointerDown, true);\n  doc.removeEventListener('touchstart', handlePointerDown, true);\n  doc.removeEventListener('visibilitychange', handleVisibilityChange, true);\n}\n\nfunction isFocusVisible(event) {\n  var target = event.target;\n\n  try {\n    return target.matches(':focus-visible');\n  } catch (error) {} // browsers not implementing :focus-visible will throw a SyntaxError\n  // we use our own heuristic for those browsers\n  // rethrow might be better if it's not the expected error but do we really\n  // want to crash if focus-visible malfunctioned?\n  // no need for validFocusTarget check. the user does that by attaching it to\n  // focusable events only\n\n\n  return hadKeyboardEvent || focusTriggersKeyboardModality(target);\n}\n/**\n * Should be called if a blur event is fired on a focus-visible element\n */\n\n\nfunction handleBlurVisible() {\n  // To detect a tab/window switch, we look for a blur event followed\n  // rapidly by a visibility change.\n  // If we don't see a visibility change within 100ms, it's probably a\n  // regular focus change.\n  hadFocusVisibleRecently = true;\n  window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n  hadFocusVisibleRecentlyTimeout = window.setTimeout(function () {\n    hadFocusVisibleRecently = false;\n  }, 100);\n}\n\nfunction useIsFocusVisible() {\n  var ref = react__WEBPACK_IMPORTED_MODULE_0__[\"useCallback\"](function (instance) {\n    var node = react_dom__WEBPACK_IMPORTED_MODULE_1__[\"findDOMNode\"](instance);\n\n    if (node != null) {\n      prepare(node.ownerDocument);\n    }\n  }, []);\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_0__[\"useDebugValue\"](isFocusVisible);\n  }\n\n  return {\n    isFocusVisible: isFocusVisible,\n    onBlurVisible: handleBlurVisible,\n    ref: ref\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/icons/LockOutlined.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/icons/LockOutlined.js ***!
+  \*********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ \"./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(__webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\"));\n\nvar _createSvgIcon = _interopRequireDefault(__webpack_require__(/*! ./utils/createSvgIcon */ \"./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js\"));\n\nvar _default = (0, _createSvgIcon.default)(_react.default.createElement(\"path\", {\n  d: \"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm9 14H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"\n}), 'LockOutlined');\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/icons/LockOutlined.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js ***!
+  \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ \"./jaas-client/node_modules/@babel/runtime/helpers/interopRequireDefault.js\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = createSvgIcon;\n\nvar _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/extends.js\"));\n\nvar _react = _interopRequireDefault(__webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\"));\n\nvar _SvgIcon = _interopRequireDefault(__webpack_require__(/*! @material-ui/core/SvgIcon */ \"./jaas-client/node_modules/@material-ui/core/esm/SvgIcon/index.js\"));\n\nfunction createSvgIcon(path, displayName) {\n  var Component = _react.default.memo(_react.default.forwardRef(function (props, ref) {\n    return _react.default.createElement(_SvgIcon.default, (0, _extends2.default)({\n      ref: ref\n    }, props), path);\n  }));\n\n  if (true) {\n    Component.displayName = \"\".concat(displayName, \"Icon\");\n  }\n\n  Component.muiName = _SvgIcon.default.muiName;\n  return Component;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/icons/utils/createSvgIcon.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js":
+/*!*************************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js ***!
+  \*************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ServerStyleSheets; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/classCallCheck */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n/* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js\");\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js\");\n\n\n\n\n\n\n\n\nvar ServerStyleSheets = /*#__PURE__*/function () {\n  function ServerStyleSheets() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    Object(_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(this, ServerStyleSheets);\n\n    this.options = options;\n  }\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(ServerStyleSheets, [{\n    key: \"collect\",\n    value: function collect(children) {\n      // This is needed in order to deduplicate the injection of CSS in the page.\n      var sheetsManager = new Map(); // This is needed in order to inject the critical CSS.\n\n      this.sheetsRegistry = new jss__WEBPACK_IMPORTED_MODULE_4__[\"SheetsRegistry\"](); // A new class name generator\n\n      var generateClassName = Object(_createGenerateClassName__WEBPACK_IMPORTED_MODULE_6__[\"default\"])();\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_StylesProvider__WEBPACK_IMPORTED_MODULE_5__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        sheetsManager: sheetsManager,\n        serverGenerateClassName: generateClassName,\n        sheetsRegistry: this.sheetsRegistry\n      }, this.options), children);\n    }\n  }, {\n    key: \"toString\",\n    value: function toString() {\n      return this.sheetsRegistry ? this.sheetsRegistry.toString() : '';\n    }\n  }, {\n    key: \"getStyleElement\",\n    value: function getStyleElement(props) {\n      return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement('style', Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        id: 'jss-server-side',\n        key: 'jss-server-side',\n        dangerouslySetInnerHTML: {\n          __html: this.toString()\n        }\n      }, props));\n    }\n  }]);\n\n  return ServerStyleSheets;\n}();\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js":
+/*!*************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js ***!
+  \*************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ServerStyleSheets */ \"./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/ServerStyleSheets.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js":
+/*!*******************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js ***!
+  \*******************************************************************************************/
+/*! exports provided: sheetsManager, StylesContext, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sheetsManager\", function() { return sheetsManager; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"StylesContext\", function() { return StylesContext; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return StylesProvider; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n/* harmony import */ var _jssPreset__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../jssPreset */ \"./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js\");\n\n\n\n\n\n\n\n // Default JSS instance.\n\nvar jss = Object(jss__WEBPACK_IMPORTED_MODULE_6__[\"create\"])(Object(_jssPreset__WEBPACK_IMPORTED_MODULE_7__[\"default\"])()); // Use a singleton or the provided one by the context.\n//\n// The counter-based approach doesn't tolerate any mistake.\n// It's much safer to use the same counter everywhere.\n\nvar generateClassName = Object(_createGenerateClassName__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(); // Exported for test purposes\n\nvar sheetsManager = new Map();\nvar defaultOptions = {\n  disableGeneration: false,\n  generateClassName: generateClassName,\n  jss: jss,\n  sheetsCache: null,\n  sheetsManager: sheetsManager,\n  sheetsRegistry: null\n};\nvar StylesContext = react__WEBPACK_IMPORTED_MODULE_2___default.a.createContext(defaultOptions);\n\nif (true) {\n  StylesContext.displayName = 'StylesContext';\n}\n\nvar injectFirstNode;\nfunction StylesProvider(props) {\n  var children = props.children,\n      _props$injectFirst = props.injectFirst,\n      injectFirst = _props$injectFirst === void 0 ? false : _props$injectFirst,\n      _props$disableGenerat = props.disableGeneration,\n      disableGeneration = _props$disableGenerat === void 0 ? false : _props$disableGenerat,\n      localOptions = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"injectFirst\", \"disableGeneration\"]);\n\n  var outerOptions = react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(StylesContext);\n\n  var context = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, outerOptions), {}, {\n    disableGeneration: disableGeneration\n  }, localOptions);\n\n  if (true) {\n    if (typeof window === 'undefined' && !context.sheetsManager) {\n      console.error('Material-UI: You need to use the ServerStyleSheets API when rendering on the server.');\n    }\n  }\n\n  if (true) {\n    if (context.jss.options.insertionPoint && injectFirst) {\n      console.error('Material-UI: You cannot use a custom insertionPoint and <StylesContext injectFirst> at the same time.');\n    }\n  }\n\n  if (true) {\n    if (injectFirst && localOptions.jss) {\n      console.error('Material-UI: You cannot use the jss and injectFirst props at the same time.');\n    }\n  }\n\n  if (!context.jss.options.insertionPoint && injectFirst && typeof window !== 'undefined') {\n    if (!injectFirstNode) {\n      var head = document.head;\n      injectFirstNode = document.createComment('mui-inject-first');\n      head.insertBefore(injectFirstNode, head.firstChild);\n    }\n\n    context.jss = Object(jss__WEBPACK_IMPORTED_MODULE_6__[\"create\"])({\n      plugins: Object(_jssPreset__WEBPACK_IMPORTED_MODULE_7__[\"default\"])().plugins,\n      insertionPoint: injectFirstNode\n    });\n  }\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(StylesContext.Provider, {\n    value: context\n  }, children);\n}\n true ? StylesProvider.propTypes = {\n  /**\n   * Your component tree.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node.isRequired,\n\n  /**\n   * You can disable the generation of the styles with this option.\n   * It can be useful when traversing the React tree outside of the HTML\n   * rendering step on the server.\n   * Let's say you are using react-apollo to extract all\n   * the queries made by the interface server-side - you can significantly speed up the traversal with this prop.\n   */\n  disableGeneration: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * JSS's class name generator.\n   */\n  generateClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * By default, the styles are injected last in the <head> element of the page.\n   * As a result, they gain more specificity than any other style sheet.\n   * If you want to override Material-UI's styles, set this prop.\n   */\n  injectFirst: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool,\n\n  /**\n   * JSS's instance.\n   */\n  jss: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   */\n  serverGenerateClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * @ignore\n   *\n   * Beta feature.\n   *\n   * Cache for the sheets.\n   */\n  sheetsCache: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   *\n   * The sheetsManager is used to deduplicate style sheet injection in the page.\n   * It's deduplicating using the (theme, styles) couple.\n   * On the server, you should provide a new instance for each request.\n   */\n  sheetsManager: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n  /**\n   * @ignore\n   *\n   * Collect the sheets.\n   */\n  sheetsRegistry: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n} : undefined;\n\nif (true) {\n   true ? StylesProvider.propTypes = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_4__[\"exactProp\"])(StylesProvider.propTypes) : undefined;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js ***!
+  \**********************************************************************************/
+/*! exports provided: default, sheetsManager, StylesContext */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/StylesProvider.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sheetsManager\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_0__[\"sheetsManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesContext\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_0__[\"StylesContext\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js":
+/*!*****************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js ***!
+  \*****************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _useTheme_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../useTheme/ThemeContext */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n/* harmony import */ var _nested__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./nested */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js\");\n\n\n\n\n\n\n // To support composition of theme.\n\nfunction mergeOuterLocalTheme(outerTheme, localTheme) {\n  if (typeof localTheme === 'function') {\n    var mergedTheme = localTheme(outerTheme);\n\n    if (true) {\n      if (!mergedTheme) {\n        console.error(['Material-UI: You should return an object from your theme function, i.e.', '<ThemeProvider theme={() => ({})} />'].join('\\n'));\n      }\n    }\n\n    return mergedTheme;\n  }\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, outerTheme), localTheme);\n}\n/**\n * This component takes a `theme` prop.\n * It makes the `theme` available down the React tree thanks to React context.\n * This component should preferably be used at **the root of your component tree**.\n */\n\n\nfunction ThemeProvider(props) {\n  var children = props.children,\n      localTheme = props.theme;\n  var outerTheme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n\n  if (true) {\n    if (outerTheme === null && typeof localTheme === 'function') {\n      console.error(['Material-UI: You are providing a theme function prop to the ThemeProvider component:', '<ThemeProvider theme={outerTheme => outerTheme} />', '', 'However, no outer theme is present.', 'Make sure a theme is already injected higher in the React tree ' + 'or provide a theme object.'].join('\\n'));\n    }\n  }\n\n  var theme = react__WEBPACK_IMPORTED_MODULE_1___default.a.useMemo(function () {\n    var output = outerTheme === null ? localTheme : mergeOuterLocalTheme(outerTheme, localTheme);\n\n    if (output != null) {\n      output[_nested__WEBPACK_IMPORTED_MODULE_6__[\"default\"]] = outerTheme !== null;\n    }\n\n    return output;\n  }, [localTheme, outerTheme]);\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_useTheme_ThemeContext__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Provider, {\n    value: theme\n  }, children);\n}\n\n true ? ThemeProvider.propTypes = {\n  /**\n   * Your component tree.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node.isRequired,\n\n  /**\n   * A theme object. You can provide a function to extend the outer theme.\n   */\n  theme: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func]).isRequired\n} : undefined;\n\nif (true) {\n   true ? ThemeProvider.propTypes = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_3__[\"exactProp\"])(ThemeProvider.propTypes) : undefined;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ThemeProvider);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js ***!
+  \*********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _ThemeProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ThemeProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _ThemeProvider__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\n/* harmony default export */ __webpack_exports__[\"default\"] = (hasSymbol ? Symbol.for('mui.nested') : '__THEME_NESTED__');\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js":
+/*!*************************************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js ***!
+  \*************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createGenerateClassName; });\n/* harmony import */ var _ThemeProvider_nested__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ThemeProvider/nested */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/nested.js\");\n\n/**\n * This is the list of the style rule name we use as drop in replacement for the built-in\n * pseudo classes (:checked, :disabled, :focused, etc.).\n *\n * Why do they exist in the first place?\n * These classes are used at a specificity of 2.\n * It allows them to override previously definied styles as well as\n * being untouched by simple user overrides.\n */\n\nvar pseudoClasses = ['checked', 'disabled', 'error', 'focused', 'focusVisible', 'required', 'expanded', 'selected']; // Returns a function which generates unique class names based on counters.\n// When new generator function is created, rule counter is reset.\n// We need to reset the rule counter for SSR for each request.\n//\n// It's inspired by\n// https://github.com/cssinjs/jss/blob/4e6a05dd3f7b6572fdd3ab216861d9e446c20331/src/utils/createGenerateClassName.js\n\nfunction createGenerateClassName() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var _options$disableGloba = options.disableGlobal,\n      disableGlobal = _options$disableGloba === void 0 ? false : _options$disableGloba,\n      _options$productionPr = options.productionPrefix,\n      productionPrefix = _options$productionPr === void 0 ? 'jss' : _options$productionPr,\n      _options$seed = options.seed,\n      seed = _options$seed === void 0 ? '' : _options$seed;\n  var seedPrefix = seed === '' ? '' : \"\".concat(seed, \"-\");\n  var ruleCounter = 0;\n\n  var getNextCounterId = function getNextCounterId() {\n    ruleCounter += 1;\n\n    if (true) {\n      if (ruleCounter >= 1e10) {\n        console.warn(['Material-UI: You might have a memory leak.', 'The ruleCounter is not supposed to grow that much.'].join(''));\n      }\n    }\n\n    return ruleCounter;\n  };\n\n  return function (rule, styleSheet) {\n    var name = styleSheet.options.name; // Is a global static MUI style?\n\n    if (name && name.indexOf('Mui') === 0 && !styleSheet.options.link && !disableGlobal) {\n      // We can use a shorthand class name, we never use the keys to style the components.\n      if (pseudoClasses.indexOf(rule.key) !== -1) {\n        return \"Mui-\".concat(rule.key);\n      }\n\n      var prefix = \"\".concat(seedPrefix).concat(name, \"-\").concat(rule.key);\n\n      if (!styleSheet.options.theme[_ThemeProvider_nested__WEBPACK_IMPORTED_MODULE_0__[\"default\"]] || seed !== '') {\n        return prefix;\n      }\n\n      return \"\".concat(prefix, \"-\").concat(getNextCounterId());\n    }\n\n    if (false) {}\n\n    var suffix = \"\".concat(rule.key, \"-\").concat(getNextCounterId()); // Help with debuggability.\n\n    if (styleSheet.options.classNamePrefix) {\n      return \"\".concat(seedPrefix).concat(styleSheet.options.classNamePrefix, \"-\").concat(suffix);\n    }\n\n    return \"\".concat(seedPrefix).concat(suffix);\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js":
+/*!*******************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js ***!
+  \*******************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/createGenerateClassName.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _createGenerateClassName__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js":
+/*!***************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js ***!
+  \***************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return createStyles; });\nfunction createStyles(styles) {\n  return styles;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js ***!
+  \********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _createStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/createStyles/createStyles.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _createStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js":
+/*!***********************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js ***!
+  \***********************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getStylesCreator; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _noopTheme__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./noopTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js\");\n\n\n\n\nfunction getStylesCreator(stylesOrCreator) {\n  var themingEnabled = typeof stylesOrCreator === 'function';\n\n  if (true) {\n    if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(stylesOrCreator) !== 'object' && !themingEnabled) {\n      console.error(['Material-UI: The `styles` argument provided is invalid.', 'You need to provide a function generating the styles or a styles object.'].join('\\n'));\n    }\n  }\n\n  return {\n    create: function create(theme, name) {\n      var styles;\n\n      try {\n        styles = themingEnabled ? stylesOrCreator(theme) : stylesOrCreator;\n      } catch (err) {\n        if (true) {\n          if (themingEnabled === true && theme === _noopTheme__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n            // TODO: prepend error message/name instead\n            console.error(['Material-UI: The `styles` argument provided is invalid.', 'You are providing a function without a theme in the context.', 'One of the parent elements needs to use a ThemeProvider.'].join('\\n'));\n          }\n        }\n\n        throw err;\n      }\n\n      if (!name || !theme.overrides || !theme.overrides[name]) {\n        return styles;\n      }\n\n      var overrides = theme.overrides[name];\n\n      var stylesWithOverrides = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, styles);\n\n      Object.keys(overrides).forEach(function (key) {\n        if (true) {\n          if (!stylesWithOverrides[key]) {\n            console.warn(['Material-UI: You are trying to override a style that does not exist.', \"Fix the `\".concat(key, \"` key of `theme.overrides.\").concat(name, \"`.\")].join('\\n'));\n          }\n        }\n\n        stylesWithOverrides[key] = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_2__[\"deepmerge\"])(stylesWithOverrides[key], overrides[key]);\n      });\n      return stylesWithOverrides;\n    },\n    options: {}\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js":
+/*!************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js ***!
+  \************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _getStylesCreator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getStylesCreator */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/getStylesCreator.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _getStylesCreator__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js":
+/*!****************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js ***!
+  \****************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n// We use the same empty object to ref count the styles that don't need a theme object.\nvar noopTheme = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = (noopTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js":
+/*!*****************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js ***!
+  \*****************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getThemeProps; });\n/* eslint-disable no-restricted-syntax */\nfunction getThemeProps(params) {\n  var theme = params.theme,\n      name = params.name,\n      props = params.props;\n\n  if (!theme || !theme.props || !theme.props[name]) {\n    return props;\n  } // Resolve default props, code borrow from React source.\n  // https://github.com/facebook/react/blob/15a8f031838a553e41c0b66eb1bcf1da8448104d/packages/react/src/ReactElement.js#L221\n\n\n  var defaultProps = theme.props[name];\n  var propName;\n\n  for (propName in defaultProps) {\n    if (props[propName] === undefined) {\n      props[propName] = defaultProps[propName];\n    }\n  }\n\n  return props;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js ***!
+  \*********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _getThemeProps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getThemeProps */ \"./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/getThemeProps.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _getThemeProps__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/index.js":
+/*!*******************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/index.js ***!
+  \*******************************************************************/
+/*! exports provided: createGenerateClassName, createStyles, getThemeProps, jssPreset, makeStyles, mergeClasses, ServerStyleSheets, styled, StylesProvider, sheetsManager, StylesContext, ThemeProvider, useTheme, withStyles, withTheme, withThemeCreator */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _createGenerateClassName__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./createGenerateClassName */ \"./jaas-client/node_modules/@material-ui/styles/esm/createGenerateClassName/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createGenerateClassName\", function() { return _createGenerateClassName__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _createStyles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/createStyles/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createStyles\", function() { return _createStyles__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _getThemeProps__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getThemeProps */ \"./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"getThemeProps\", function() { return _getThemeProps__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _jssPreset__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jssPreset */ \"./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"jssPreset\", function() { return _jssPreset__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"makeStyles\", function() { return _makeStyles__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _mergeClasses__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./mergeClasses */ \"./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"mergeClasses\", function() { return _mergeClasses__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ServerStyleSheets */ \"./jaas-client/node_modules/@material-ui/styles/esm/ServerStyleSheets/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ServerStyleSheets\", function() { return _ServerStyleSheets__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _styled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./styled */ \"./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"styled\", function() { return _styled__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesProvider\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sheetsManager\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_9__[\"sheetsManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesContext\", function() { return _StylesProvider__WEBPACK_IMPORTED_MODULE_9__[\"StylesContext\"]; });\n\n/* harmony import */ var _ThemeProvider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ThemeProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/ThemeProvider/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ThemeProvider\", function() { return _ThemeProvider__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useTheme\", function() { return _useTheme__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _withStyles__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./withStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withStyles\", function() { return _withStyles__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _withTheme__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./withTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withTheme\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withThemeCreator\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_13__[\"withThemeCreator\"]; });\n\n/** @license Material-UI v4.10.0\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/* eslint-disable import/export */\n\n/* Warning if there are several instances of @material-ui/styles */\n\nif ( true && typeof window !== 'undefined') {\n  _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] = _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] || 0;\n\n  if (_material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] === 1) {\n    console.warn(['It looks like there are several instances of `@material-ui/styles` initialized in this application.', 'This may cause theme propagation issues, broken class names, ' + 'specificity issues, and makes your application bigger without a good reason.', '', 'See https://material-ui.com/r/styles-instance-warning for more info.'].join('\\n'));\n  }\n\n  _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"ponyfillGlobal\"]['__@material-ui/styles-init__'] += 1;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js ***!
+  \*****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _jssPreset__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jssPreset */ \"./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _jssPreset__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js ***!
+  \*********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return jssPreset; });\n/* harmony import */ var jss_plugin_rule_value_function__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jss-plugin-rule-value-function */ \"./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js\");\n/* harmony import */ var jss_plugin_global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss-plugin-global */ \"./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js\");\n/* harmony import */ var jss_plugin_nested__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jss-plugin-nested */ \"./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js\");\n/* harmony import */ var jss_plugin_camel_case__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jss-plugin-camel-case */ \"./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js\");\n/* harmony import */ var jss_plugin_default_unit__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! jss-plugin-default-unit */ \"./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js\");\n/* harmony import */ var jss_plugin_vendor_prefixer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jss-plugin-vendor-prefixer */ \"./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js\");\n/* harmony import */ var jss_plugin_props_sort__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! jss-plugin-props-sort */ \"./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js\");\n\n\n\n\n\n\n // Subset of jss-preset-default with only the plugins the Material-UI components are using.\n\nfunction jssPreset() {\n  return {\n    plugins: [Object(jss_plugin_rule_value_function__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(), Object(jss_plugin_global__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(), Object(jss_plugin_nested__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(), Object(jss_plugin_camel_case__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(), Object(jss_plugin_default_unit__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(), // Disable the vendor prefixer server-side, it does nothing.\n    // This way, we can get a performance boost.\n    // In the documentation, we are using `autoprefixer` to solve this problem.\n    typeof window === 'undefined' ? null : Object(jss_plugin_vendor_prefixer__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(), Object(jss_plugin_props_sort__WEBPACK_IMPORTED_MODULE_6__[\"default\"])()]\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/jssPreset/jssPreset.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js ***!
+  \******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _makeStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js":
+/*!*************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js ***!
+  \*************************************************************************************/
+/*! exports provided: increment */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"increment\", function() { return increment; });\n/* eslint-disable import/prefer-default-export */\n// Global index counter to preserve source order.\n// We create the style sheet during the creation of the component,\n// children are handled after the parents, so the order of style elements would be parent->child.\n// It is a problem though when a parent passes a className\n// which needs to override any child's styles.\n// StyleSheet of the child has a higher specificity, because of the source order.\n// So our solution is to render sheets them in the reverse order child->sheet, so\n// that parent has a higher specificity.\nvar indexCounter = -1e9;\nfunction increment() {\n  indexCounter += 1;\n\n  if (true) {\n    if (indexCounter >= 0) {\n      console.warn(['Material-UI: You might have a memory leak.', 'The indexCounter is not supposed to grow that much.'].join('\\n'));\n    }\n  }\n\n  return indexCounter;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js ***!
+  \***********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return makeStyles; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n/* harmony import */ var _mergeClasses__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../mergeClasses */ \"./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js\");\n/* harmony import */ var _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./multiKeyStore */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n/* harmony import */ var _StylesProvider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../StylesProvider */ \"./jaas-client/node_modules/@material-ui/styles/esm/StylesProvider/index.js\");\n/* harmony import */ var _indexCounter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./indexCounter */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/indexCounter.js\");\n/* harmony import */ var _getStylesCreator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../getStylesCreator */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/index.js\");\n/* harmony import */ var _getStylesCreator_noopTheme__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../getStylesCreator/noopTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/getStylesCreator/noopTheme.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nfunction getClasses(_ref, classes, Component) {\n  var state = _ref.state,\n      stylesOptions = _ref.stylesOptions;\n\n  if (stylesOptions.disableGeneration) {\n    return classes || {};\n  }\n\n  if (!state.cacheClasses) {\n    state.cacheClasses = {\n      // Cache for the finalized classes value.\n      value: null,\n      // Cache for the last used classes prop pointer.\n      lastProp: null,\n      // Cache for the last used rendered classes pointer.\n      lastJSS: {}\n    };\n  } // Tracks if either the rendered classes or classes prop has changed,\n  // requiring the generation of a new finalized classes object.\n\n\n  var generate = false;\n\n  if (state.classes !== state.cacheClasses.lastJSS) {\n    state.cacheClasses.lastJSS = state.classes;\n    generate = true;\n  }\n\n  if (classes !== state.cacheClasses.lastProp) {\n    state.cacheClasses.lastProp = classes;\n    generate = true;\n  }\n\n  if (generate) {\n    state.cacheClasses.value = Object(_mergeClasses__WEBPACK_IMPORTED_MODULE_4__[\"default\"])({\n      baseClasses: state.cacheClasses.lastJSS,\n      newClasses: classes,\n      Component: Component\n    });\n  }\n\n  return state.cacheClasses.value;\n}\n\nfunction attach(_ref2, props) {\n  var state = _ref2.state,\n      theme = _ref2.theme,\n      stylesOptions = _ref2.stylesOptions,\n      stylesCreator = _ref2.stylesCreator,\n      name = _ref2.name;\n\n  if (stylesOptions.disableGeneration) {\n    return;\n  }\n\n  var sheetManager = _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].get(stylesOptions.sheetsManager, stylesCreator, theme);\n\n  if (!sheetManager) {\n    sheetManager = {\n      refs: 0,\n      staticSheet: null,\n      dynamicStyles: null\n    };\n    _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].set(stylesOptions.sheetsManager, stylesCreator, theme, sheetManager);\n  }\n\n  var options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, stylesCreator.options), stylesOptions), {}, {\n    theme: theme,\n    flip: typeof stylesOptions.flip === 'boolean' ? stylesOptions.flip : theme.direction === 'rtl'\n  });\n\n  options.generateId = options.serverGenerateClassName || options.generateClassName;\n  var sheetsRegistry = stylesOptions.sheetsRegistry;\n\n  if (sheetManager.refs === 0) {\n    var staticSheet;\n\n    if (stylesOptions.sheetsCache) {\n      staticSheet = _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].get(stylesOptions.sheetsCache, stylesCreator, theme);\n    }\n\n    var styles = stylesCreator.create(theme, name);\n\n    if (!staticSheet) {\n      staticSheet = stylesOptions.jss.createStyleSheet(styles, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        link: false\n      }, options));\n      staticSheet.attach();\n\n      if (stylesOptions.sheetsCache) {\n        _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].set(stylesOptions.sheetsCache, stylesCreator, theme, staticSheet);\n      }\n    }\n\n    if (sheetsRegistry) {\n      sheetsRegistry.add(staticSheet);\n    }\n\n    sheetManager.staticSheet = staticSheet;\n    sheetManager.dynamicStyles = Object(jss__WEBPACK_IMPORTED_MODULE_3__[\"getDynamicStyles\"])(styles);\n  }\n\n  if (sheetManager.dynamicStyles) {\n    var dynamicSheet = stylesOptions.jss.createStyleSheet(sheetManager.dynamicStyles, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n      link: true\n    }, options));\n    dynamicSheet.update(props);\n    dynamicSheet.attach();\n    state.dynamicSheet = dynamicSheet;\n    state.classes = Object(_mergeClasses__WEBPACK_IMPORTED_MODULE_4__[\"default\"])({\n      baseClasses: sheetManager.staticSheet.classes,\n      newClasses: dynamicSheet.classes\n    });\n\n    if (sheetsRegistry) {\n      sheetsRegistry.add(dynamicSheet);\n    }\n  } else {\n    state.classes = sheetManager.staticSheet.classes;\n  }\n\n  sheetManager.refs += 1;\n}\n\nfunction update(_ref3, props) {\n  var state = _ref3.state;\n\n  if (state.dynamicSheet) {\n    state.dynamicSheet.update(props);\n  }\n}\n\nfunction detach(_ref4) {\n  var state = _ref4.state,\n      theme = _ref4.theme,\n      stylesOptions = _ref4.stylesOptions,\n      stylesCreator = _ref4.stylesCreator;\n\n  if (stylesOptions.disableGeneration) {\n    return;\n  }\n\n  var sheetManager = _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].get(stylesOptions.sheetsManager, stylesCreator, theme);\n  sheetManager.refs -= 1;\n  var sheetsRegistry = stylesOptions.sheetsRegistry;\n\n  if (sheetManager.refs === 0) {\n    _multiKeyStore__WEBPACK_IMPORTED_MODULE_5__[\"default\"].delete(stylesOptions.sheetsManager, stylesCreator, theme);\n    stylesOptions.jss.removeStyleSheet(sheetManager.staticSheet);\n\n    if (sheetsRegistry) {\n      sheetsRegistry.remove(sheetManager.staticSheet);\n    }\n  }\n\n  if (state.dynamicSheet) {\n    stylesOptions.jss.removeStyleSheet(state.dynamicSheet);\n\n    if (sheetsRegistry) {\n      sheetsRegistry.remove(state.dynamicSheet);\n    }\n  }\n}\n\nfunction useSynchronousEffect(func, values) {\n  var key = react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef([]);\n  var output; // Store \"generation\" key. Just returns a new object every time\n\n  var currentKey = react__WEBPACK_IMPORTED_MODULE_2___default.a.useMemo(function () {\n    return {};\n  }, values); // eslint-disable-line react-hooks/exhaustive-deps\n  // \"the first render\", or \"memo dropped the value\"\n\n  if (key.current !== currentKey) {\n    key.current = currentKey;\n    output = func();\n  }\n\n  react__WEBPACK_IMPORTED_MODULE_2___default.a.useEffect(function () {\n    return function () {\n      if (output) {\n        output();\n      }\n    };\n  }, [currentKey] // eslint-disable-line react-hooks/exhaustive-deps\n  );\n}\n\nfunction makeStyles(stylesOrCreator) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  var name = options.name,\n      classNamePrefixOption = options.classNamePrefix,\n      Component = options.Component,\n      _options$defaultTheme = options.defaultTheme,\n      defaultTheme = _options$defaultTheme === void 0 ? _getStylesCreator_noopTheme__WEBPACK_IMPORTED_MODULE_10__[\"default\"] : _options$defaultTheme,\n      stylesOptions2 = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(options, [\"name\", \"classNamePrefix\", \"Component\", \"defaultTheme\"]);\n\n  var stylesCreator = Object(_getStylesCreator__WEBPACK_IMPORTED_MODULE_9__[\"default\"])(stylesOrCreator);\n  var classNamePrefix = name || classNamePrefixOption || 'makeStyles';\n  stylesCreator.options = {\n    index: Object(_indexCounter__WEBPACK_IMPORTED_MODULE_8__[\"increment\"])(),\n    name: name,\n    meta: classNamePrefix,\n    classNamePrefix: classNamePrefix\n  };\n\n  var useStyles = function useStyles() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var theme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_6__[\"default\"])() || defaultTheme;\n\n    var stylesOptions = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(_StylesProvider__WEBPACK_IMPORTED_MODULE_7__[\"StylesContext\"])), stylesOptions2);\n\n    var instance = react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef();\n    var shouldUpdate = react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef();\n    useSynchronousEffect(function () {\n      var current = {\n        name: name,\n        state: {},\n        stylesCreator: stylesCreator,\n        stylesOptions: stylesOptions,\n        theme: theme\n      };\n      attach(current, props);\n      shouldUpdate.current = false;\n      instance.current = current;\n      return function () {\n        detach(current);\n      };\n    }, [theme, stylesCreator]);\n    react__WEBPACK_IMPORTED_MODULE_2___default.a.useEffect(function () {\n      if (shouldUpdate.current) {\n        update(instance.current, props);\n      }\n\n      shouldUpdate.current = true;\n    });\n    var classes = getClasses(instance.current, props.classes, Component);\n\n    if (true) {\n      // eslint-disable-next-line react-hooks/rules-of-hooks\n      react__WEBPACK_IMPORTED_MODULE_2___default.a.useDebugValue(classes);\n    }\n\n    return classes;\n  };\n\n  return useStyles;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/makeStyles.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js":
+/*!**************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js ***!
+  \**************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n// Used https://github.com/thinkloop/multi-key-cache as inspiration\nvar multiKeyStore = {\n  set: function set(cache, key1, key2, value) {\n    var subCache = cache.get(key1);\n\n    if (!subCache) {\n      subCache = new Map();\n      cache.set(key1, subCache);\n    }\n\n    subCache.set(key2, value);\n  },\n  get: function get(cache, key1, key2) {\n    var subCache = cache.get(key1);\n    return subCache ? subCache.get(key2) : undefined;\n  },\n  delete: function _delete(cache, key1, key2) {\n    var subCache = cache.get(key1);\n    subCache.delete(key2);\n  }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (multiKeyStore);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/multiKeyStore.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js ***!
+  \********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _mergeClasses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mergeClasses */ \"./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _mergeClasses__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js":
+/*!***************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js ***!
+  \***************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return mergeClasses; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\nfunction mergeClasses() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var baseClasses = options.baseClasses,\n      newClasses = options.newClasses,\n      Component = options.Component;\n\n  if (!newClasses) {\n    return baseClasses;\n  }\n\n  var nextClasses = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, baseClasses);\n\n  if (true) {\n    if (typeof newClasses === 'string') {\n      console.error([\"Material-UI: The value `\".concat(newClasses, \"` \") + \"provided to the classes prop of \".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_1__[\"getDisplayName\"])(Component), \" is incorrect.\"), 'You might want to use the className prop instead.'].join('\\n'));\n      return baseClasses;\n    }\n  }\n\n  Object.keys(newClasses).forEach(function (key) {\n    if (true) {\n      if (!baseClasses[key] && newClasses[key]) {\n        console.error([\"Material-UI: The key `\".concat(key, \"` \") + \"provided to the classes prop is not implemented in \".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_1__[\"getDisplayName\"])(Component), \".\"), \"You can only override one of the following: \".concat(Object.keys(baseClasses).join(','), \".\")].join('\\n'));\n      }\n\n      if (newClasses[key] && typeof newClasses[key] !== 'string') {\n        console.error([\"Material-UI: The key `\".concat(key, \"` \") + \"provided to the classes prop is not valid for \".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_1__[\"getDisplayName\"])(Component), \".\"), \"You need to provide a non empty string instead of: \".concat(newClasses[key], \".\")].join('\\n'));\n      }\n    }\n\n    if (newClasses[key]) {\n      nextClasses[key] = \"\".concat(baseClasses[key], \" \").concat(newClasses[key]);\n    }\n  });\n  return nextClasses;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/mergeClasses/mergeClasses.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js":
+/*!**************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js ***!
+  \**************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _styled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./styled */ \"./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _styled__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/styled/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return styled; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"./jaas-client/node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js\");\n\n\n\n\n\n\n\n\n\nfunction omit(input, fields) {\n  var output = {};\n  Object.keys(input).forEach(function (prop) {\n    if (fields.indexOf(prop) === -1) {\n      output[prop] = input[prop];\n    }\n  });\n  return output;\n} // styled-components's API removes the mapping between components and styles.\n// Using components as a low-level styling construct can be simpler.\n\n\nfunction styled(Component) {\n  var componentCreator = function componentCreator(style) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var name = options.name,\n        stylesOptions = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(options, [\"name\"]);\n\n    if ( true && Component === undefined) {\n      throw new Error(['You are calling styled(Component)(style) with an undefined component.', 'You may have forgotten to import it.'].join('\\n'));\n    }\n\n    var classNamePrefix = name;\n\n    if (true) {\n      if (!name) {\n        // Provide a better DX outside production.\n        var displayName = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component);\n\n        if (displayName !== undefined) {\n          classNamePrefix = displayName;\n        }\n      }\n    }\n\n    var stylesOrCreator = typeof style === 'function' ? function (theme) {\n      return {\n        root: function root(props) {\n          return style(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n            theme: theme\n          }, props));\n        }\n      };\n    } : {\n      root: style\n    };\n    var useStyles = Object(_makeStyles__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(stylesOrCreator, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      Component: Component,\n      name: name || Component.displayName,\n      classNamePrefix: classNamePrefix\n    }, stylesOptions));\n    var filterProps;\n    var propTypes = {};\n\n    if (style.filterProps) {\n      filterProps = style.filterProps;\n      delete style.filterProps;\n    }\n    /* eslint-disable react/forbid-foreign-prop-types */\n\n\n    if (style.propTypes) {\n      propTypes = style.propTypes;\n      delete style.propTypes;\n    }\n    /* eslint-enable react/forbid-foreign-prop-types */\n\n\n    var StyledComponent = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function StyledComponent(props, ref) {\n      var children = props.children,\n          classNameProp = props.className,\n          clone = props.clone,\n          ComponentProp = props.component,\n          other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"children\", \"className\", \"clone\", \"component\"]);\n\n      var classes = useStyles(props);\n      var className = Object(clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(classes.root, classNameProp);\n      var spread = other;\n\n      if (filterProps) {\n        spread = omit(spread, filterProps);\n      }\n\n      if (clone) {\n        return react__WEBPACK_IMPORTED_MODULE_2___default.a.cloneElement(children, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n          className: Object(clsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(children.props.className, className)\n        }, spread));\n      }\n\n      if (typeof children === 'function') {\n        return children(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n          className: className\n        }, spread));\n      }\n\n      var FinalComponent = ComponentProp || Component;\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(FinalComponent, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        ref: ref,\n        className: className\n      }, spread), children);\n    });\n     true ? StyledComponent.propTypes = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      /**\n       * A render function or node.\n       */\n      children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]),\n\n      /**\n       * @ignore\n       */\n      className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n\n      /**\n       * If `true`, the component will recycle it's children HTML element.\n       * It's using `React.cloneElement` internally.\n       *\n       * This prop will be deprecated and removed in v5\n       */\n      clone: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, function (props) {\n        if (props.clone && props.component) {\n          return new Error('You can not use the clone and component prop at the same time.');\n        }\n\n        return null;\n      }),\n\n      /**\n       * The component used for the root node.\n       * Either a string to use a HTML element or a component.\n       */\n      component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType\n    }, propTypes) : undefined;\n\n    if (true) {\n      StyledComponent.displayName = \"Styled(\".concat(classNamePrefix, \")\");\n    }\n\n    hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_6___default()(StyledComponent, Component);\n    return StyledComponent;\n  };\n\n  return componentCreator;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/styled/styled.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js ***!
+  \***********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nvar ThemeContext = react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext(null);\n\nif (true) {\n  ThemeContext.displayName = 'ThemeContext';\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ThemeContext);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _useTheme__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js ***!
+  \*******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return useTheme; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _ThemeContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ThemeContext */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/ThemeContext.js\");\n\n\nfunction useTheme() {\n  var theme = react__WEBPACK_IMPORTED_MODULE_0___default.a.useContext(_ThemeContext__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n  if (true) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    react__WEBPACK_IMPORTED_MODULE_0___default.a.useDebugValue(theme);\n  }\n\n  return theme;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/useTheme/useTheme.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js ***!
+  \******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _withStyles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./withStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _withStyles__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withStyles/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js ***!
+  \***********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _makeStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../makeStyles */ \"./jaas-client/node_modules/@material-ui/styles/esm/makeStyles/index.js\");\n/* harmony import */ var _getThemeProps__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../getThemeProps */ \"./jaas-client/node_modules/@material-ui/styles/esm/getThemeProps/index.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n\n\n\n\n\n\n\n\n // Link a style sheet with a component.\n// It does not modify the component passed to it;\n// instead, it returns a new component, with a `classes` property.\n\nvar withStyles = function withStyles(stylesOrCreator) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  return function (Component) {\n    var defaultTheme = options.defaultTheme,\n        _options$withTheme = options.withTheme,\n        withTheme = _options$withTheme === void 0 ? false : _options$withTheme,\n        name = options.name,\n        stylesOptions = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(options, [\"defaultTheme\", \"withTheme\", \"name\"]);\n\n    if (true) {\n      if (Component === undefined) {\n        throw new Error(['You are calling withStyles(styles)(Component) with an undefined component.', 'You may have forgotten to import it.'].join('\\n'));\n      }\n    }\n\n    var classNamePrefix = name;\n\n    if (true) {\n      if (!name) {\n        // Provide a better DX outside production.\n        var displayName = Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component);\n\n        if (displayName !== undefined) {\n          classNamePrefix = displayName;\n        }\n      }\n    }\n\n    var useStyles = Object(_makeStyles__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(stylesOrCreator, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      defaultTheme: defaultTheme,\n      Component: Component,\n      name: name || Component.displayName,\n      classNamePrefix: classNamePrefix\n    }, stylesOptions));\n    var WithStyles = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function WithStyles(props, ref) {\n      var classesProp = props.classes,\n          innerRef = props.innerRef,\n          other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"classes\", \"innerRef\"]); // The wrapper receives only user supplied props, which could be a subset of\n      // the actual props Component might receive due to merging with defaultProps.\n      // So copying it here would give us the same result in the wrapper as well.\n\n\n      var classes = useStyles(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, Component.defaultProps), props));\n      var theme;\n      var more = other;\n\n      if (typeof name === 'string' || withTheme) {\n        // name and withTheme are invariant in the outer scope\n        // eslint-disable-next-line react-hooks/rules-of-hooks\n        theme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_8__[\"default\"])() || defaultTheme;\n\n        if (name) {\n          more = Object(_getThemeProps__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({\n            theme: theme,\n            name: name,\n            props: other\n          });\n        } // Provide the theme to the wrapped component.\n        // So we don't have to use the `withTheme()` Higher-order Component.\n\n\n        if (withTheme && !more.theme) {\n          more.theme = theme;\n        }\n      }\n\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        ref: innerRef || ref,\n        classes: classes\n      }, more));\n    });\n     true ? WithStyles.propTypes = {\n      /**\n       * Override or extend the styles applied to the component.\n       */\n      classes: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n\n      /**\n       * Use that prop to pass a ref to the decorated component.\n       * @deprecated\n       */\n      innerRef: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object]), function (props) {\n        if (props.innerRef == null) {\n          return null;\n        }\n\n        return null; // return new Error(\n        //   'Material-UI: The `innerRef` prop is deprecated and will be removed in v5. ' +\n        //     'Refs are now automatically forwarded to the inner component.',\n        // );\n      })\n    } : undefined;\n\n    if (true) {\n      WithStyles.displayName = \"WithStyles(\".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component), \")\");\n    }\n\n    hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default()(WithStyles, Component);\n\n    if (true) {\n      // Exposed for test purposes.\n      WithStyles.Naked = Component;\n      WithStyles.options = options;\n      WithStyles.useStyles = useStyles;\n    }\n\n    return WithStyles;\n  };\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (withStyles);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withStyles/withStyles.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js ***!
+  \*****************************************************************************/
+/*! exports provided: default, withThemeCreator */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _withTheme__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./withTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withThemeCreator\", function() { return _withTheme__WEBPACK_IMPORTED_MODULE_0__[\"withThemeCreator\"]; });\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withTheme/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js ***!
+  \*********************************************************************************/
+/*! exports provided: withThemeCreator, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"withThemeCreator\", function() { return withThemeCreator; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n/* harmony import */ var _useTheme__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../useTheme */ \"./jaas-client/node_modules/@material-ui/styles/esm/useTheme/index.js\");\n\n\n\n\n\n\n\nfunction withThemeCreator() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var defaultTheme = options.defaultTheme;\n\n  var withTheme = function withTheme(Component) {\n    if (true) {\n      if (Component === undefined) {\n        throw new Error(['You are calling withTheme(Component) with an undefined component.', 'You may have forgotten to import it.'].join('\\n'));\n      }\n    }\n\n    var WithTheme = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function WithTheme(props, ref) {\n      var innerRef = props.innerRef,\n          other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(props, [\"innerRef\"]);\n\n      var theme = Object(_useTheme__WEBPACK_IMPORTED_MODULE_6__[\"default\"])() || defaultTheme;\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n        theme: theme,\n        ref: innerRef || ref\n      }, other));\n    });\n     true ? WithTheme.propTypes = {\n      /**\n       * Use that prop to pass a ref to the decorated component.\n       * @deprecated\n       */\n      innerRef: Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"chainPropTypes\"])(prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object]), function (props) {\n        if (props.innerRef == null) {\n          return null;\n        }\n\n        return new Error('Material-UI: The `innerRef` prop is deprecated and will be removed in v5. ' + 'Refs are now automatically forwarded to the inner component.');\n      })\n    } : undefined;\n\n    if (true) {\n      WithTheme.displayName = \"WithTheme(\".concat(Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_5__[\"getDisplayName\"])(Component), \")\");\n    }\n\n    hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_4___default()(WithTheme, Component);\n\n    if (true) {\n      // Exposed for test purposes.\n      WithTheme.Naked = Component;\n    }\n\n    return WithTheme;\n  };\n\n  return withTheme;\n} // Provide the theme object as a prop to the input component.\n// It's an alternative API to useTheme().\n// We encourage the usage of useTheme() where possible.\n\nvar withTheme = withThemeCreator();\n/* harmony default export */ __webpack_exports__[\"default\"] = (withTheme);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/styles/esm/withTheme/withTheme.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/borders.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/borders.js ***!
+  \*********************************************************************/
+/*! exports provided: border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderRadius, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"border\", function() { return border; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderTop\", function() { return borderTop; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderRight\", function() { return borderRight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderBottom\", function() { return borderBottom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderLeft\", function() { return borderLeft; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderColor\", function() { return borderColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"borderRadius\", function() { return borderRadius; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\n\nfunction getBorder(value) {\n  if (typeof value !== 'number') {\n    return value;\n  }\n\n  return \"\".concat(value, \"px solid\");\n}\n\nvar border = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'border',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderTop = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderTop',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderRight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderRight',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderBottom = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderBottom',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderLeft = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderLeft',\n  themeKey: 'borders',\n  transform: getBorder\n});\nvar borderColor = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderColor',\n  themeKey: 'palette'\n});\nvar borderRadius = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'borderRadius',\n  themeKey: 'shape'\n});\nvar borders = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderRadius);\n/* harmony default export */ __webpack_exports__[\"default\"] = (borders);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/borders.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js ***!
+  \*************************************************************************/
+/*! exports provided: handleBreakpoints, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"handleBreakpoints\", function() { return handleBreakpoints; });\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n\n\n\n\n // The breakpoint **start** at this value.\n// For instance with the first breakpoint xs: [xs, sm[.\n\nvar values = {\n  xs: 0,\n  sm: 600,\n  md: 960,\n  lg: 1280,\n  xl: 1920\n};\nvar defaultBreakpoints = {\n  // Sorted ASC by size. That's important.\n  // It can't be configured as it's used statically for propTypes.\n  keys: ['xs', 'sm', 'md', 'lg', 'xl'],\n  up: function up(key) {\n    return \"@media (min-width:\".concat(values[key], \"px)\");\n  }\n};\nfunction handleBreakpoints(props, propValue, styleFromPropValue) {\n  if (true) {\n    if (!props.theme) {\n      console.error('Material-UI: You are calling a style function without a theme value.');\n    }\n  }\n\n  if (Array.isArray(propValue)) {\n    var themeBreakpoints = props.theme.breakpoints || defaultBreakpoints;\n    return propValue.reduce(function (acc, item, index) {\n      acc[themeBreakpoints.up(themeBreakpoints.keys[index])] = styleFromPropValue(propValue[index]);\n      return acc;\n    }, {});\n  }\n\n  if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(propValue) === 'object') {\n    var _themeBreakpoints = props.theme.breakpoints || defaultBreakpoints;\n\n    return Object.keys(propValue).reduce(function (acc, breakpoint) {\n      acc[_themeBreakpoints.up(breakpoint)] = styleFromPropValue(propValue[breakpoint]);\n      return acc;\n    }, {});\n  }\n\n  var output = styleFromPropValue(propValue);\n  return output;\n}\n\nfunction breakpoints(styleFunction) {\n  var newStyleFunction = function newStyleFunction(props) {\n    var base = styleFunction(props);\n    var themeBreakpoints = props.theme.breakpoints || defaultBreakpoints;\n    var extended = themeBreakpoints.keys.reduce(function (acc, key) {\n      if (props[key]) {\n        acc = acc || {};\n        acc[themeBreakpoints.up(key)] = styleFunction(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n          theme: props.theme\n        }, props[key]));\n      }\n\n      return acc;\n    }, null);\n    return Object(_merge__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(base, extended);\n  };\n\n  newStyleFunction.propTypes =  true ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, styleFunction.propTypes), {}, {\n    xs: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    sm: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    md: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    lg: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object,\n    xl: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.object\n  }) : undefined;\n  newStyleFunction.filterProps = ['xs', 'sm', 'md', 'lg', 'xl'].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(styleFunction.filterProps));\n  return newStyleFunction;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (breakpoints);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/compose.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/compose.js ***!
+  \*********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n\n\n\nfunction compose() {\n  for (var _len = arguments.length, styles = new Array(_len), _key = 0; _key < _len; _key++) {\n    styles[_key] = arguments[_key];\n  }\n\n  var fn = function fn(props) {\n    return styles.reduce(function (acc, style) {\n      var output = style(props);\n\n      if (output) {\n        return Object(_merge__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(acc, output);\n      }\n\n      return acc;\n    }, {});\n  }; // Alternative approach that doesn't yield any performance gain.\n  // const handlers = styles.reduce((acc, style) => {\n  //   style.filterProps.forEach(prop => {\n  //     acc[prop] = style;\n  //   });\n  //   return acc;\n  // }, {});\n  // const fn = props => {\n  //   return Object.keys(props).reduce((acc, prop) => {\n  //     if (handlers[prop]) {\n  //       return merge(acc, handlers[prop](props));\n  //     }\n  //     return acc;\n  //   }, {});\n  // };\n\n\n  fn.propTypes =  true ? styles.reduce(function (acc, style) {\n    return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(acc, style.propTypes);\n  }, {}) : undefined;\n  fn.filterProps = styles.reduce(function (acc, style) {\n    return acc.concat(style.filterProps);\n  }, []);\n  return fn;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (compose);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/compose.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/css.js":
+/*!*****************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/css.js ***!
+  \*****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n\n\n\n\n\nfunction omit(input, fields) {\n  var output = {};\n  Object.keys(input).forEach(function (prop) {\n    if (fields.indexOf(prop) === -1) {\n      output[prop] = input[prop];\n    }\n  });\n  return output;\n}\n\nfunction css(styleFunction) {\n  var newStyleFunction = function newStyleFunction(props) {\n    var output = styleFunction(props);\n\n    if (props.css) {\n      return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, Object(_merge__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(output, styleFunction(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n        theme: props.theme\n      }, props.css)))), omit(props.css, [styleFunction.filterProps]));\n    }\n\n    return output;\n  };\n\n  newStyleFunction.propTypes =  true ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, styleFunction.propTypes), {}, {\n    css: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n  }) : undefined;\n  newStyleFunction.filterProps = ['css'].concat(Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(styleFunction.filterProps));\n  return newStyleFunction;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (css);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/css.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/display.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/display.js ***!
+  \*********************************************************************/
+/*! exports provided: displayPrint, displayRaw, overflow, textOverflow, visibility, whiteSpace, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"displayPrint\", function() { return displayPrint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"displayRaw\", function() { return displayRaw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"overflow\", function() { return overflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"textOverflow\", function() { return textOverflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"visibility\", function() { return visibility; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"whiteSpace\", function() { return whiteSpace; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar displayPrint = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'displayPrint',\n  cssProperty: false,\n  transform: function transform(value) {\n    return {\n      '@media print': {\n        display: value\n      }\n    };\n  }\n});\nvar displayRaw = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'display'\n});\nvar overflow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'overflow'\n});\nvar textOverflow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'textOverflow'\n});\nvar visibility = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'visibility'\n});\nvar whiteSpace = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'whiteSpace'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(displayPrint, displayRaw, overflow, textOverflow, visibility, whiteSpace));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/display.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/flexbox.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/flexbox.js ***!
+  \*********************************************************************/
+/*! exports provided: flexBasis, flexDirection, flexWrap, justifyContent, alignItems, alignContent, order, flex, flexGrow, flexShrink, alignSelf, justifyItems, justifySelf, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexBasis\", function() { return flexBasis; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexDirection\", function() { return flexDirection; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexWrap\", function() { return flexWrap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"justifyContent\", function() { return justifyContent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alignItems\", function() { return alignItems; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alignContent\", function() { return alignContent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"order\", function() { return order; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flex\", function() { return flex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexGrow\", function() { return flexGrow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flexShrink\", function() { return flexShrink; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"alignSelf\", function() { return alignSelf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"justifyItems\", function() { return justifyItems; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"justifySelf\", function() { return justifySelf; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar flexBasis = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexBasis'\n});\nvar flexDirection = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexDirection'\n});\nvar flexWrap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexWrap'\n});\nvar justifyContent = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'justifyContent'\n});\nvar alignItems = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'alignItems'\n});\nvar alignContent = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'alignContent'\n});\nvar order = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'order'\n});\nvar flex = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flex'\n});\nvar flexGrow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexGrow'\n});\nvar flexShrink = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'flexShrink'\n});\nvar alignSelf = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'alignSelf'\n});\nvar justifyItems = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'justifyItems'\n});\nvar justifySelf = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'justifySelf'\n});\nvar flexbox = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(flexBasis, flexDirection, flexWrap, justifyContent, alignItems, alignContent, order, flex, flexGrow, flexShrink, alignSelf, justifyItems, justifySelf);\n/* harmony default export */ __webpack_exports__[\"default\"] = (flexbox);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/flexbox.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/grid.js":
+/*!******************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/grid.js ***!
+  \******************************************************************/
+/*! exports provided: gridGap, gridColumnGap, gridRowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridGap\", function() { return gridGap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridColumnGap\", function() { return gridColumnGap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridRowGap\", function() { return gridRowGap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridColumn\", function() { return gridColumn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridRow\", function() { return gridRow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridAutoFlow\", function() { return gridAutoFlow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridAutoColumns\", function() { return gridAutoColumns; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridAutoRows\", function() { return gridAutoRows; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateColumns\", function() { return gridTemplateColumns; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateRows\", function() { return gridTemplateRows; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateAreas\", function() { return gridTemplateAreas; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"gridArea\", function() { return gridArea; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar gridGap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridGap'\n});\nvar gridColumnGap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridColumnGap'\n});\nvar gridRowGap = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridRowGap'\n});\nvar gridColumn = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridColumn'\n});\nvar gridRow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridRow'\n});\nvar gridAutoFlow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridAutoFlow'\n});\nvar gridAutoColumns = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridAutoColumns'\n});\nvar gridAutoRows = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridAutoRows'\n});\nvar gridTemplateColumns = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridTemplateColumns'\n});\nvar gridTemplateRows = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridTemplateRows'\n});\nvar gridTemplateAreas = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridTemplateAreas'\n});\nvar gridArea = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'gridArea'\n});\nvar grid = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(gridGap, gridColumnGap, gridRowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea);\n/* harmony default export */ __webpack_exports__[\"default\"] = (grid);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/grid.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/index.js":
+/*!*******************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/index.js ***!
+  \*******************************************************************/
+/*! exports provided: borders, border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderRadius, breakpoints, compose, css, display, flexbox, flexBasis, flexDirection, flexWrap, justifyContent, alignItems, alignContent, order, flex, flexGrow, flexShrink, alignSelf, justifyItems, justifySelf, grid, gridGap, gridColumnGap, gridRowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea, palette, color, bgcolor, positions, position, zIndex, top, right, bottom, left, shadows, sizing, width, maxWidth, minWidth, height, maxHeight, minHeight, sizeWidth, sizeHeight, boxSizing, spacing, createUnarySpacing, style, typography, fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, textAlign */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _borders__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./borders */ \"./jaas-client/node_modules/@material-ui/system/esm/borders.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borders\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"border\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"border\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderTop\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderTop\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderRight\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderRight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderBottom\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderBottom\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderLeft\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderLeft\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderColor\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderColor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"borderRadius\", function() { return _borders__WEBPACK_IMPORTED_MODULE_0__[\"borderRadius\"]; });\n\n/* harmony import */ var _breakpoints__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./breakpoints */ \"./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"breakpoints\", function() { return _breakpoints__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"compose\", function() { return _compose__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./css */ \"./jaas-client/node_modules/@material-ui/system/esm/css.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"css\", function() { return _css__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _display__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./display */ \"./jaas-client/node_modules/@material-ui/system/esm/display.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"display\", function() { return _display__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _flexbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./flexbox */ \"./jaas-client/node_modules/@material-ui/system/esm/flexbox.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexbox\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexBasis\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexBasis\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexDirection\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexDirection\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexWrap\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexWrap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"justifyContent\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"justifyContent\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"alignItems\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"alignItems\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"alignContent\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"alignContent\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"order\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"order\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flex\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flex\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexGrow\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexGrow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"flexShrink\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"flexShrink\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"alignSelf\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"alignSelf\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"justifyItems\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"justifyItems\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"justifySelf\", function() { return _flexbox__WEBPACK_IMPORTED_MODULE_5__[\"justifySelf\"]; });\n\n/* harmony import */ var _grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./grid */ \"./jaas-client/node_modules/@material-ui/system/esm/grid.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"grid\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridGap\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridGap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridColumnGap\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridColumnGap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridRowGap\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridRowGap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridColumn\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridColumn\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridRow\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridRow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridAutoFlow\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridAutoFlow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridAutoColumns\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridAutoColumns\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridAutoRows\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridAutoRows\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateColumns\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridTemplateColumns\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateRows\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridTemplateRows\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridTemplateAreas\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridTemplateAreas\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"gridArea\", function() { return _grid__WEBPACK_IMPORTED_MODULE_6__[\"gridArea\"]; });\n\n/* harmony import */ var _palette__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./palette */ \"./jaas-client/node_modules/@material-ui/system/esm/palette.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"palette\", function() { return _palette__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"color\", function() { return _palette__WEBPACK_IMPORTED_MODULE_7__[\"color\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bgcolor\", function() { return _palette__WEBPACK_IMPORTED_MODULE_7__[\"bgcolor\"]; });\n\n/* harmony import */ var _positions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./positions */ \"./jaas-client/node_modules/@material-ui/system/esm/positions.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"positions\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"position\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"position\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"zIndex\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"zIndex\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"top\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"top\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"right\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"right\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"bottom\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"bottom\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"left\", function() { return _positions__WEBPACK_IMPORTED_MODULE_8__[\"left\"]; });\n\n/* harmony import */ var _shadows__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./shadows */ \"./jaas-client/node_modules/@material-ui/system/esm/shadows.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"shadows\", function() { return _shadows__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/* harmony import */ var _sizing__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./sizing */ \"./jaas-client/node_modules/@material-ui/system/esm/sizing.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sizing\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"width\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"width\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"maxWidth\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"maxWidth\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"minWidth\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"minWidth\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"height\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"height\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"maxHeight\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"maxHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"minHeight\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"minHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sizeWidth\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"sizeWidth\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"sizeHeight\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"sizeHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"boxSizing\", function() { return _sizing__WEBPACK_IMPORTED_MODULE_10__[\"boxSizing\"]; });\n\n/* harmony import */ var _spacing__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./spacing */ \"./jaas-client/node_modules/@material-ui/system/esm/spacing.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"spacing\", function() { return _spacing__WEBPACK_IMPORTED_MODULE_11__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createUnarySpacing\", function() { return _spacing__WEBPACK_IMPORTED_MODULE_11__[\"createUnarySpacing\"]; });\n\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"style\", function() { return _style__WEBPACK_IMPORTED_MODULE_12__[\"default\"]; });\n\n/* harmony import */ var _typography__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./typography */ \"./jaas-client/node_modules/@material-ui/system/esm/typography.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"typography\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"default\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontFamily\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontFamily\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontSize\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontSize\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontStyle\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontStyle\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"fontWeight\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"fontWeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"letterSpacing\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"letterSpacing\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"lineHeight\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"lineHeight\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"textAlign\", function() { return _typography__WEBPACK_IMPORTED_MODULE_13__[\"textAlign\"]; });\n\n/** @license Material-UI v4.9.14\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/memoize.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/memoize.js ***!
+  \*********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return memoize; });\nfunction memoize(fn) {\n  var cache = {};\n  return function (arg) {\n    if (cache[arg] === undefined) {\n      cache[arg] = fn(arg);\n    }\n\n    return cache[arg];\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/memoize.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/merge.js":
+/*!*******************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/merge.js ***!
+  \*******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _material_ui_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @material-ui/utils */ \"./jaas-client/node_modules/@material-ui/utils/esm/index.js\");\n\n\nfunction merge(acc, item) {\n  if (!item) {\n    return acc;\n  }\n\n  return Object(_material_ui_utils__WEBPACK_IMPORTED_MODULE_0__[\"deepmerge\"])(acc, item, {\n    clone: false // No need to clone deep, it's way faster.\n\n  });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (merge);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/merge.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/palette.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/palette.js ***!
+  \*********************************************************************/
+/*! exports provided: color, bgcolor, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"color\", function() { return color; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bgcolor\", function() { return bgcolor; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar color = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'color',\n  themeKey: 'palette'\n});\nvar bgcolor = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'bgcolor',\n  cssProperty: 'backgroundColor',\n  themeKey: 'palette'\n});\nvar palette = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(color, bgcolor);\n/* harmony default export */ __webpack_exports__[\"default\"] = (palette);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/palette.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/positions.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/positions.js ***!
+  \***********************************************************************/
+/*! exports provided: position, zIndex, top, right, bottom, left, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"position\", function() { return position; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"zIndex\", function() { return zIndex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"top\", function() { return top; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"right\", function() { return right; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bottom\", function() { return bottom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"left\", function() { return left; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar position = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'position'\n});\nvar zIndex = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'zIndex',\n  themeKey: 'zIndex'\n});\nvar top = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'top'\n});\nvar right = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'right'\n});\nvar bottom = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'bottom'\n});\nvar left = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'left'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(position, zIndex, top, right, bottom, left));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/positions.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js ***!
+  \********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n\nvar responsivePropType =  true ? prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.array]) : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (responsivePropType);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/shadows.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/shadows.js ***!
+  \*********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n\nvar boxShadow = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'boxShadow',\n  themeKey: 'shadows'\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (boxShadow);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/shadows.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/sizing.js":
+/*!********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/sizing.js ***!
+  \********************************************************************/
+/*! exports provided: width, maxWidth, minWidth, height, maxHeight, minHeight, sizeWidth, sizeHeight, boxSizing, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"width\", function() { return width; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"maxWidth\", function() { return maxWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"minWidth\", function() { return minWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"height\", function() { return height; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"maxHeight\", function() { return maxHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"minHeight\", function() { return minHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sizeWidth\", function() { return sizeWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sizeHeight\", function() { return sizeHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"boxSizing\", function() { return boxSizing; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\n\nfunction transform(value) {\n  return value <= 1 ? \"\".concat(value * 100, \"%\") : value;\n}\n\nvar width = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'width',\n  transform: transform\n});\nvar maxWidth = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'maxWidth',\n  transform: transform\n});\nvar minWidth = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'minWidth',\n  transform: transform\n});\nvar height = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'height',\n  transform: transform\n});\nvar maxHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'maxHeight',\n  transform: transform\n});\nvar minHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'minHeight',\n  transform: transform\n});\nvar sizeWidth = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'size',\n  cssProperty: 'width',\n  transform: transform\n});\nvar sizeHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'size',\n  cssProperty: 'height',\n  transform: transform\n});\nvar boxSizing = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'boxSizing'\n});\nvar sizing = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(width, maxWidth, minWidth, height, maxHeight, minHeight, boxSizing);\n/* harmony default export */ __webpack_exports__[\"default\"] = (sizing);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/sizing.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/spacing.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/spacing.js ***!
+  \*********************************************************************/
+/*! exports provided: createUnarySpacing, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createUnarySpacing\", function() { return createUnarySpacing; });\n/* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _responsivePropType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./responsivePropType */ \"./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js\");\n/* harmony import */ var _breakpoints__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./breakpoints */ \"./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js\");\n/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./merge */ \"./jaas-client/node_modules/@material-ui/system/esm/merge.js\");\n/* harmony import */ var _memoize__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./memoize */ \"./jaas-client/node_modules/@material-ui/system/esm/memoize.js\");\n\n\n\n\n\nvar properties = {\n  m: 'margin',\n  p: 'padding'\n};\nvar directions = {\n  t: 'Top',\n  r: 'Right',\n  b: 'Bottom',\n  l: 'Left',\n  x: ['Left', 'Right'],\n  y: ['Top', 'Bottom']\n};\nvar aliases = {\n  marginX: 'mx',\n  marginY: 'my',\n  paddingX: 'px',\n  paddingY: 'py'\n}; // memoize() impact:\n// From 300,000 ops/sec\n// To 350,000 ops/sec\n\nvar getCssProperties = Object(_memoize__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(function (prop) {\n  // It's not a shorthand notation.\n  if (prop.length > 2) {\n    if (aliases[prop]) {\n      prop = aliases[prop];\n    } else {\n      return [prop];\n    }\n  }\n\n  var _prop$split = prop.split(''),\n      _prop$split2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_prop$split, 2),\n      a = _prop$split2[0],\n      b = _prop$split2[1];\n\n  var property = properties[a];\n  var direction = directions[b] || '';\n  return Array.isArray(direction) ? direction.map(function (dir) {\n    return property + dir;\n  }) : [property + direction];\n});\nvar spacingKeys = ['m', 'mt', 'mr', 'mb', 'ml', 'mx', 'my', 'p', 'pt', 'pr', 'pb', 'pl', 'px', 'py', 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'marginX', 'marginY', 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'paddingX', 'paddingY'];\nfunction createUnarySpacing(theme) {\n  var themeSpacing = theme.spacing || 8;\n\n  if (typeof themeSpacing === 'number') {\n    return function (abs) {\n      if (true) {\n        if (typeof abs !== 'number') {\n          console.error(\"Material-UI: Expected spacing argument to be a number, got \".concat(abs, \".\"));\n        }\n      }\n\n      return themeSpacing * abs;\n    };\n  }\n\n  if (Array.isArray(themeSpacing)) {\n    return function (abs) {\n      if (true) {\n        if (abs > themeSpacing.length - 1) {\n          console.error([\"Material-UI: The value provided (\".concat(abs, \") overflows.\"), \"The supported values are: \".concat(JSON.stringify(themeSpacing), \".\"), \"\".concat(abs, \" > \").concat(themeSpacing.length - 1, \", you need to add the missing values.\")].join('\\n'));\n        }\n      }\n\n      return themeSpacing[abs];\n    };\n  }\n\n  if (typeof themeSpacing === 'function') {\n    return themeSpacing;\n  }\n\n  if (true) {\n    console.error([\"Material-UI: The `theme.spacing` value (\".concat(themeSpacing, \") is invalid.\"), 'It should be a number, an array or a function.'].join('\\n'));\n  }\n\n  return function () {\n    return undefined;\n  };\n}\n\nfunction getValue(transformer, propValue) {\n  if (typeof propValue === 'string') {\n    return propValue;\n  }\n\n  var abs = Math.abs(propValue);\n  var transformed = transformer(abs);\n\n  if (propValue >= 0) {\n    return transformed;\n  }\n\n  if (typeof transformed === 'number') {\n    return -transformed;\n  }\n\n  return \"-\".concat(transformed);\n}\n\nfunction getStyleFromPropValue(cssProperties, transformer) {\n  return function (propValue) {\n    return cssProperties.reduce(function (acc, cssProperty) {\n      acc[cssProperty] = getValue(transformer, propValue);\n      return acc;\n    }, {});\n  };\n}\n\nfunction spacing(props) {\n  var theme = props.theme;\n  var transformer = createUnarySpacing(theme);\n  return Object.keys(props).map(function (prop) {\n    // Using a hash computation over an array iteration could be faster, but with only 28 items,\n    // it's doesn't worth the bundle size.\n    if (spacingKeys.indexOf(prop) === -1) {\n      return null;\n    }\n\n    var cssProperties = getCssProperties(prop);\n    var styleFromPropValue = getStyleFromPropValue(cssProperties, transformer);\n    var propValue = props[prop];\n    return Object(_breakpoints__WEBPACK_IMPORTED_MODULE_2__[\"handleBreakpoints\"])(props, propValue, styleFromPropValue);\n  }).reduce(_merge__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {});\n}\n\nspacing.propTypes =  true ? spacingKeys.reduce(function (obj, key) {\n  obj[key] = _responsivePropType__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n  return obj;\n}, {}) : undefined;\nspacing.filterProps = spacingKeys;\n/* harmony default export */ __webpack_exports__[\"default\"] = (spacing);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/spacing.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/style.js":
+/*!*******************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/style.js ***!
+  \*******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _responsivePropType__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./responsivePropType */ \"./jaas-client/node_modules/@material-ui/system/esm/responsivePropType.js\");\n/* harmony import */ var _breakpoints__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./breakpoints */ \"./jaas-client/node_modules/@material-ui/system/esm/breakpoints.js\");\n\n\n\n\nfunction getPath(obj, path) {\n  if (!path || typeof path !== 'string') {\n    return null;\n  }\n\n  return path.split('.').reduce(function (acc, item) {\n    return acc && acc[item] ? acc[item] : null;\n  }, obj);\n}\n\nfunction style(options) {\n  var prop = options.prop,\n      _options$cssProperty = options.cssProperty,\n      cssProperty = _options$cssProperty === void 0 ? options.prop : _options$cssProperty,\n      themeKey = options.themeKey,\n      transform = options.transform;\n\n  var fn = function fn(props) {\n    if (props[prop] == null) {\n      return null;\n    }\n\n    var propValue = props[prop];\n    var theme = props.theme;\n    var themeMapping = getPath(theme, themeKey) || {};\n\n    var styleFromPropValue = function styleFromPropValue(propValueFinal) {\n      var value;\n\n      if (typeof themeMapping === 'function') {\n        value = themeMapping(propValueFinal);\n      } else if (Array.isArray(themeMapping)) {\n        value = themeMapping[propValueFinal] || propValueFinal;\n      } else {\n        value = getPath(themeMapping, propValueFinal) || propValueFinal;\n\n        if (transform) {\n          value = transform(value);\n        }\n      }\n\n      if (cssProperty === false) {\n        return value;\n      }\n\n      return Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, cssProperty, value);\n    };\n\n    return Object(_breakpoints__WEBPACK_IMPORTED_MODULE_2__[\"handleBreakpoints\"])(props, propValue, styleFromPropValue);\n  };\n\n  fn.propTypes =  true ? Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, prop, _responsivePropType__WEBPACK_IMPORTED_MODULE_1__[\"default\"]) : undefined;\n  fn.filterProps = [prop];\n  return fn;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (style);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/style.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/system/esm/typography.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/system/esm/typography.js ***!
+  \************************************************************************/
+/*! exports provided: fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, textAlign, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontFamily\", function() { return fontFamily; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontSize\", function() { return fontSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontStyle\", function() { return fontStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fontWeight\", function() { return fontWeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"letterSpacing\", function() { return letterSpacing; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"lineHeight\", function() { return lineHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"textAlign\", function() { return textAlign; });\n/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style */ \"./jaas-client/node_modules/@material-ui/system/esm/style.js\");\n/* harmony import */ var _compose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./compose */ \"./jaas-client/node_modules/@material-ui/system/esm/compose.js\");\n\n\nvar fontFamily = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontFamily',\n  themeKey: 'typography'\n});\nvar fontSize = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontSize',\n  themeKey: 'typography'\n});\nvar fontStyle = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontStyle',\n  themeKey: 'typography'\n});\nvar fontWeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'fontWeight',\n  themeKey: 'typography'\n});\nvar letterSpacing = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'letterSpacing'\n});\nvar lineHeight = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'lineHeight'\n});\nvar textAlign = Object(_style__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n  prop: 'textAlign'\n});\nvar typography = Object(_compose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, textAlign);\n/* harmony default export */ __webpack_exports__[\"default\"] = (typography);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/system/esm/typography.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return HTMLElementType; });\nfunction HTMLElementType(props, propName, componentName, location, propFullName) {\n  if (false) {}\n\n  var propValue = props[propName];\n  var safePropName = propFullName || propName;\n\n  if (propValue == null) {\n    return null;\n  }\n\n  if (propValue && propValue.nodeType !== 1) {\n    return new Error(\"Invalid \".concat(location, \" `\").concat(safePropName, \"` supplied to `\").concat(componentName, \"`. \") + \"Expected an HTMLElement.\");\n  }\n\n  return null;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return chainPropTypes; });\nfunction chainPropTypes(propType1, propType2) {\n  if (false) {}\n\n  return function validate() {\n    return propType1.apply(void 0, arguments) || propType2.apply(void 0, arguments);\n  };\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js ***!
+  \**********************************************************************/
+/*! exports provided: isPlainObject, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isPlainObject\", function() { return isPlainObject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return deepmerge; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n\n\nfunction isPlainObject(item) {\n  return item && Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(item) === 'object' && item.constructor === Object;\n}\nfunction deepmerge(target, source) {\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n    clone: true\n  };\n  var output = options.clone ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, target) : target;\n\n  if (isPlainObject(target) && isPlainObject(source)) {\n    Object.keys(source).forEach(function (key) {\n      // Avoid prototype pollution\n      if (key === '__proto__') {\n        return;\n      }\n\n      if (isPlainObject(source[key]) && key in target) {\n        output[key] = deepmerge(target[key], source[key], options);\n      } else {\n        output[key] = source[key];\n      }\n    });\n  }\n\n  return output;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js ***!
+  \********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _chainPropTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chainPropTypes */ \"./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js\");\n\n\n\nfunction isClassComponent(elementType) {\n  // elementType.prototype?.isReactComponent\n  var _elementType$prototyp = elementType.prototype,\n      prototype = _elementType$prototyp === void 0 ? {} : _elementType$prototyp;\n  return Boolean(prototype.isReactComponent);\n}\n\nfunction acceptingRef(props, propName, componentName, location, propFullName) {\n  var element = props[propName];\n  var safePropName = propFullName || propName;\n\n  if (element == null) {\n    return null;\n  }\n\n  var warningHint;\n  var elementType = element.type;\n  /**\n   * Blacklisting instead of whitelisting\n   *\n   * Blacklisting will miss some components, such as React.Fragment. Those will at least\n   * trigger a warning in React.\n   * We can't whitelist because there is no safe way to detect React.forwardRef\n   * or class components. \"Safe\" means there's no public API.\n   *\n   */\n\n  if (typeof elementType === 'function' && !isClassComponent(elementType)) {\n    warningHint = 'Did you accidentally use a plain function component for an element instead?';\n  }\n\n  if (warningHint !== undefined) {\n    return new Error(\"Invalid \".concat(location, \" `\").concat(safePropName, \"` supplied to `\").concat(componentName, \"`. \") + \"Expected an element that can hold a ref. \".concat(warningHint, \" \") + 'For more information see https://material-ui.com/r/caveat-with-refs-guide');\n  }\n\n  return null;\n}\n\nvar elementAcceptingRef = Object(_chainPropTypes__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.element, acceptingRef);\nelementAcceptingRef.isRequired = Object(_chainPropTypes__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.element.isRequired, acceptingRef);\n/* harmony default export */ __webpack_exports__[\"default\"] = (elementAcceptingRef);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js":
+/*!************************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js ***!
+  \************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _chainPropTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chainPropTypes */ \"./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js\");\n\n\n\nfunction isClassComponent(elementType) {\n  // elementType.prototype?.isReactComponent\n  var _elementType$prototyp = elementType.prototype,\n      prototype = _elementType$prototyp === void 0 ? {} : _elementType$prototyp;\n  return Boolean(prototype.isReactComponent);\n}\n\nfunction elementTypeAcceptingRef(props, propName, componentName, location, propFullName) {\n  var propValue = props[propName];\n  var safePropName = propFullName || propName;\n\n  if (propValue == null) {\n    return null;\n  }\n\n  var warningHint;\n  /**\n   * Blacklisting instead of whitelisting\n   *\n   * Blacklisting will miss some components, such as React.Fragment. Those will at least\n   * trigger a warning in React.\n   * We can't whitelist because there is no safe way to detect React.forwardRef\n   * or class components. \"Safe\" means there's no public API.\n   *\n   */\n\n  if (typeof propValue === 'function' && !isClassComponent(propValue)) {\n    warningHint = 'Did you accidentally provide a plain function component instead?';\n  }\n\n  if (warningHint !== undefined) {\n    return new Error(\"Invalid \".concat(location, \" `\").concat(safePropName, \"` supplied to `\").concat(componentName, \"`. \") + \"Expected an element type that can hold a ref. \".concat(warningHint, \" \") + 'For more information see https://material-ui.com/r/caveat-with-refs-guide');\n  }\n\n  return null;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Object(_chainPropTypes__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(prop_types__WEBPACK_IMPORTED_MODULE_0__[\"elementType\"], elementTypeAcceptingRef));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js ***!
+  \**********************************************************************/
+/*! exports provided: specialProperty, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"specialProperty\", function() { return specialProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return exactProp; });\n/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n\n\n// This module is based on https://github.com/airbnb/prop-types-exact repository.\n// However, in order to reduce the number of dependencies and to remove some extra safe checks\n// the module was forked.\n// Only exported for test purposes.\nvar specialProperty = \"exact-prop: \\u200B\";\nfunction exactProp(propTypes) {\n  if (false) {}\n\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, propTypes, Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, specialProperty, function (props) {\n    var unsupportedProps = Object.keys(props).filter(function (prop) {\n      return !propTypes.hasOwnProperty(prop);\n    });\n\n    if (unsupportedProps.length > 0) {\n      return new Error(\"The following props are not supported: \".concat(unsupportedProps.map(function (prop) {\n        return \"`\".concat(prop, \"`\");\n      }).join(', '), \". Please remove them.\"));\n    }\n\n    return null;\n  }));\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return formatMuiErrorMessage; });\n/**\n * WARNING: Don't import this directly.\n * Use `MuiError` from `@material-ui/utils/macros/MuiError.macro` instead.\n * @param {number} code\n */\nfunction formatMuiErrorMessage(code) {\n  // Apply babel-plugin-transform-template-literals in loose mode\n  // loose mode is safe iff we're concatenating primitives\n  // see https://babeljs.io/docs/en/babel-plugin-transform-template-literals#loose\n\n  /* eslint-disable prefer-template */\n  var url = 'https://material-ui.com/production-error/?code=' + code;\n\n  for (var i = 1; i < arguments.length; i += 1) {\n    // rest params over-transpile for this case\n    // eslint-disable-next-line prefer-rest-params\n    url += '&args[]=' + encodeURIComponent(arguments[i]);\n  }\n\n  return 'Minified Material-UI error #' + code + '; visit ' + url + ' for the full message.';\n  /* eslint-enable prefer-template */\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js ***!
+  \***************************************************************************/
+/*! exports provided: getFunctionName, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getFunctionName\", function() { return getFunctionName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return getDisplayName; });\n/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/typeof.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_1__);\n\n // Simplified polyfill for IE 11 support\n// https://github.com/JamesMGreene/Function.name/blob/58b314d4a983110c3682f1228f845d39ccca1817/Function.name.js#L3\n\nvar fnNameMatchRegex = /^\\s*function(?:\\s|\\s*\\/\\*.*\\*\\/\\s*)+([^(\\s/]*)\\s*/;\nfunction getFunctionName(fn) {\n  var match = \"\".concat(fn).match(fnNameMatchRegex);\n  var name = match && match[1];\n  return name || '';\n}\n/**\n * @param {function} Component\n * @param {string} fallback\n * @returns {string | undefined}\n */\n\nfunction getFunctionComponentName(Component) {\n  var fallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n  return Component.displayName || Component.name || getFunctionName(Component) || fallback;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var functionName = getFunctionComponentName(innerType);\n  return outerType.displayName || (functionName !== '' ? \"\".concat(wrapperName, \"(\").concat(functionName, \")\") : wrapperName);\n}\n/**\n * cherry-pick from\n * https://github.com/facebook/react/blob/769b1f270e1251d9dbdce0fcbd9e92e502d059b8/packages/shared/getComponentName.js\n * originally forked from recompose/getDisplayName with added IE 11 support\n *\n * @param {React.ReactType} Component\n * @returns {string | undefined}\n */\n\n\nfunction getDisplayName(Component) {\n  if (Component == null) {\n    return undefined;\n  }\n\n  if (typeof Component === 'string') {\n    return Component;\n  }\n\n  if (typeof Component === 'function') {\n    return getFunctionComponentName(Component, 'Component');\n  }\n\n  if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Component) === 'object') {\n    switch (Component.$$typeof) {\n      case react_is__WEBPACK_IMPORTED_MODULE_1__[\"ForwardRef\"]:\n        return getWrappedName(Component, Component.render, 'ForwardRef');\n\n      case react_is__WEBPACK_IMPORTED_MODULE_1__[\"Memo\"]:\n        return getWrappedName(Component, Component.type, 'memo');\n\n      default:\n        return undefined;\n    }\n  }\n\n  return undefined;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/index.js":
+/*!******************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/index.js ***!
+  \******************************************************************/
+/*! exports provided: chainPropTypes, deepmerge, elementAcceptingRef, elementTypeAcceptingRef, exactProp, formatMuiErrorMessage, getDisplayName, HTMLElementType, ponyfillGlobal, refType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _chainPropTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chainPropTypes */ \"./jaas-client/node_modules/@material-ui/utils/esm/chainPropTypes.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"chainPropTypes\", function() { return _chainPropTypes__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _deepmerge__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./deepmerge */ \"./jaas-client/node_modules/@material-ui/utils/esm/deepmerge.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"deepmerge\", function() { return _deepmerge__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _elementAcceptingRef__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./elementAcceptingRef */ \"./jaas-client/node_modules/@material-ui/utils/esm/elementAcceptingRef.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"elementAcceptingRef\", function() { return _elementAcceptingRef__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _elementTypeAcceptingRef__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./elementTypeAcceptingRef */ \"./jaas-client/node_modules/@material-ui/utils/esm/elementTypeAcceptingRef.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"elementTypeAcceptingRef\", function() { return _elementTypeAcceptingRef__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _exactProp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./exactProp */ \"./jaas-client/node_modules/@material-ui/utils/esm/exactProp.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"exactProp\", function() { return _exactProp__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _formatMuiErrorMessage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./formatMuiErrorMessage */ \"./jaas-client/node_modules/@material-ui/utils/esm/formatMuiErrorMessage.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"formatMuiErrorMessage\", function() { return _formatMuiErrorMessage__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n/* harmony import */ var _getDisplayName__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getDisplayName */ \"./jaas-client/node_modules/@material-ui/utils/esm/getDisplayName.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"getDisplayName\", function() { return _getDisplayName__WEBPACK_IMPORTED_MODULE_6__[\"default\"]; });\n\n/* harmony import */ var _HTMLElementType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./HTMLElementType */ \"./jaas-client/node_modules/@material-ui/utils/esm/HTMLElementType.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"HTMLElementType\", function() { return _HTMLElementType__WEBPACK_IMPORTED_MODULE_7__[\"default\"]; });\n\n/* harmony import */ var _ponyfillGlobal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ponyfillGlobal */ \"./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ponyfillGlobal\", function() { return _ponyfillGlobal__WEBPACK_IMPORTED_MODULE_8__[\"default\"]; });\n\n/* harmony import */ var _refType__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./refType */ \"./jaas-client/node_modules/@material-ui/utils/esm/refType.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"refType\", function() { return _refType__WEBPACK_IMPORTED_MODULE_9__[\"default\"]; });\n\n/** @license Material-UI v4.10.2\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* eslint-disable */\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n/* harmony default export */ __webpack_exports__[\"default\"] = (typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')());\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/ponyfillGlobal.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/@material-ui/utils/esm/refType.js":
+/*!********************************************************************!*\
+  !*** ./jaas-client/node_modules/@material-ui/utils/esm/refType.js ***!
+  \********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n\nvar refType = prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.object]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (refType);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/@material-ui/utils/esm/refType.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/after/index.js":
+/*!*************************************************!*\
+  !*** ./jaas-client/node_modules/after/index.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = after\n\nfunction after(count, callback, err_cb) {\n    var bail = false\n    err_cb = err_cb || noop\n    proxy.count = count\n\n    return (count === 0) ? callback() : proxy\n\n    function proxy(err, result) {\n        if (proxy.count <= 0) {\n            throw new Error('after called too many times')\n        }\n        --proxy.count\n\n        // after first error, rest are passed to err_cb\n        if (err) {\n            bail = true\n            callback(err)\n            // future error callbacks will go to error handler\n            callback = err_cb\n        } else if (proxy.count === 0 && !bail) {\n            callback(null, result)\n        }\n    }\n}\n\nfunction noop() {}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/after/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/arraybuffer.slice/index.js":
+/*!*************************************************************!*\
+  !*** ./jaas-client/node_modules/arraybuffer.slice/index.js ***!
+  \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/**\n * An abstraction for slicing an arraybuffer even when\n * ArrayBuffer.prototype.slice is not supported\n *\n * @api public\n */\n\nmodule.exports = function(arraybuffer, start, end) {\n  var bytes = arraybuffer.byteLength;\n  start = start || 0;\n  end = end || bytes;\n\n  if (arraybuffer.slice) { return arraybuffer.slice(start, end); }\n\n  if (start < 0) { start += bytes; }\n  if (end < 0) { end += bytes; }\n  if (end > bytes) { end = bytes; }\n\n  if (start >= bytes || start >= end || bytes === 0) {\n    return new ArrayBuffer(0);\n  }\n\n  var abv = new Uint8Array(arraybuffer);\n  var result = new Uint8Array(end - start);\n  for (var i = start, ii = 0; i < end; i++, ii++) {\n    result[ii] = abv[i];\n  }\n  return result.buffer;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/arraybuffer.slice/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/backo2/index.js":
+/*!**************************************************!*\
+  !*** ./jaas-client/node_modules/backo2/index.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("\n/**\n * Expose `Backoff`.\n */\n\nmodule.exports = Backoff;\n\n/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction Backoff(opts) {\n  opts = opts || {};\n  this.ms = opts.min || 100;\n  this.max = opts.max || 10000;\n  this.factor = opts.factor || 2;\n  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n  this.attempts = 0;\n}\n\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\n\nBackoff.prototype.duration = function(){\n  var ms = this.ms * Math.pow(this.factor, this.attempts++);\n  if (this.jitter) {\n    var rand =  Math.random();\n    var deviation = Math.floor(rand * this.jitter * ms);\n    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;\n  }\n  return Math.min(ms, this.max) | 0;\n};\n\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\n\nBackoff.prototype.reset = function(){\n  this.attempts = 0;\n};\n\n/**\n * Set the minimum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMin = function(min){\n  this.ms = min;\n};\n\n/**\n * Set the maximum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMax = function(max){\n  this.max = max;\n};\n\n/**\n * Set the jitter\n *\n * @api public\n */\n\nBackoff.prototype.setJitter = function(jitter){\n  this.jitter = jitter;\n};\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/backo2/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js ***!
+  \*******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/*\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n(function(){\n  \"use strict\";\n\n  var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n  // Use a lookup table to find the index.\n  var lookup = new Uint8Array(256);\n  for (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n  }\n\n  exports.encode = function(arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer),\n    i, len = bytes.length, base64 = \"\";\n\n    for (i = 0; i < len; i+=3) {\n      base64 += chars[bytes[i] >> 2];\n      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n      base64 += chars[bytes[i + 2] & 63];\n    }\n\n    if ((len % 3) === 2) {\n      base64 = base64.substring(0, base64.length - 1) + \"=\";\n    } else if (len % 3 === 1) {\n      base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n\n    return base64;\n  };\n\n  exports.decode =  function(base64) {\n    var bufferLength = base64.length * 0.75,\n    len = base64.length, i, p = 0,\n    encoded1, encoded2, encoded3, encoded4;\n\n    if (base64[base64.length - 1] === \"=\") {\n      bufferLength--;\n      if (base64[base64.length - 2] === \"=\") {\n        bufferLength--;\n      }\n    }\n\n    var arraybuffer = new ArrayBuffer(bufferLength),\n    bytes = new Uint8Array(arraybuffer);\n\n    for (i = 0; i < len; i+=4) {\n      encoded1 = lookup[base64.charCodeAt(i)];\n      encoded2 = lookup[base64.charCodeAt(i+1)];\n      encoded3 = lookup[base64.charCodeAt(i+2)];\n      encoded4 = lookup[base64.charCodeAt(i+3)];\n\n      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return arraybuffer;\n  };\n})();\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/blob/index.js":
+/*!************************************************!*\
+  !*** ./jaas-client/node_modules/blob/index.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/**\r\n * Create a blob builder even when vendor prefixes exist\r\n */\r\n\r\nvar BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :\r\n  typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder :\r\n  typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :\r\n  typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : \r\n  false;\r\n\r\n/**\r\n * Check if Blob constructor is supported\r\n */\r\n\r\nvar blobSupported = (function() {\r\n  try {\r\n    var a = new Blob(['hi']);\r\n    return a.size === 2;\r\n  } catch(e) {\r\n    return false;\r\n  }\r\n})();\r\n\r\n/**\r\n * Check if Blob constructor supports ArrayBufferViews\r\n * Fails in Safari 6, so we need to map to ArrayBuffers there.\r\n */\r\n\r\nvar blobSupportsArrayBufferView = blobSupported && (function() {\r\n  try {\r\n    var b = new Blob([new Uint8Array([1,2])]);\r\n    return b.size === 2;\r\n  } catch(e) {\r\n    return false;\r\n  }\r\n})();\r\n\r\n/**\r\n * Check if BlobBuilder is supported\r\n */\r\n\r\nvar blobBuilderSupported = BlobBuilder\r\n  && BlobBuilder.prototype.append\r\n  && BlobBuilder.prototype.getBlob;\r\n\r\n/**\r\n * Helper function that maps ArrayBufferViews to ArrayBuffers\r\n * Used by BlobBuilder constructor and old browsers that didn't\r\n * support it in the Blob constructor.\r\n */\r\n\r\nfunction mapArrayBufferViews(ary) {\r\n  return ary.map(function(chunk) {\r\n    if (chunk.buffer instanceof ArrayBuffer) {\r\n      var buf = chunk.buffer;\r\n\r\n      // if this is a subarray, make a copy so we only\r\n      // include the subarray region from the underlying buffer\r\n      if (chunk.byteLength !== buf.byteLength) {\r\n        var copy = new Uint8Array(chunk.byteLength);\r\n        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));\r\n        buf = copy.buffer;\r\n      }\r\n\r\n      return buf;\r\n    }\r\n\r\n    return chunk;\r\n  });\r\n}\r\n\r\nfunction BlobBuilderConstructor(ary, options) {\r\n  options = options || {};\r\n\r\n  var bb = new BlobBuilder();\r\n  mapArrayBufferViews(ary).forEach(function(part) {\r\n    bb.append(part);\r\n  });\r\n\r\n  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();\r\n};\r\n\r\nfunction BlobConstructor(ary, options) {\r\n  return new Blob(mapArrayBufferViews(ary), options || {});\r\n};\r\n\r\nif (typeof Blob !== 'undefined') {\r\n  BlobBuilderConstructor.prototype = Blob.prototype;\r\n  BlobConstructor.prototype = Blob.prototype;\r\n}\r\n\r\nmodule.exports = (function() {\r\n  if (blobSupported) {\r\n    return blobSupportsArrayBufferView ? Blob : BlobConstructor;\r\n  } else if (blobBuilderSupported) {\r\n    return BlobBuilderConstructor;\r\n  } else {\r\n    return undefined;\r\n  }\r\n})();\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/blob/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/clsx/dist/clsx.m.js":
+/*!******************************************************!*\
+  !*** ./jaas-client/node_modules/clsx/dist/clsx.m.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nfunction toVal(mix) {\n\tvar k, y, str='';\n\n\tif (typeof mix === 'string' || typeof mix === 'number') {\n\t\tstr += mix;\n\t} else if (typeof mix === 'object') {\n\t\tif (Array.isArray(mix)) {\n\t\t\tfor (k=0; k < mix.length; k++) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tif (y = toVal(mix[k])) {\n\t\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\t\tstr += y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (k in mix) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\tstr += k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn str;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (function () {\n\tvar i=0, tmp, x, str='';\n\twhile (i < arguments.length) {\n\t\tif (tmp = arguments[i++]) {\n\t\t\tif (x = toVal(tmp)) {\n\t\t\t\tstr && (str += ' ');\n\t\t\t\tstr += x\n\t\t\t}\n\t\t}\n\t}\n\treturn str;\n});\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/clsx/dist/clsx.m.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/component-bind/index.js":
+/*!**********************************************************!*\
+  !*** ./jaas-client/node_modules/component-bind/index.js ***!
+  \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/**\n * Slice reference.\n */\n\nvar slice = [].slice;\n\n/**\n * Bind `obj` to `fn`.\n *\n * @param {Object} obj\n * @param {Function|String} fn or string\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(obj, fn){\n  if ('string' == typeof fn) fn = obj[fn];\n  if ('function' != typeof fn) throw new Error('bind() requires a function');\n  var args = slice.call(arguments, 2);\n  return function(){\n    return fn.apply(obj, args.concat(slice.call(arguments)));\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/component-bind/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/component-emitter/index.js":
+/*!*************************************************************!*\
+  !*** ./jaas-client/node_modules/component-emitter/index.js ***!
+  \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (true) {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n\r\n  // Remove event specific arrays for event types that no\r\n  // one is subscribed for to avoid memory leak.\r\n  if (callbacks.length === 0) {\r\n    delete this._callbacks['$' + event];\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  var args = new Array(arguments.length - 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  for (var i = 1; i < arguments.length; i++) {\r\n    args[i - 1] = arguments[i];\r\n  }\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/component-emitter/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/component-inherit/index.js":
+/*!*************************************************************!*\
+  !*** ./jaas-client/node_modules/component-inherit/index.js ***!
+  \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("\nmodule.exports = function(a, b){\n  var fn = function(){};\n  fn.prototype = b.prototype;\n  a.prototype = new fn;\n  a.prototype.constructor = a;\n};\n\n//# sourceURL=webpack:///./jaas-client/node_modules/component-inherit/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js":
+/*!********************************************************************!*\
+  !*** ./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js ***!
+  \********************************************************************/
+/*! exports provided: prefix, supportedKeyframes, supportedProperty, supportedValue */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"prefix\", function() { return prefix; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportedKeyframes\", function() { return supportedKeyframes; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportedProperty\", function() { return supportedProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportedValue\", function() { return supportedValue; });\n/* harmony import */ var is_in_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! is-in-browser */ \"./jaas-client/node_modules/is-in-browser/dist/module.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js\");\n\n\n\n// Export javascript style and css style vendor prefixes.\nvar js = '';\nvar css = '';\nvar vendor = '';\nvar browser = '';\nvar isTouch = is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"] && 'ontouchstart' in document.documentElement; // We should not do anything if required serverside.\n\nif (is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) {\n  // Order matters. We need to check Webkit the last one because\n  // other vendors use to add Webkit prefixes to some properties\n  var jsCssMap = {\n    Moz: '-moz-',\n    ms: '-ms-',\n    O: '-o-',\n    Webkit: '-webkit-'\n  };\n\n  var _document$createEleme = document.createElement('p'),\n      style = _document$createEleme.style;\n\n  var testProp = 'Transform';\n\n  for (var key in jsCssMap) {\n    if (key + testProp in style) {\n      js = key;\n      css = jsCssMap[key];\n      break;\n    }\n  } // Correctly detect the Edge browser.\n\n\n  if (js === 'Webkit' && 'msHyphens' in style) {\n    js = 'ms';\n    css = jsCssMap.ms;\n    browser = 'edge';\n  } // Correctly detect the Safari browser.\n\n\n  if (js === 'Webkit' && '-apple-trailing-word' in style) {\n    vendor = 'apple';\n  }\n}\n/**\n * Vendor prefix string for the current browser.\n *\n * @type {{js: String, css: String, vendor: String, browser: String}}\n * @api public\n */\n\n\nvar prefix = {\n  js: js,\n  css: css,\n  vendor: vendor,\n  browser: browser,\n  isTouch: isTouch\n};\n\n/**\n * Test if a keyframe at-rule should be prefixed or not\n *\n * @param {String} vendor prefix string for the current browser.\n * @return {String}\n * @api public\n */\n\nfunction supportedKeyframes(key) {\n  // Keyframes is already prefixed. e.g. key = '@-webkit-keyframes a'\n  if (key[1] === '-') return key; // No need to prefix IE/Edge. Older browsers will ignore unsupported rules.\n  // https://caniuse.com/#search=keyframes\n\n  if (prefix.js === 'ms') return key;\n  return \"@\" + prefix.css + \"keyframes\" + key.substr(10);\n}\n\n// https://caniuse.com/#search=appearance\n\nvar appearence = {\n  noPrefill: ['appearance'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'appearance') return false;\n    if (prefix.js === 'ms') return \"-webkit-\" + prop;\n    return prefix.css + prop;\n  }\n};\n\n// https://caniuse.com/#search=color-adjust\n\nvar colorAdjust = {\n  noPrefill: ['color-adjust'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'color-adjust') return false;\n    if (prefix.js === 'Webkit') return prefix.css + \"print-\" + prop;\n    return prop;\n  }\n};\n\nvar regExp = /[-\\s]+(.)?/g;\n/**\n * Replaces the letter with the capital letter\n *\n * @param {String} match\n * @param {String} c\n * @return {String}\n * @api private\n */\n\nfunction toUpper(match, c) {\n  return c ? c.toUpperCase() : '';\n}\n/**\n * Convert dash separated strings to camel-cased.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\n\nfunction camelize(str) {\n  return str.replace(regExp, toUpper);\n}\n\n/**\n * Convert dash separated strings to pascal cased.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nfunction pascalize(str) {\n  return camelize(\"-\" + str);\n}\n\n// but we can use a longhand property instead.\n// https://caniuse.com/#search=mask\n\nvar mask = {\n  noPrefill: ['mask'],\n  supportedProperty: function supportedProperty(prop, style) {\n    if (!/^mask/.test(prop)) return false;\n\n    if (prefix.js === 'Webkit') {\n      var longhand = 'mask-image';\n\n      if (camelize(longhand) in style) {\n        return prop;\n      }\n\n      if (prefix.js + pascalize(longhand) in style) {\n        return prefix.css + prop;\n      }\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=text-orientation\n\nvar textOrientation = {\n  noPrefill: ['text-orientation'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'text-orientation') return false;\n\n    if (prefix.vendor === 'apple' && !prefix.isTouch) {\n      return prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=transform\n\nvar transform = {\n  noPrefill: ['transform'],\n  supportedProperty: function supportedProperty(prop, style, options) {\n    if (prop !== 'transform') return false;\n\n    if (options.transform) {\n      return prop;\n    }\n\n    return prefix.css + prop;\n  }\n};\n\n// https://caniuse.com/#search=transition\n\nvar transition = {\n  noPrefill: ['transition'],\n  supportedProperty: function supportedProperty(prop, style, options) {\n    if (prop !== 'transition') return false;\n\n    if (options.transition) {\n      return prop;\n    }\n\n    return prefix.css + prop;\n  }\n};\n\n// https://caniuse.com/#search=writing-mode\n\nvar writingMode = {\n  noPrefill: ['writing-mode'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'writing-mode') return false;\n\n    if (prefix.js === 'Webkit' || prefix.js === 'ms' && prefix.browser !== 'edge') {\n      return prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=user-select\n\nvar userSelect = {\n  noPrefill: ['user-select'],\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'user-select') return false;\n\n    if (prefix.js === 'Moz' || prefix.js === 'ms' || prefix.vendor === 'apple') {\n      return prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=multicolumn\n// https://github.com/postcss/autoprefixer/issues/491\n// https://github.com/postcss/autoprefixer/issues/177\n\nvar breakPropsOld = {\n  supportedProperty: function supportedProperty(prop, style) {\n    if (!/^break-/.test(prop)) return false;\n\n    if (prefix.js === 'Webkit') {\n      var jsProp = \"WebkitColumn\" + pascalize(prop);\n      return jsProp in style ? prefix.css + \"column-\" + prop : false;\n    }\n\n    if (prefix.js === 'Moz') {\n      var _jsProp = \"page\" + pascalize(prop);\n\n      return _jsProp in style ? \"page-\" + prop : false;\n    }\n\n    return false;\n  }\n};\n\n// See https://github.com/postcss/autoprefixer/issues/324.\n\nvar inlineLogicalOld = {\n  supportedProperty: function supportedProperty(prop, style) {\n    if (!/^(border|margin|padding)-inline/.test(prop)) return false;\n    if (prefix.js === 'Moz') return prop;\n    var newProp = prop.replace('-inline', '');\n    return prefix.js + pascalize(newProp) in style ? prefix.css + newProp : false;\n  }\n};\n\n// Camelization is required because we can't test using.\n// CSS syntax for e.g. in FF.\n\nvar unprefixed = {\n  supportedProperty: function supportedProperty(prop, style) {\n    return camelize(prop) in style ? prop : false;\n  }\n};\n\nvar prefixed = {\n  supportedProperty: function supportedProperty(prop, style) {\n    var pascalized = pascalize(prop); // Return custom CSS variable without prefixing.\n\n    if (prop[0] === '-') return prop; // Return already prefixed value without prefixing.\n\n    if (prop[0] === '-' && prop[1] === '-') return prop;\n    if (prefix.js + pascalized in style) return prefix.css + prop; // Try webkit fallback.\n\n    if (prefix.js !== 'Webkit' && \"Webkit\" + pascalized in style) return \"-webkit-\" + prop;\n    return false;\n  }\n};\n\n// https://caniuse.com/#search=scroll-snap\n\nvar scrollSnap = {\n  supportedProperty: function supportedProperty(prop) {\n    if (prop.substring(0, 11) !== 'scroll-snap') return false;\n\n    if (prefix.js === 'ms') {\n      return \"\" + prefix.css + prop;\n    }\n\n    return prop;\n  }\n};\n\n// https://caniuse.com/#search=overscroll-behavior\n\nvar overscrollBehavior = {\n  supportedProperty: function supportedProperty(prop) {\n    if (prop !== 'overscroll-behavior') return false;\n\n    if (prefix.js === 'ms') {\n      return prefix.css + \"scroll-chaining\";\n    }\n\n    return prop;\n  }\n};\n\nvar propMap = {\n  'flex-grow': 'flex-positive',\n  'flex-shrink': 'flex-negative',\n  'flex-basis': 'flex-preferred-size',\n  'justify-content': 'flex-pack',\n  order: 'flex-order',\n  'align-items': 'flex-align',\n  'align-content': 'flex-line-pack' // 'align-self' is handled by 'align-self' plugin.\n\n}; // Support old flex spec from 2012.\n\nvar flex2012 = {\n  supportedProperty: function supportedProperty(prop, style) {\n    var newProp = propMap[prop];\n    if (!newProp) return false;\n    return prefix.js + pascalize(newProp) in style ? prefix.css + newProp : false;\n  }\n};\n\nvar propMap$1 = {\n  flex: 'box-flex',\n  'flex-grow': 'box-flex',\n  'flex-direction': ['box-orient', 'box-direction'],\n  order: 'box-ordinal-group',\n  'align-items': 'box-align',\n  'flex-flow': ['box-orient', 'box-direction'],\n  'justify-content': 'box-pack'\n};\nvar propKeys = Object.keys(propMap$1);\n\nvar prefixCss = function prefixCss(p) {\n  return prefix.css + p;\n}; // Support old flex spec from 2009.\n\n\nvar flex2009 = {\n  supportedProperty: function supportedProperty(prop, style, _ref) {\n    var multiple = _ref.multiple;\n\n    if (propKeys.indexOf(prop) > -1) {\n      var newProp = propMap$1[prop];\n\n      if (!Array.isArray(newProp)) {\n        return prefix.js + pascalize(newProp) in style ? prefix.css + newProp : false;\n      }\n\n      if (!multiple) return false;\n\n      for (var i = 0; i < newProp.length; i++) {\n        if (!(prefix.js + pascalize(newProp[0]) in style)) {\n          return false;\n        }\n      }\n\n      return newProp.map(prefixCss);\n    }\n\n    return false;\n  }\n};\n\n// plugins = [\n//   ...plugins,\n//    breakPropsOld,\n//    inlineLogicalOld,\n//    unprefixed,\n//    prefixed,\n//    scrollSnap,\n//    flex2012,\n//    flex2009\n// ]\n// Plugins without 'noPrefill' value, going last.\n// 'flex-*' plugins should be at the bottom.\n// 'flex2009' going after 'flex2012'.\n// 'prefixed' going after 'unprefixed'\n\nvar plugins = [appearence, colorAdjust, mask, textOrientation, transform, transition, writingMode, userSelect, breakPropsOld, inlineLogicalOld, unprefixed, prefixed, scrollSnap, overscrollBehavior, flex2012, flex2009];\nvar propertyDetectors = plugins.filter(function (p) {\n  return p.supportedProperty;\n}).map(function (p) {\n  return p.supportedProperty;\n});\nvar noPrefill = plugins.filter(function (p) {\n  return p.noPrefill;\n}).reduce(function (a, p) {\n  a.push.apply(a, Object(_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(p.noPrefill));\n  return a;\n}, []);\n\nvar el;\nvar cache = {};\n\nif (is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) {\n  el = document.createElement('p'); // We test every property on vendor prefix requirement.\n  // Once tested, result is cached. It gives us up to 70% perf boost.\n  // http://jsperf.com/element-style-object-access-vs-plain-object\n  //\n  // Prefill cache with known css properties to reduce amount of\n  // properties we need to feature test at runtime.\n  // http://davidwalsh.name/vendor-prefix\n\n  var computed = window.getComputedStyle(document.documentElement, '');\n\n  for (var key$1 in computed) {\n    // eslint-disable-next-line no-restricted-globals\n    if (!isNaN(key$1)) cache[computed[key$1]] = computed[key$1];\n  } // Properties that cannot be correctly detected using the\n  // cache prefill method.\n\n\n  noPrefill.forEach(function (x) {\n    return delete cache[x];\n  });\n}\n/**\n * Test if a property is supported, returns supported property with vendor\n * prefix if required. Returns `false` if not supported.\n *\n * @param {String} prop dash separated\n * @param {Object} [options]\n * @return {String|Boolean}\n * @api public\n */\n\n\nfunction supportedProperty(prop, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  // For server-side rendering.\n  if (!el) return prop; // Remove cache for benchmark tests or return property from the cache.\n\n  if ( true && cache[prop] != null) {\n    return cache[prop];\n  } // Check if 'transition' or 'transform' natively supported in browser.\n\n\n  if (prop === 'transition' || prop === 'transform') {\n    options[prop] = prop in el.style;\n  } // Find a plugin for current prefix property.\n\n\n  for (var i = 0; i < propertyDetectors.length; i++) {\n    cache[prop] = propertyDetectors[i](prop, el.style, options); // Break loop, if value found.\n\n    if (cache[prop]) break;\n  } // Reset styles for current property.\n  // Firefox can even throw an error for invalid properties, e.g., \"0\".\n\n\n  try {\n    el.style[prop] = '';\n  } catch (err) {\n    return false;\n  }\n\n  return cache[prop];\n}\n\nvar cache$1 = {};\nvar transitionProperties = {\n  transition: 1,\n  'transition-property': 1,\n  '-webkit-transition': 1,\n  '-webkit-transition-property': 1\n};\nvar transPropsRegExp = /(^\\s*[\\w-]+)|, (\\s*[\\w-]+)(?![^()]*\\))/g;\nvar el$1;\n/**\n * Returns prefixed value transition/transform if needed.\n *\n * @param {String} match\n * @param {String} p1\n * @param {String} p2\n * @return {String}\n * @api private\n */\n\nfunction prefixTransitionCallback(match, p1, p2) {\n  if (p1 === 'var') return 'var';\n  if (p1 === 'all') return 'all';\n  if (p2 === 'all') return ', all';\n  var prefixedValue = p1 ? supportedProperty(p1) : \", \" + supportedProperty(p2);\n  if (!prefixedValue) return p1 || p2;\n  return prefixedValue;\n}\n\nif (is_in_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"]) el$1 = document.createElement('p');\n/**\n * Returns prefixed value if needed. Returns `false` if value is not supported.\n *\n * @param {String} property\n * @param {String} value\n * @return {String|Boolean}\n * @api public\n */\n\nfunction supportedValue(property, value) {\n  // For server-side rendering.\n  var prefixedValue = value;\n  if (!el$1 || property === 'content') return value; // It is a string or a number as a string like '1'.\n  // We want only prefixable values here.\n  // eslint-disable-next-line no-restricted-globals\n\n  if (typeof prefixedValue !== 'string' || !isNaN(parseInt(prefixedValue, 10))) {\n    return prefixedValue;\n  } // Create cache key for current value.\n\n\n  var cacheKey = property + prefixedValue; // Remove cache for benchmark tests or return value from cache.\n\n  if ( true && cache$1[cacheKey] != null) {\n    return cache$1[cacheKey];\n  } // IE can even throw an error in some cases, for e.g. style.content = 'bar'.\n\n\n  try {\n    // Test value as it is.\n    el$1.style[property] = prefixedValue;\n  } catch (err) {\n    // Return false if value not supported.\n    cache$1[cacheKey] = false;\n    return false;\n  } // If 'transition' or 'transition-property' property.\n\n\n  if (transitionProperties[property]) {\n    prefixedValue = prefixedValue.replace(transPropsRegExp, prefixTransitionCallback);\n  } else if (el$1.style[property] === '') {\n    // Value with a vendor prefix.\n    prefixedValue = prefix.css + prefixedValue; // Hardcode test to convert \"flex\" to \"-ms-flexbox\" for IE10.\n\n    if (prefixedValue === '-ms-flex') el$1.style[property] = '-ms-flexbox'; // Test prefixed value.\n\n    el$1.style[property] = prefixedValue; // Return false if value not supported.\n\n    if (el$1.style[property] === '') {\n      cache$1[cacheKey] = false;\n      return false;\n    }\n  } // Reset styles for current property.\n\n\n  el$1.style[property] = ''; // Write current value to cache.\n\n  cache$1[cacheKey] = prefixedValue;\n  return cache$1[cacheKey];\n}\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/debug/src/browser.js":
+/*!*******************************************************!*\
+  !*** ./jaas-client/node_modules/debug/src/browser.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(process) {/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\nfunction log(...args) {\n\t// This hackery is required for IE8/9, where\n\t// the `console.log` function doesn't have 'apply'\n\treturn typeof console === 'object' &&\n\t\tconsole.log &&\n\t\tconsole.log(...args);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = __webpack_require__(/*! ./common */ \"./jaas-client/node_modules/debug/src/common.js\")(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ \"./node_modules/process/browser.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/debug/src/browser.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/debug/src/common.js":
+/*!******************************************************!*\
+  !*** ./jaas-client/node_modules/debug/src/common.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = __webpack_require__(/*! ms */ \"./jaas-client/node_modules/ms/index.js\");\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* Active `debug` instances.\n\t*/\n\tcreateDebug.instances = [];\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.enabled = createDebug.enabled(namespace);\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = selectColor(namespace);\n\t\tdebug.destroy = destroy;\n\t\tdebug.extend = extend;\n\t\t// Debug.formatArgs = formatArgs;\n\t\t// debug.rawLog = rawLog;\n\n\t\t// env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\tcreateDebug.instances.push(debug);\n\n\t\treturn debug;\n\t}\n\n\tfunction destroy() {\n\t\tconst index = createDebug.instances.indexOf(this);\n\t\tif (index !== -1) {\n\t\t\tcreateDebug.instances.splice(index, 1);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < createDebug.instances.length; i++) {\n\t\t\tconst instance = createDebug.instances[i];\n\t\t\tinstance.enabled = createDebug.enabled(instance.namespace);\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/debug/src/common.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/dom-helpers/esm/addClass.js":
+/*!**************************************************************!*\
+  !*** ./jaas-client/node_modules/dom-helpers/esm/addClass.js ***!
+  \**************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return addClass; });\n/* harmony import */ var _hasClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hasClass */ \"./jaas-client/node_modules/dom-helpers/esm/hasClass.js\");\n\nfunction addClass(element, className) {\n  if (element.classList) element.classList.add(className);else if (!Object(_hasClass__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(element, className)) if (typeof element.className === 'string') element.className = element.className + \" \" + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + \" \" + className);\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/dom-helpers/esm/addClass.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/dom-helpers/esm/hasClass.js":
+/*!**************************************************************!*\
+  !*** ./jaas-client/node_modules/dom-helpers/esm/hasClass.js ***!
+  \**************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return hasClass; });\nfunction hasClass(element, className) {\n  if (element.classList) return !!className && element.classList.contains(className);\n  return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/dom-helpers/esm/hasClass.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/dom-helpers/esm/removeClass.js":
+/*!*****************************************************************!*\
+  !*** ./jaas-client/node_modules/dom-helpers/esm/removeClass.js ***!
+  \*****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return removeClass; });\nfunction replaceClassName(origClass, classToRemove) {\n  return origClass.replace(new RegExp(\"(^|\\\\s)\" + classToRemove + \"(?:\\\\s|$)\", 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n\nfunction removeClass(element, className) {\n  if (element.classList) {\n    element.classList.remove(className);\n  } else if (typeof element.className === 'string') {\n    ;\n    element.className = replaceClassName(element.className, className);\n  } else {\n    element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/dom-helpers/esm/removeClass.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js ***!
+  \*****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = (function () {\n  if (typeof self !== 'undefined') {\n    return self;\n  } else if (typeof window !== 'undefined') {\n    return window;\n  } else {\n    return Function('return this')(); // eslint-disable-line no-new-func\n  }\n})();\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/index.js":
+/*!****************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/index.js ***!
+  \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\nmodule.exports = __webpack_require__(/*! ./socket */ \"./jaas-client/node_modules/engine.io-client/lib/socket.js\");\n\n/**\n * Exports parser\n *\n * @api public\n *\n */\nmodule.exports.parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/socket.js":
+/*!*****************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/socket.js ***!
+  \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/**\n * Module dependencies.\n */\n\nvar transports = __webpack_require__(/*! ./transports/index */ \"./jaas-client/node_modules/engine.io-client/lib/transports/index.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/component-emitter/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:socket');\nvar index = __webpack_require__(/*! indexof */ \"./jaas-client/node_modules/indexof/index.js\");\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar parseuri = __webpack_require__(/*! parseuri */ \"./jaas-client/node_modules/parseuri/index.js\");\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = Socket;\n\n/**\n * Socket constructor.\n *\n * @param {String|Object} uri or options\n * @param {Object} options\n * @api public\n */\n\nfunction Socket (uri, opts) {\n  if (!(this instanceof Socket)) return new Socket(uri, opts);\n\n  opts = opts || {};\n\n  if (uri && 'object' === typeof uri) {\n    opts = uri;\n    uri = null;\n  }\n\n  if (uri) {\n    uri = parseuri(uri);\n    opts.hostname = uri.host;\n    opts.secure = uri.protocol === 'https' || uri.protocol === 'wss';\n    opts.port = uri.port;\n    if (uri.query) opts.query = uri.query;\n  } else if (opts.host) {\n    opts.hostname = parseuri(opts.host).host;\n  }\n\n  this.secure = null != opts.secure ? opts.secure\n    : (typeof location !== 'undefined' && 'https:' === location.protocol);\n\n  if (opts.hostname && !opts.port) {\n    // if no port is specified manually, use the protocol default\n    opts.port = this.secure ? '443' : '80';\n  }\n\n  this.agent = opts.agent || false;\n  this.hostname = opts.hostname ||\n    (typeof location !== 'undefined' ? location.hostname : 'localhost');\n  this.port = opts.port || (typeof location !== 'undefined' && location.port\n      ? location.port\n      : (this.secure ? 443 : 80));\n  this.query = opts.query || {};\n  if ('string' === typeof this.query) this.query = parseqs.decode(this.query);\n  this.upgrade = false !== opts.upgrade;\n  this.path = (opts.path || '/engine.io').replace(/\\/$/, '') + '/';\n  this.forceJSONP = !!opts.forceJSONP;\n  this.jsonp = false !== opts.jsonp;\n  this.forceBase64 = !!opts.forceBase64;\n  this.enablesXDR = !!opts.enablesXDR;\n  this.withCredentials = false !== opts.withCredentials;\n  this.timestampParam = opts.timestampParam || 't';\n  this.timestampRequests = opts.timestampRequests;\n  this.transports = opts.transports || ['polling', 'websocket'];\n  this.transportOptions = opts.transportOptions || {};\n  this.readyState = '';\n  this.writeBuffer = [];\n  this.prevBufferLen = 0;\n  this.policyPort = opts.policyPort || 843;\n  this.rememberUpgrade = opts.rememberUpgrade || false;\n  this.binaryType = null;\n  this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades;\n  this.perMessageDeflate = false !== opts.perMessageDeflate ? (opts.perMessageDeflate || {}) : false;\n\n  if (true === this.perMessageDeflate) this.perMessageDeflate = {};\n  if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) {\n    this.perMessageDeflate.threshold = 1024;\n  }\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx || null;\n  this.key = opts.key || null;\n  this.passphrase = opts.passphrase || null;\n  this.cert = opts.cert || null;\n  this.ca = opts.ca || null;\n  this.ciphers = opts.ciphers || null;\n  this.rejectUnauthorized = opts.rejectUnauthorized === undefined ? true : opts.rejectUnauthorized;\n  this.forceNode = !!opts.forceNode;\n\n  // detect ReactNative environment\n  this.isReactNative = (typeof navigator !== 'undefined' && typeof navigator.product === 'string' && navigator.product.toLowerCase() === 'reactnative');\n\n  // other options for Node.js or ReactNative client\n  if (typeof self === 'undefined' || this.isReactNative) {\n    if (opts.extraHeaders && Object.keys(opts.extraHeaders).length > 0) {\n      this.extraHeaders = opts.extraHeaders;\n    }\n\n    if (opts.localAddress) {\n      this.localAddress = opts.localAddress;\n    }\n  }\n\n  // set on handshake\n  this.id = null;\n  this.upgrades = null;\n  this.pingInterval = null;\n  this.pingTimeout = null;\n\n  // set on heartbeat\n  this.pingIntervalTimer = null;\n  this.pingTimeoutTimer = null;\n\n  this.open();\n}\n\nSocket.priorWebsocketSuccess = false;\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\n/**\n * Expose deps for legacy compatibility\n * and standalone browser access.\n */\n\nSocket.Socket = Socket;\nSocket.Transport = __webpack_require__(/*! ./transport */ \"./jaas-client/node_modules/engine.io-client/lib/transport.js\");\nSocket.transports = __webpack_require__(/*! ./transports/index */ \"./jaas-client/node_modules/engine.io-client/lib/transports/index.js\");\nSocket.parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\n\n/**\n * Creates transport of the given type.\n *\n * @param {String} transport name\n * @return {Transport}\n * @api private\n */\n\nSocket.prototype.createTransport = function (name) {\n  debug('creating transport \"%s\"', name);\n  var query = clone(this.query);\n\n  // append engine.io protocol identifier\n  query.EIO = parser.protocol;\n\n  // transport name\n  query.transport = name;\n\n  // per-transport options\n  var options = this.transportOptions[name] || {};\n\n  // session id if we already have one\n  if (this.id) query.sid = this.id;\n\n  var transport = new transports[name]({\n    query: query,\n    socket: this,\n    agent: options.agent || this.agent,\n    hostname: options.hostname || this.hostname,\n    port: options.port || this.port,\n    secure: options.secure || this.secure,\n    path: options.path || this.path,\n    forceJSONP: options.forceJSONP || this.forceJSONP,\n    jsonp: options.jsonp || this.jsonp,\n    forceBase64: options.forceBase64 || this.forceBase64,\n    enablesXDR: options.enablesXDR || this.enablesXDR,\n    withCredentials: options.withCredentials || this.withCredentials,\n    timestampRequests: options.timestampRequests || this.timestampRequests,\n    timestampParam: options.timestampParam || this.timestampParam,\n    policyPort: options.policyPort || this.policyPort,\n    pfx: options.pfx || this.pfx,\n    key: options.key || this.key,\n    passphrase: options.passphrase || this.passphrase,\n    cert: options.cert || this.cert,\n    ca: options.ca || this.ca,\n    ciphers: options.ciphers || this.ciphers,\n    rejectUnauthorized: options.rejectUnauthorized || this.rejectUnauthorized,\n    perMessageDeflate: options.perMessageDeflate || this.perMessageDeflate,\n    extraHeaders: options.extraHeaders || this.extraHeaders,\n    forceNode: options.forceNode || this.forceNode,\n    localAddress: options.localAddress || this.localAddress,\n    requestTimeout: options.requestTimeout || this.requestTimeout,\n    protocols: options.protocols || void (0),\n    isReactNative: this.isReactNative\n  });\n\n  return transport;\n};\n\nfunction clone (obj) {\n  var o = {};\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      o[i] = obj[i];\n    }\n  }\n  return o;\n}\n\n/**\n * Initializes transport to use and starts probe.\n *\n * @api private\n */\nSocket.prototype.open = function () {\n  var transport;\n  if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') !== -1) {\n    transport = 'websocket';\n  } else if (0 === this.transports.length) {\n    // Emit error on next tick so it can be listened to\n    var self = this;\n    setTimeout(function () {\n      self.emit('error', 'No transports available');\n    }, 0);\n    return;\n  } else {\n    transport = this.transports[0];\n  }\n  this.readyState = 'opening';\n\n  // Retry with the next transport if the transport is disabled (jsonp: false)\n  try {\n    transport = this.createTransport(transport);\n  } catch (e) {\n    this.transports.shift();\n    this.open();\n    return;\n  }\n\n  transport.open();\n  this.setTransport(transport);\n};\n\n/**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @api private\n */\n\nSocket.prototype.setTransport = function (transport) {\n  debug('setting transport %s', transport.name);\n  var self = this;\n\n  if (this.transport) {\n    debug('clearing existing transport %s', this.transport.name);\n    this.transport.removeAllListeners();\n  }\n\n  // set up transport\n  this.transport = transport;\n\n  // set up transport listeners\n  transport\n  .on('drain', function () {\n    self.onDrain();\n  })\n  .on('packet', function (packet) {\n    self.onPacket(packet);\n  })\n  .on('error', function (e) {\n    self.onError(e);\n  })\n  .on('close', function () {\n    self.onClose('transport close');\n  });\n};\n\n/**\n * Probes a transport.\n *\n * @param {String} transport name\n * @api private\n */\n\nSocket.prototype.probe = function (name) {\n  debug('probing transport \"%s\"', name);\n  var transport = this.createTransport(name, { probe: 1 });\n  var failed = false;\n  var self = this;\n\n  Socket.priorWebsocketSuccess = false;\n\n  function onTransportOpen () {\n    if (self.onlyBinaryUpgrades) {\n      var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;\n      failed = failed || upgradeLosesBinary;\n    }\n    if (failed) return;\n\n    debug('probe transport \"%s\" opened', name);\n    transport.send([{ type: 'ping', data: 'probe' }]);\n    transport.once('packet', function (msg) {\n      if (failed) return;\n      if ('pong' === msg.type && 'probe' === msg.data) {\n        debug('probe transport \"%s\" pong', name);\n        self.upgrading = true;\n        self.emit('upgrading', transport);\n        if (!transport) return;\n        Socket.priorWebsocketSuccess = 'websocket' === transport.name;\n\n        debug('pausing current transport \"%s\"', self.transport.name);\n        self.transport.pause(function () {\n          if (failed) return;\n          if ('closed' === self.readyState) return;\n          debug('changing transport and sending upgrade packet');\n\n          cleanup();\n\n          self.setTransport(transport);\n          transport.send([{ type: 'upgrade' }]);\n          self.emit('upgrade', transport);\n          transport = null;\n          self.upgrading = false;\n          self.flush();\n        });\n      } else {\n        debug('probe transport \"%s\" failed', name);\n        var err = new Error('probe error');\n        err.transport = transport.name;\n        self.emit('upgradeError', err);\n      }\n    });\n  }\n\n  function freezeTransport () {\n    if (failed) return;\n\n    // Any callback called by transport should be ignored since now\n    failed = true;\n\n    cleanup();\n\n    transport.close();\n    transport = null;\n  }\n\n  // Handle any error that happens while probing\n  function onerror (err) {\n    var error = new Error('probe error: ' + err);\n    error.transport = transport.name;\n\n    freezeTransport();\n\n    debug('probe transport \"%s\" failed because of error: %s', name, err);\n\n    self.emit('upgradeError', error);\n  }\n\n  function onTransportClose () {\n    onerror('transport closed');\n  }\n\n  // When the socket is closed while we're probing\n  function onclose () {\n    onerror('socket closed');\n  }\n\n  // When the socket is upgraded while we're probing\n  function onupgrade (to) {\n    if (transport && to.name !== transport.name) {\n      debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n      freezeTransport();\n    }\n  }\n\n  // Remove all listeners on the transport and on self\n  function cleanup () {\n    transport.removeListener('open', onTransportOpen);\n    transport.removeListener('error', onerror);\n    transport.removeListener('close', onTransportClose);\n    self.removeListener('close', onclose);\n    self.removeListener('upgrading', onupgrade);\n  }\n\n  transport.once('open', onTransportOpen);\n  transport.once('error', onerror);\n  transport.once('close', onTransportClose);\n\n  this.once('close', onclose);\n  this.once('upgrading', onupgrade);\n\n  transport.open();\n};\n\n/**\n * Called when connection is deemed open.\n *\n * @api public\n */\n\nSocket.prototype.onOpen = function () {\n  debug('socket open');\n  this.readyState = 'open';\n  Socket.priorWebsocketSuccess = 'websocket' === this.transport.name;\n  this.emit('open');\n  this.flush();\n\n  // we check for `readyState` in case an `open`\n  // listener already closed the socket\n  if ('open' === this.readyState && this.upgrade && this.transport.pause) {\n    debug('starting upgrade probes');\n    for (var i = 0, l = this.upgrades.length; i < l; i++) {\n      this.probe(this.upgrades[i]);\n    }\n  }\n};\n\n/**\n * Handles a packet.\n *\n * @api private\n */\n\nSocket.prototype.onPacket = function (packet) {\n  if ('opening' === this.readyState || 'open' === this.readyState ||\n      'closing' === this.readyState) {\n    debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n\n    this.emit('packet', packet);\n\n    // Socket is live - any packet counts\n    this.emit('heartbeat');\n\n    switch (packet.type) {\n      case 'open':\n        this.onHandshake(JSON.parse(packet.data));\n        break;\n\n      case 'pong':\n        this.setPing();\n        this.emit('pong');\n        break;\n\n      case 'error':\n        var err = new Error('server error');\n        err.code = packet.data;\n        this.onError(err);\n        break;\n\n      case 'message':\n        this.emit('data', packet.data);\n        this.emit('message', packet.data);\n        break;\n    }\n  } else {\n    debug('packet received with socket readyState \"%s\"', this.readyState);\n  }\n};\n\n/**\n * Called upon handshake completion.\n *\n * @param {Object} handshake obj\n * @api private\n */\n\nSocket.prototype.onHandshake = function (data) {\n  this.emit('handshake', data);\n  this.id = data.sid;\n  this.transport.query.sid = data.sid;\n  this.upgrades = this.filterUpgrades(data.upgrades);\n  this.pingInterval = data.pingInterval;\n  this.pingTimeout = data.pingTimeout;\n  this.onOpen();\n  // In case open handler closes socket\n  if ('closed' === this.readyState) return;\n  this.setPing();\n\n  // Prolong liveness of socket on heartbeat\n  this.removeListener('heartbeat', this.onHeartbeat);\n  this.on('heartbeat', this.onHeartbeat);\n};\n\n/**\n * Resets ping timeout.\n *\n * @api private\n */\n\nSocket.prototype.onHeartbeat = function (timeout) {\n  clearTimeout(this.pingTimeoutTimer);\n  var self = this;\n  self.pingTimeoutTimer = setTimeout(function () {\n    if ('closed' === self.readyState) return;\n    self.onClose('ping timeout');\n  }, timeout || (self.pingInterval + self.pingTimeout));\n};\n\n/**\n * Pings server every `this.pingInterval` and expects response\n * within `this.pingTimeout` or closes connection.\n *\n * @api private\n */\n\nSocket.prototype.setPing = function () {\n  var self = this;\n  clearTimeout(self.pingIntervalTimer);\n  self.pingIntervalTimer = setTimeout(function () {\n    debug('writing ping packet - expecting pong within %sms', self.pingTimeout);\n    self.ping();\n    self.onHeartbeat(self.pingTimeout);\n  }, self.pingInterval);\n};\n\n/**\n* Sends a ping packet.\n*\n* @api private\n*/\n\nSocket.prototype.ping = function () {\n  var self = this;\n  this.sendPacket('ping', function () {\n    self.emit('ping');\n  });\n};\n\n/**\n * Called on `drain` event\n *\n * @api private\n */\n\nSocket.prototype.onDrain = function () {\n  this.writeBuffer.splice(0, this.prevBufferLen);\n\n  // setting prevBufferLen = 0 is very important\n  // for example, when upgrading, upgrade packet is sent over,\n  // and a nonzero prevBufferLen could cause problems on `drain`\n  this.prevBufferLen = 0;\n\n  if (0 === this.writeBuffer.length) {\n    this.emit('drain');\n  } else {\n    this.flush();\n  }\n};\n\n/**\n * Flush write buffers.\n *\n * @api private\n */\n\nSocket.prototype.flush = function () {\n  if ('closed' !== this.readyState && this.transport.writable &&\n    !this.upgrading && this.writeBuffer.length) {\n    debug('flushing %d packets in socket', this.writeBuffer.length);\n    this.transport.send(this.writeBuffer);\n    // keep track of current length of writeBuffer\n    // splice writeBuffer and callbackBuffer on `drain`\n    this.prevBufferLen = this.writeBuffer.length;\n    this.emit('flush');\n  }\n};\n\n/**\n * Sends a message.\n *\n * @param {String} message.\n * @param {Function} callback function.\n * @param {Object} options.\n * @return {Socket} for chaining.\n * @api public\n */\n\nSocket.prototype.write =\nSocket.prototype.send = function (msg, options, fn) {\n  this.sendPacket('message', msg, options, fn);\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {String} packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} callback function.\n * @api private\n */\n\nSocket.prototype.sendPacket = function (type, data, options, fn) {\n  if ('function' === typeof data) {\n    fn = data;\n    data = undefined;\n  }\n\n  if ('function' === typeof options) {\n    fn = options;\n    options = null;\n  }\n\n  if ('closing' === this.readyState || 'closed' === this.readyState) {\n    return;\n  }\n\n  options = options || {};\n  options.compress = false !== options.compress;\n\n  var packet = {\n    type: type,\n    data: data,\n    options: options\n  };\n  this.emit('packetCreate', packet);\n  this.writeBuffer.push(packet);\n  if (fn) this.once('flush', fn);\n  this.flush();\n};\n\n/**\n * Closes the connection.\n *\n * @api private\n */\n\nSocket.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.readyState = 'closing';\n\n    var self = this;\n\n    if (this.writeBuffer.length) {\n      this.once('drain', function () {\n        if (this.upgrading) {\n          waitForUpgrade();\n        } else {\n          close();\n        }\n      });\n    } else if (this.upgrading) {\n      waitForUpgrade();\n    } else {\n      close();\n    }\n  }\n\n  function close () {\n    self.onClose('forced close');\n    debug('socket closing - telling transport to close');\n    self.transport.close();\n  }\n\n  function cleanupAndClose () {\n    self.removeListener('upgrade', cleanupAndClose);\n    self.removeListener('upgradeError', cleanupAndClose);\n    close();\n  }\n\n  function waitForUpgrade () {\n    // wait for upgrade to finish since we can't send packets while pausing a transport\n    self.once('upgrade', cleanupAndClose);\n    self.once('upgradeError', cleanupAndClose);\n  }\n\n  return this;\n};\n\n/**\n * Called upon transport error\n *\n * @api private\n */\n\nSocket.prototype.onError = function (err) {\n  debug('socket error %j', err);\n  Socket.priorWebsocketSuccess = false;\n  this.emit('error', err);\n  this.onClose('transport error', err);\n};\n\n/**\n * Called upon transport close.\n *\n * @api private\n */\n\nSocket.prototype.onClose = function (reason, desc) {\n  if ('opening' === this.readyState || 'open' === this.readyState || 'closing' === this.readyState) {\n    debug('socket close with reason: \"%s\"', reason);\n    var self = this;\n\n    // clear timers\n    clearTimeout(this.pingIntervalTimer);\n    clearTimeout(this.pingTimeoutTimer);\n\n    // stop event from firing again for transport\n    this.transport.removeAllListeners('close');\n\n    // ensure transport won't stay open\n    this.transport.close();\n\n    // ignore further transport communication\n    this.transport.removeAllListeners();\n\n    // set ready state\n    this.readyState = 'closed';\n\n    // clear session id\n    this.id = null;\n\n    // emit close event\n    this.emit('close', reason, desc);\n\n    // clean buffers after, so users can still\n    // grab the buffers on `close` event\n    self.writeBuffer = [];\n    self.prevBufferLen = 0;\n  }\n};\n\n/**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} server upgrades\n * @api private\n *\n */\n\nSocket.prototype.filterUpgrades = function (upgrades) {\n  var filteredUpgrades = [];\n  for (var i = 0, j = upgrades.length; i < j; i++) {\n    if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);\n  }\n  return filteredUpgrades;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/socket.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/transport.js":
+/*!********************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/transport.js ***!
+  \********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/**\n * Module dependencies.\n */\n\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/component-emitter/index.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = Transport;\n\n/**\n * Transport abstract constructor.\n *\n * @param {Object} options.\n * @api private\n */\n\nfunction Transport (opts) {\n  this.path = opts.path;\n  this.hostname = opts.hostname;\n  this.port = opts.port;\n  this.secure = opts.secure;\n  this.query = opts.query;\n  this.timestampParam = opts.timestampParam;\n  this.timestampRequests = opts.timestampRequests;\n  this.readyState = '';\n  this.agent = opts.agent || false;\n  this.socket = opts.socket;\n  this.enablesXDR = opts.enablesXDR;\n  this.withCredentials = opts.withCredentials;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n  this.forceNode = opts.forceNode;\n\n  // results of ReactNative environment detection\n  this.isReactNative = opts.isReactNative;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n  this.localAddress = opts.localAddress;\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Transport.prototype);\n\n/**\n * Emits an error.\n *\n * @param {String} str\n * @return {Transport} for chaining\n * @api public\n */\n\nTransport.prototype.onError = function (msg, desc) {\n  var err = new Error(msg);\n  err.type = 'TransportError';\n  err.description = desc;\n  this.emit('error', err);\n  return this;\n};\n\n/**\n * Opens the transport.\n *\n * @api public\n */\n\nTransport.prototype.open = function () {\n  if ('closed' === this.readyState || '' === this.readyState) {\n    this.readyState = 'opening';\n    this.doOpen();\n  }\n\n  return this;\n};\n\n/**\n * Closes the transport.\n *\n * @api private\n */\n\nTransport.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.doClose();\n    this.onClose();\n  }\n\n  return this;\n};\n\n/**\n * Sends multiple packets.\n *\n * @param {Array} packets\n * @api private\n */\n\nTransport.prototype.send = function (packets) {\n  if ('open' === this.readyState) {\n    this.write(packets);\n  } else {\n    throw new Error('Transport not open');\n  }\n};\n\n/**\n * Called upon open\n *\n * @api private\n */\n\nTransport.prototype.onOpen = function () {\n  this.readyState = 'open';\n  this.writable = true;\n  this.emit('open');\n};\n\n/**\n * Called with data.\n *\n * @param {String} data\n * @api private\n */\n\nTransport.prototype.onData = function (data) {\n  var packet = parser.decodePacket(data, this.socket.binaryType);\n  this.onPacket(packet);\n};\n\n/**\n * Called with a decoded packet.\n */\n\nTransport.prototype.onPacket = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon close.\n *\n * @api private\n */\n\nTransport.prototype.onClose = function () {\n  this.readyState = 'closed';\n  this.emit('close');\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transport.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/index.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/index.js ***!
+  \***************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/**\n * Module dependencies\n */\n\nvar XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ \"./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js\");\nvar XHR = __webpack_require__(/*! ./polling-xhr */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js\");\nvar JSONP = __webpack_require__(/*! ./polling-jsonp */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js\");\nvar websocket = __webpack_require__(/*! ./websocket */ \"./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js\");\n\n/**\n * Export transports.\n */\n\nexports.polling = polling;\nexports.websocket = websocket;\n\n/**\n * Polling transport polymorphic constructor.\n * Decides on xhr vs jsonp based on feature detection.\n *\n * @api private\n */\n\nfunction polling (opts) {\n  var xhr;\n  var xd = false;\n  var xs = false;\n  var jsonp = false !== opts.jsonp;\n\n  if (typeof location !== 'undefined') {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    xd = opts.hostname !== location.hostname || port !== opts.port;\n    xs = opts.secure !== isSSL;\n  }\n\n  opts.xdomain = xd;\n  opts.xscheme = xs;\n  xhr = new XMLHttpRequest(opts);\n\n  if ('open' in xhr && !opts.forceJSONP) {\n    return new XHR(opts);\n  } else {\n    if (!jsonp) throw new Error('JSONP disabled');\n    return new JSONP(opts);\n  }\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js ***!
+  \***********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/**\n * Module requirements.\n */\n\nvar Polling = __webpack_require__(/*! ./polling */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar globalThis = __webpack_require__(/*! ../globalThis */ \"./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = JSONPPolling;\n\n/**\n * Cached regular expressions.\n */\n\nvar rNewline = /\\n/g;\nvar rEscapedNewline = /\\\\n/g;\n\n/**\n * Global JSONP callbacks.\n */\n\nvar callbacks;\n\n/**\n * Noop.\n */\n\nfunction empty () { }\n\n/**\n * JSONP Polling constructor.\n *\n * @param {Object} opts.\n * @api public\n */\n\nfunction JSONPPolling (opts) {\n  Polling.call(this, opts);\n\n  this.query = this.query || {};\n\n  // define global callbacks array if not present\n  // we do this here (lazily) to avoid unneeded global pollution\n  if (!callbacks) {\n    // we need to consider multiple engines in the same page\n    callbacks = globalThis.___eio = (globalThis.___eio || []);\n  }\n\n  // callback identifier\n  this.index = callbacks.length;\n\n  // add callback to jsonp global\n  var self = this;\n  callbacks.push(function (msg) {\n    self.onData(msg);\n  });\n\n  // append to query string\n  this.query.j = this.index;\n\n  // prevent spurious errors from being emitted when the window is unloaded\n  if (typeof addEventListener === 'function') {\n    addEventListener('beforeunload', function () {\n      if (self.script) self.script.onerror = empty;\n    }, false);\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(JSONPPolling, Polling);\n\n/*\n * JSONP only supports binary as base64 encoded strings\n */\n\nJSONPPolling.prototype.supportsBinary = false;\n\n/**\n * Closes the socket.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doClose = function () {\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  if (this.form) {\n    this.form.parentNode.removeChild(this.form);\n    this.form = null;\n    this.iframe = null;\n  }\n\n  Polling.prototype.doClose.call(this);\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doPoll = function () {\n  var self = this;\n  var script = document.createElement('script');\n\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  script.async = true;\n  script.src = this.uri();\n  script.onerror = function (e) {\n    self.onError('jsonp poll error', e);\n  };\n\n  var insertAt = document.getElementsByTagName('script')[0];\n  if (insertAt) {\n    insertAt.parentNode.insertBefore(script, insertAt);\n  } else {\n    (document.head || document.body).appendChild(script);\n  }\n  this.script = script;\n\n  var isUAgecko = 'undefined' !== typeof navigator && /gecko/i.test(navigator.userAgent);\n\n  if (isUAgecko) {\n    setTimeout(function () {\n      var iframe = document.createElement('iframe');\n      document.body.appendChild(iframe);\n      document.body.removeChild(iframe);\n    }, 100);\n  }\n};\n\n/**\n * Writes with a hidden iframe.\n *\n * @param {String} data to send\n * @param {Function} called upon flush.\n * @api private\n */\n\nJSONPPolling.prototype.doWrite = function (data, fn) {\n  var self = this;\n\n  if (!this.form) {\n    var form = document.createElement('form');\n    var area = document.createElement('textarea');\n    var id = this.iframeId = 'eio_iframe_' + this.index;\n    var iframe;\n\n    form.className = 'socketio';\n    form.style.position = 'absolute';\n    form.style.top = '-1000px';\n    form.style.left = '-1000px';\n    form.target = id;\n    form.method = 'POST';\n    form.setAttribute('accept-charset', 'utf-8');\n    area.name = 'd';\n    form.appendChild(area);\n    document.body.appendChild(form);\n\n    this.form = form;\n    this.area = area;\n  }\n\n  this.form.action = this.uri();\n\n  function complete () {\n    initIframe();\n    fn();\n  }\n\n  function initIframe () {\n    if (self.iframe) {\n      try {\n        self.form.removeChild(self.iframe);\n      } catch (e) {\n        self.onError('jsonp polling iframe removal error', e);\n      }\n    }\n\n    try {\n      // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n      var html = '<iframe src=\"javascript:0\" name=\"' + self.iframeId + '\">';\n      iframe = document.createElement(html);\n    } catch (e) {\n      iframe = document.createElement('iframe');\n      iframe.name = self.iframeId;\n      iframe.src = 'javascript:0';\n    }\n\n    iframe.id = self.iframeId;\n\n    self.form.appendChild(iframe);\n    self.iframe = iframe;\n  }\n\n  initIframe();\n\n  // escape \\n to prevent it from being converted into \\r\\n by some UAs\n  // double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side\n  data = data.replace(rEscapedNewline, '\\\\\\n');\n  this.area.value = data.replace(rNewline, '\\\\n');\n\n  try {\n    this.form.submit();\n  } catch (e) {}\n\n  if (this.iframe.attachEvent) {\n    this.iframe.onreadystatechange = function () {\n      if (self.iframe.readyState === 'complete') {\n        complete();\n      }\n    };\n  } else {\n    this.iframe.onload = complete;\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/polling-jsonp.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js ***!
+  \*********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* global attachEvent */\n\n/**\n * Module requirements.\n */\n\nvar XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ \"./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js\");\nvar Polling = __webpack_require__(/*! ./polling */ \"./jaas-client/node_modules/engine.io-client/lib/transports/polling.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/component-emitter/index.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:polling-xhr');\nvar globalThis = __webpack_require__(/*! ../globalThis */ \"./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = XHR;\nmodule.exports.Request = Request;\n\n/**\n * Empty function\n */\n\nfunction empty () {}\n\n/**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction XHR (opts) {\n  Polling.call(this, opts);\n  this.requestTimeout = opts.requestTimeout;\n  this.extraHeaders = opts.extraHeaders;\n\n  if (typeof location !== 'undefined') {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    this.xd = (typeof location !== 'undefined' && opts.hostname !== location.hostname) ||\n      port !== opts.port;\n    this.xs = opts.secure !== isSSL;\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(XHR, Polling);\n\n/**\n * XHR supports binary\n */\n\nXHR.prototype.supportsBinary = true;\n\n/**\n * Creates a request.\n *\n * @param {String} method\n * @api private\n */\n\nXHR.prototype.request = function (opts) {\n  opts = opts || {};\n  opts.uri = this.uri();\n  opts.xd = this.xd;\n  opts.xs = this.xs;\n  opts.agent = this.agent || false;\n  opts.supportsBinary = this.supportsBinary;\n  opts.enablesXDR = this.enablesXDR;\n  opts.withCredentials = this.withCredentials;\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n  opts.requestTimeout = this.requestTimeout;\n\n  // other options for Node.js client\n  opts.extraHeaders = this.extraHeaders;\n\n  return new Request(opts);\n};\n\n/**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @api private\n */\n\nXHR.prototype.doWrite = function (data, fn) {\n  var isBinary = typeof data !== 'string' && data !== undefined;\n  var req = this.request({ method: 'POST', data: data, isBinary: isBinary });\n  var self = this;\n  req.on('success', fn);\n  req.on('error', function (err) {\n    self.onError('xhr post error', err);\n  });\n  this.sendXhr = req;\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nXHR.prototype.doPoll = function () {\n  debug('xhr poll');\n  var req = this.request();\n  var self = this;\n  req.on('data', function (data) {\n    self.onData(data);\n  });\n  req.on('error', function (err) {\n    self.onError('xhr poll error', err);\n  });\n  this.pollXhr = req;\n};\n\n/**\n * Request constructor\n *\n * @param {Object} options\n * @api public\n */\n\nfunction Request (opts) {\n  this.method = opts.method || 'GET';\n  this.uri = opts.uri;\n  this.xd = !!opts.xd;\n  this.xs = !!opts.xs;\n  this.async = false !== opts.async;\n  this.data = undefined !== opts.data ? opts.data : null;\n  this.agent = opts.agent;\n  this.isBinary = opts.isBinary;\n  this.supportsBinary = opts.supportsBinary;\n  this.enablesXDR = opts.enablesXDR;\n  this.withCredentials = opts.withCredentials;\n  this.requestTimeout = opts.requestTimeout;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n\n  this.create();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Request.prototype);\n\n/**\n * Creates the XHR object and sends the request.\n *\n * @api private\n */\n\nRequest.prototype.create = function () {\n  var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  var xhr = this.xhr = new XMLHttpRequest(opts);\n  var self = this;\n\n  try {\n    debug('xhr open %s: %s', this.method, this.uri);\n    xhr.open(this.method, this.uri, this.async);\n    try {\n      if (this.extraHeaders) {\n        xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n        for (var i in this.extraHeaders) {\n          if (this.extraHeaders.hasOwnProperty(i)) {\n            xhr.setRequestHeader(i, this.extraHeaders[i]);\n          }\n        }\n      }\n    } catch (e) {}\n\n    if ('POST' === this.method) {\n      try {\n        if (this.isBinary) {\n          xhr.setRequestHeader('Content-type', 'application/octet-stream');\n        } else {\n          xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        }\n      } catch (e) {}\n    }\n\n    try {\n      xhr.setRequestHeader('Accept', '*/*');\n    } catch (e) {}\n\n    // ie6 check\n    if ('withCredentials' in xhr) {\n      xhr.withCredentials = this.withCredentials;\n    }\n\n    if (this.requestTimeout) {\n      xhr.timeout = this.requestTimeout;\n    }\n\n    if (this.hasXDR()) {\n      xhr.onload = function () {\n        self.onLoad();\n      };\n      xhr.onerror = function () {\n        self.onError(xhr.responseText);\n      };\n    } else {\n      xhr.onreadystatechange = function () {\n        if (xhr.readyState === 2) {\n          try {\n            var contentType = xhr.getResponseHeader('Content-Type');\n            if (self.supportsBinary && contentType === 'application/octet-stream' || contentType === 'application/octet-stream; charset=UTF-8') {\n              xhr.responseType = 'arraybuffer';\n            }\n          } catch (e) {}\n        }\n        if (4 !== xhr.readyState) return;\n        if (200 === xhr.status || 1223 === xhr.status) {\n          self.onLoad();\n        } else {\n          // make sure the `error` event handler that's user-set\n          // does not throw in the same tick and gets caught here\n          setTimeout(function () {\n            self.onError(typeof xhr.status === 'number' ? xhr.status : 0);\n          }, 0);\n        }\n      };\n    }\n\n    debug('xhr data %s', this.data);\n    xhr.send(this.data);\n  } catch (e) {\n    // Need to defer since .create() is called directly fhrom the constructor\n    // and thus the 'error' event can only be only bound *after* this exception\n    // occurs.  Therefore, also, we cannot throw here at all.\n    setTimeout(function () {\n      self.onError(e);\n    }, 0);\n    return;\n  }\n\n  if (typeof document !== 'undefined') {\n    this.index = Request.requestsCount++;\n    Request.requests[this.index] = this;\n  }\n};\n\n/**\n * Called upon successful response.\n *\n * @api private\n */\n\nRequest.prototype.onSuccess = function () {\n  this.emit('success');\n  this.cleanup();\n};\n\n/**\n * Called if we have data.\n *\n * @api private\n */\n\nRequest.prototype.onData = function (data) {\n  this.emit('data', data);\n  this.onSuccess();\n};\n\n/**\n * Called upon error.\n *\n * @api private\n */\n\nRequest.prototype.onError = function (err) {\n  this.emit('error', err);\n  this.cleanup(true);\n};\n\n/**\n * Cleans up house.\n *\n * @api private\n */\n\nRequest.prototype.cleanup = function (fromError) {\n  if ('undefined' === typeof this.xhr || null === this.xhr) {\n    return;\n  }\n  // xmlhttprequest\n  if (this.hasXDR()) {\n    this.xhr.onload = this.xhr.onerror = empty;\n  } else {\n    this.xhr.onreadystatechange = empty;\n  }\n\n  if (fromError) {\n    try {\n      this.xhr.abort();\n    } catch (e) {}\n  }\n\n  if (typeof document !== 'undefined') {\n    delete Request.requests[this.index];\n  }\n\n  this.xhr = null;\n};\n\n/**\n * Called upon load.\n *\n * @api private\n */\n\nRequest.prototype.onLoad = function () {\n  var data;\n  try {\n    var contentType;\n    try {\n      contentType = this.xhr.getResponseHeader('Content-Type');\n    } catch (e) {}\n    if (contentType === 'application/octet-stream' || contentType === 'application/octet-stream; charset=UTF-8') {\n      data = this.xhr.response || this.xhr.responseText;\n    } else {\n      data = this.xhr.responseText;\n    }\n  } catch (e) {\n    this.onError(e);\n  }\n  if (null != data) {\n    this.onData(data);\n  }\n};\n\n/**\n * Check if it has XDomainRequest.\n *\n * @api private\n */\n\nRequest.prototype.hasXDR = function () {\n  return typeof XDomainRequest !== 'undefined' && !this.xs && this.enablesXDR;\n};\n\n/**\n * Aborts the request.\n *\n * @api public\n */\n\nRequest.prototype.abort = function () {\n  this.cleanup();\n};\n\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\n\nRequest.requestsCount = 0;\nRequest.requests = {};\n\nif (typeof document !== 'undefined') {\n  if (typeof attachEvent === 'function') {\n    attachEvent('onunload', unloadHandler);\n  } else if (typeof addEventListener === 'function') {\n    var terminationEvent = 'onpagehide' in globalThis ? 'pagehide' : 'unload';\n    addEventListener(terminationEvent, unloadHandler, false);\n  }\n}\n\nfunction unloadHandler () {\n  for (var i in Request.requests) {\n    if (Request.requests.hasOwnProperty(i)) {\n      Request.requests[i].abort();\n    }\n  }\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/polling-xhr.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/polling.js":
+/*!*****************************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/polling.js ***!
+  \*****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/**\n * Module dependencies.\n */\n\nvar Transport = __webpack_require__(/*! ../transport */ \"./jaas-client/node_modules/engine.io-client/lib/transport.js\");\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar yeast = __webpack_require__(/*! yeast */ \"./jaas-client/node_modules/yeast/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:polling');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Polling;\n\n/**\n * Is XHR2 supported?\n */\n\nvar hasXHR2 = (function () {\n  var XMLHttpRequest = __webpack_require__(/*! xmlhttprequest-ssl */ \"./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js\");\n  var xhr = new XMLHttpRequest({ xdomain: false });\n  return null != xhr.responseType;\n})();\n\n/**\n * Polling interface.\n *\n * @param {Object} opts\n * @api private\n */\n\nfunction Polling (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (!hasXHR2 || forceBase64) {\n    this.supportsBinary = false;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(Polling, Transport);\n\n/**\n * Transport name.\n */\n\nPolling.prototype.name = 'polling';\n\n/**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @api private\n */\n\nPolling.prototype.doOpen = function () {\n  this.poll();\n};\n\n/**\n * Pauses polling.\n *\n * @param {Function} callback upon buffers are flushed and transport is paused\n * @api private\n */\n\nPolling.prototype.pause = function (onPause) {\n  var self = this;\n\n  this.readyState = 'pausing';\n\n  function pause () {\n    debug('paused');\n    self.readyState = 'paused';\n    onPause();\n  }\n\n  if (this.polling || !this.writable) {\n    var total = 0;\n\n    if (this.polling) {\n      debug('we are currently polling - waiting to pause');\n      total++;\n      this.once('pollComplete', function () {\n        debug('pre-pause polling complete');\n        --total || pause();\n      });\n    }\n\n    if (!this.writable) {\n      debug('we are currently writing - waiting to pause');\n      total++;\n      this.once('drain', function () {\n        debug('pre-pause writing complete');\n        --total || pause();\n      });\n    }\n  } else {\n    pause();\n  }\n};\n\n/**\n * Starts polling cycle.\n *\n * @api public\n */\n\nPolling.prototype.poll = function () {\n  debug('polling');\n  this.polling = true;\n  this.doPoll();\n  this.emit('poll');\n};\n\n/**\n * Overloads onData to detect payloads.\n *\n * @api private\n */\n\nPolling.prototype.onData = function (data) {\n  var self = this;\n  debug('polling got data %s', data);\n  var callback = function (packet, index, total) {\n    // if its the first message we consider the transport open\n    if ('opening' === self.readyState) {\n      self.onOpen();\n    }\n\n    // if its a close packet, we close the ongoing requests\n    if ('close' === packet.type) {\n      self.onClose();\n      return false;\n    }\n\n    // otherwise bypass onData and handle the message\n    self.onPacket(packet);\n  };\n\n  // decode payload\n  parser.decodePayload(data, this.socket.binaryType, callback);\n\n  // if an event did not trigger closing\n  if ('closed' !== this.readyState) {\n    // if we got data we're not polling\n    this.polling = false;\n    this.emit('pollComplete');\n\n    if ('open' === this.readyState) {\n      this.poll();\n    } else {\n      debug('ignoring poll - transport state \"%s\"', this.readyState);\n    }\n  }\n};\n\n/**\n * For polling, send a close packet.\n *\n * @api private\n */\n\nPolling.prototype.doClose = function () {\n  var self = this;\n\n  function close () {\n    debug('writing close packet');\n    self.write([{ type: 'close' }]);\n  }\n\n  if ('open' === this.readyState) {\n    debug('transport open - closing');\n    close();\n  } else {\n    // in case we're trying to close while\n    // handshaking is in progress (GH-164)\n    debug('transport not open - deferring close');\n    this.once('open', close);\n  }\n};\n\n/**\n * Writes a packets payload.\n *\n * @param {Array} data packets\n * @param {Function} drain callback\n * @api private\n */\n\nPolling.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n  var callbackfn = function () {\n    self.writable = true;\n    self.emit('drain');\n  };\n\n  parser.encodePayload(packets, this.supportsBinary, function (data) {\n    self.doWrite(data, callbackfn);\n  });\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nPolling.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'https' : 'http';\n  var port = '';\n\n  // cache busting is forced\n  if (false !== this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  if (!this.supportsBinary && !query.sid) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // avoid port if default for schema\n  if (this.port && (('https' === schema && Number(this.port) !== 443) ||\n     ('http' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/polling.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js":
+/*!*******************************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js ***!
+  \*******************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(Buffer) {/**\n * Module dependencies.\n */\n\nvar Transport = __webpack_require__(/*! ../transport */ \"./jaas-client/node_modules/engine.io-client/lib/transport.js\");\nvar parser = __webpack_require__(/*! engine.io-parser */ \"./jaas-client/node_modules/engine.io-parser/lib/browser.js\");\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\nvar inherit = __webpack_require__(/*! component-inherit */ \"./jaas-client/node_modules/component-inherit/index.js\");\nvar yeast = __webpack_require__(/*! yeast */ \"./jaas-client/node_modules/yeast/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('engine.io-client:websocket');\n\nvar BrowserWebSocket, NodeWebSocket;\n\nif (typeof WebSocket !== 'undefined') {\n  BrowserWebSocket = WebSocket;\n} else if (typeof self !== 'undefined') {\n  BrowserWebSocket = self.WebSocket || self.MozWebSocket;\n}\n\nif (typeof window === 'undefined') {\n  try {\n    NodeWebSocket = __webpack_require__(/*! ws */ 0);\n  } catch (e) { }\n}\n\n/**\n * Get either the `WebSocket` or `MozWebSocket` globals\n * in the browser or try to resolve WebSocket-compatible\n * interface exposed by `ws` for Node-like environment.\n */\n\nvar WebSocketImpl = BrowserWebSocket || NodeWebSocket;\n\n/**\n * Module exports.\n */\n\nmodule.exports = WS;\n\n/**\n * WebSocket transport constructor.\n *\n * @api {Object} connection options\n * @api public\n */\n\nfunction WS (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (forceBase64) {\n    this.supportsBinary = false;\n  }\n  this.perMessageDeflate = opts.perMessageDeflate;\n  this.usingBrowserWebSocket = BrowserWebSocket && !opts.forceNode;\n  this.protocols = opts.protocols;\n  if (!this.usingBrowserWebSocket) {\n    WebSocketImpl = NodeWebSocket;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(WS, Transport);\n\n/**\n * Transport name.\n *\n * @api public\n */\n\nWS.prototype.name = 'websocket';\n\n/*\n * WebSockets support binary\n */\n\nWS.prototype.supportsBinary = true;\n\n/**\n * Opens socket.\n *\n * @api private\n */\n\nWS.prototype.doOpen = function () {\n  if (!this.check()) {\n    // let probe timeout\n    return;\n  }\n\n  var uri = this.uri();\n  var protocols = this.protocols;\n\n  var opts = {};\n\n  if (!this.isReactNative) {\n    opts.agent = this.agent;\n    opts.perMessageDeflate = this.perMessageDeflate;\n\n    // SSL options for Node.js client\n    opts.pfx = this.pfx;\n    opts.key = this.key;\n    opts.passphrase = this.passphrase;\n    opts.cert = this.cert;\n    opts.ca = this.ca;\n    opts.ciphers = this.ciphers;\n    opts.rejectUnauthorized = this.rejectUnauthorized;\n  }\n\n  if (this.extraHeaders) {\n    opts.headers = this.extraHeaders;\n  }\n  if (this.localAddress) {\n    opts.localAddress = this.localAddress;\n  }\n\n  try {\n    this.ws =\n      this.usingBrowserWebSocket && !this.isReactNative\n        ? protocols\n          ? new WebSocketImpl(uri, protocols)\n          : new WebSocketImpl(uri)\n        : new WebSocketImpl(uri, protocols, opts);\n  } catch (err) {\n    return this.emit('error', err);\n  }\n\n  if (this.ws.binaryType === undefined) {\n    this.supportsBinary = false;\n  }\n\n  if (this.ws.supports && this.ws.supports.binary) {\n    this.supportsBinary = true;\n    this.ws.binaryType = 'nodebuffer';\n  } else {\n    this.ws.binaryType = 'arraybuffer';\n  }\n\n  this.addEventListeners();\n};\n\n/**\n * Adds event listeners to the socket\n *\n * @api private\n */\n\nWS.prototype.addEventListeners = function () {\n  var self = this;\n\n  this.ws.onopen = function () {\n    self.onOpen();\n  };\n  this.ws.onclose = function () {\n    self.onClose();\n  };\n  this.ws.onmessage = function (ev) {\n    self.onData(ev.data);\n  };\n  this.ws.onerror = function (e) {\n    self.onError('websocket error', e);\n  };\n};\n\n/**\n * Writes data to socket.\n *\n * @param {Array} array of packets.\n * @api private\n */\n\nWS.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n\n  // encodePacket efficient as it uses WS framing\n  // no need for encodePayload\n  var total = packets.length;\n  for (var i = 0, l = total; i < l; i++) {\n    (function (packet) {\n      parser.encodePacket(packet, self.supportsBinary, function (data) {\n        if (!self.usingBrowserWebSocket) {\n          // always create a new object (GH-437)\n          var opts = {};\n          if (packet.options) {\n            opts.compress = packet.options.compress;\n          }\n\n          if (self.perMessageDeflate) {\n            var len = 'string' === typeof data ? Buffer.byteLength(data) : data.length;\n            if (len < self.perMessageDeflate.threshold) {\n              opts.compress = false;\n            }\n          }\n        }\n\n        // Sometimes the websocket has already been closed but the browser didn't\n        // have a chance of informing us about it yet, in that case send will\n        // throw an error\n        try {\n          if (self.usingBrowserWebSocket) {\n            // TypeError is thrown when passing the second argument on Safari\n            self.ws.send(data);\n          } else {\n            self.ws.send(data, opts);\n          }\n        } catch (e) {\n          debug('websocket closed before onclose event');\n        }\n\n        --total || done();\n      });\n    })(packets[i]);\n  }\n\n  function done () {\n    self.emit('flush');\n\n    // fake drain\n    // defer to next tick to allow Socket to clear writeBuffer\n    setTimeout(function () {\n      self.writable = true;\n      self.emit('drain');\n    }, 0);\n  }\n};\n\n/**\n * Called upon close\n *\n * @api private\n */\n\nWS.prototype.onClose = function () {\n  Transport.prototype.onClose.call(this);\n};\n\n/**\n * Closes socket.\n *\n * @api private\n */\n\nWS.prototype.doClose = function () {\n  if (typeof this.ws !== 'undefined') {\n    this.ws.close();\n  }\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nWS.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'wss' : 'ws';\n  var port = '';\n\n  // avoid port if default for schema\n  if (this.port && (('wss' === schema && Number(this.port) !== 443) ||\n    ('ws' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // append timestamp to URI\n  if (this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  // communicate binary support capabilities\n  if (!this.supportsBinary) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n/**\n * Feature detection for WebSocket.\n *\n * @return {Boolean} whether this transport is available.\n * @api public\n */\n\nWS.prototype.check = function () {\n  return !!WebSocketImpl && !('__initialize' in WebSocketImpl && this.name === WS.prototype.name);\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../node_modules/buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/transports/websocket.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js ***!
+  \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("// browser shim for xmlhttprequest module\n\nvar hasCORS = __webpack_require__(/*! has-cors */ \"./jaas-client/node_modules/has-cors/index.js\");\nvar globalThis = __webpack_require__(/*! ./globalThis */ \"./jaas-client/node_modules/engine.io-client/lib/globalThis.browser.js\");\n\nmodule.exports = function (opts) {\n  var xdomain = opts.xdomain;\n\n  // scheme must be same when usign XDomainRequest\n  // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx\n  var xscheme = opts.xscheme;\n\n  // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.\n  // https://github.com/Automattic/engine.io-client/pull/217\n  var enablesXDR = opts.enablesXDR;\n\n  // XMLHttpRequest can be disabled on IE\n  try {\n    if ('undefined' !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n      return new XMLHttpRequest();\n    }\n  } catch (e) { }\n\n  // Use XDomainRequest for IE8 if enablesXDR is true\n  // because loading bar keeps flashing when using jsonp-polling\n  // https://github.com/yujiosaka/socke.io-ie8-loading-example\n  try {\n    if ('undefined' !== typeof XDomainRequest && !xscheme && enablesXDR) {\n      return new XDomainRequest();\n    }\n  } catch (e) { }\n\n  if (!xdomain) {\n    try {\n      return new globalThis[['Active'].concat('Object').join('X')]('Microsoft.XMLHTTP');\n    } catch (e) { }\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-client/lib/xmlhttprequest.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-parser/lib/browser.js":
+/*!******************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-parser/lib/browser.js ***!
+  \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/**\n * Module dependencies.\n */\n\nvar keys = __webpack_require__(/*! ./keys */ \"./jaas-client/node_modules/engine.io-parser/lib/keys.js\");\nvar hasBinary = __webpack_require__(/*! has-binary2 */ \"./jaas-client/node_modules/has-binary2/index.js\");\nvar sliceBuffer = __webpack_require__(/*! arraybuffer.slice */ \"./jaas-client/node_modules/arraybuffer.slice/index.js\");\nvar after = __webpack_require__(/*! after */ \"./jaas-client/node_modules/after/index.js\");\nvar utf8 = __webpack_require__(/*! ./utf8 */ \"./jaas-client/node_modules/engine.io-parser/lib/utf8.js\");\n\nvar base64encoder;\nif (typeof ArrayBuffer !== 'undefined') {\n  base64encoder = __webpack_require__(/*! base64-arraybuffer */ \"./jaas-client/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js\");\n}\n\n/**\n * Check if we are running an android browser. That requires us to use\n * ArrayBuffer with polling transports...\n *\n * http://ghinda.net/jpeg-blob-ajax-android/\n */\n\nvar isAndroid = typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent);\n\n/**\n * Check if we are running in PhantomJS.\n * Uploading a Blob with PhantomJS does not work correctly, as reported here:\n * https://github.com/ariya/phantomjs/issues/11395\n * @type boolean\n */\nvar isPhantomJS = typeof navigator !== 'undefined' && /PhantomJS/i.test(navigator.userAgent);\n\n/**\n * When true, avoids using Blobs to encode payloads.\n * @type boolean\n */\nvar dontSendBlobs = isAndroid || isPhantomJS;\n\n/**\n * Current protocol version.\n */\n\nexports.protocol = 3;\n\n/**\n * Packet types.\n */\n\nvar packets = exports.packets = {\n    open:     0    // non-ws\n  , close:    1    // non-ws\n  , ping:     2\n  , pong:     3\n  , message:  4\n  , upgrade:  5\n  , noop:     6\n};\n\nvar packetslist = keys(packets);\n\n/**\n * Premade error packet.\n */\n\nvar err = { type: 'error', data: 'parser error' };\n\n/**\n * Create a blob api even for blob builder when vendor prefixes exist\n */\n\nvar Blob = __webpack_require__(/*! blob */ \"./jaas-client/node_modules/blob/index.js\");\n\n/**\n * Encodes a packet.\n *\n *     <packet type id> [ <data> ]\n *\n * Example:\n *\n *     5hello world\n *     3\n *     4\n *\n * Binary is encoded in an identical principle\n *\n * @api private\n */\n\nexports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {\n  if (typeof supportsBinary === 'function') {\n    callback = supportsBinary;\n    supportsBinary = false;\n  }\n\n  if (typeof utf8encode === 'function') {\n    callback = utf8encode;\n    utf8encode = null;\n  }\n\n  var data = (packet.data === undefined)\n    ? undefined\n    : packet.data.buffer || packet.data;\n\n  if (typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) {\n    return encodeArrayBuffer(packet, supportsBinary, callback);\n  } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n    return encodeBlob(packet, supportsBinary, callback);\n  }\n\n  // might be an object with { base64: true, data: dataAsBase64String }\n  if (data && data.base64) {\n    return encodeBase64Object(packet, callback);\n  }\n\n  // Sending data as a utf-8 string\n  var encoded = packets[packet.type];\n\n  // data fragment is optional\n  if (undefined !== packet.data) {\n    encoded += utf8encode ? utf8.encode(String(packet.data), { strict: false }) : String(packet.data);\n  }\n\n  return callback('' + encoded);\n\n};\n\nfunction encodeBase64Object(packet, callback) {\n  // packet data is an object { base64: true, data: dataAsBase64String }\n  var message = 'b' + exports.packets[packet.type] + packet.data.data;\n  return callback(message);\n}\n\n/**\n * Encode packet helpers for binary types\n */\n\nfunction encodeArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var data = packet.data;\n  var contentArray = new Uint8Array(data);\n  var resultBuffer = new Uint8Array(1 + data.byteLength);\n\n  resultBuffer[0] = packets[packet.type];\n  for (var i = 0; i < contentArray.length; i++) {\n    resultBuffer[i+1] = contentArray[i];\n  }\n\n  return callback(resultBuffer.buffer);\n}\n\nfunction encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var fr = new FileReader();\n  fr.onload = function() {\n    exports.encodePacket({ type: packet.type, data: fr.result }, supportsBinary, true, callback);\n  };\n  return fr.readAsArrayBuffer(packet.data);\n}\n\nfunction encodeBlob(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  if (dontSendBlobs) {\n    return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);\n  }\n\n  var length = new Uint8Array(1);\n  length[0] = packets[packet.type];\n  var blob = new Blob([length.buffer, packet.data]);\n\n  return callback(blob);\n}\n\n/**\n * Encodes a packet with binary data in a base64 string\n *\n * @param {Object} packet, has `type` and `data`\n * @return {String} base64 encoded message\n */\n\nexports.encodeBase64Packet = function(packet, callback) {\n  var message = 'b' + exports.packets[packet.type];\n  if (typeof Blob !== 'undefined' && packet.data instanceof Blob) {\n    var fr = new FileReader();\n    fr.onload = function() {\n      var b64 = fr.result.split(',')[1];\n      callback(message + b64);\n    };\n    return fr.readAsDataURL(packet.data);\n  }\n\n  var b64data;\n  try {\n    b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));\n  } catch (e) {\n    // iPhone Safari doesn't let you apply with typed arrays\n    var typed = new Uint8Array(packet.data);\n    var basic = new Array(typed.length);\n    for (var i = 0; i < typed.length; i++) {\n      basic[i] = typed[i];\n    }\n    b64data = String.fromCharCode.apply(null, basic);\n  }\n  message += btoa(b64data);\n  return callback(message);\n};\n\n/**\n * Decodes a packet. Changes format to Blob if requested.\n *\n * @return {Object} with `type` and `data` (if any)\n * @api private\n */\n\nexports.decodePacket = function (data, binaryType, utf8decode) {\n  if (data === undefined) {\n    return err;\n  }\n  // String data\n  if (typeof data === 'string') {\n    if (data.charAt(0) === 'b') {\n      return exports.decodeBase64Packet(data.substr(1), binaryType);\n    }\n\n    if (utf8decode) {\n      data = tryDecode(data);\n      if (data === false) {\n        return err;\n      }\n    }\n    var type = data.charAt(0);\n\n    if (Number(type) != type || !packetslist[type]) {\n      return err;\n    }\n\n    if (data.length > 1) {\n      return { type: packetslist[type], data: data.substring(1) };\n    } else {\n      return { type: packetslist[type] };\n    }\n  }\n\n  var asArray = new Uint8Array(data);\n  var type = asArray[0];\n  var rest = sliceBuffer(data, 1);\n  if (Blob && binaryType === 'blob') {\n    rest = new Blob([rest]);\n  }\n  return { type: packetslist[type], data: rest };\n};\n\nfunction tryDecode(data) {\n  try {\n    data = utf8.decode(data, { strict: false });\n  } catch (e) {\n    return false;\n  }\n  return data;\n}\n\n/**\n * Decodes a packet encoded in a base64 string\n *\n * @param {String} base64 encoded message\n * @return {Object} with `type` and `data` (if any)\n */\n\nexports.decodeBase64Packet = function(msg, binaryType) {\n  var type = packetslist[msg.charAt(0)];\n  if (!base64encoder) {\n    return { type: type, data: { base64: true, data: msg.substr(1) } };\n  }\n\n  var data = base64encoder.decode(msg.substr(1));\n\n  if (binaryType === 'blob' && Blob) {\n    data = new Blob([data]);\n  }\n\n  return { type: type, data: data };\n};\n\n/**\n * Encodes multiple messages (payload).\n *\n *     <length>:data\n *\n * Example:\n *\n *     11:hello world2:hi\n *\n * If any contents are binary, they will be encoded as base64 strings. Base64\n * encoded strings are marked with a b before the length specifier\n *\n * @param {Array} packets\n * @api private\n */\n\nexports.encodePayload = function (packets, supportsBinary, callback) {\n  if (typeof supportsBinary === 'function') {\n    callback = supportsBinary;\n    supportsBinary = null;\n  }\n\n  var isBinary = hasBinary(packets);\n\n  if (supportsBinary && isBinary) {\n    if (Blob && !dontSendBlobs) {\n      return exports.encodePayloadAsBlob(packets, callback);\n    }\n\n    return exports.encodePayloadAsArrayBuffer(packets, callback);\n  }\n\n  if (!packets.length) {\n    return callback('0:');\n  }\n\n  function setLengthHeader(message) {\n    return message.length + ':' + message;\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, !isBinary ? false : supportsBinary, false, function(message) {\n      doneCallback(null, setLengthHeader(message));\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(results.join(''));\n  });\n};\n\n/**\n * Async array map using after\n */\n\nfunction map(ary, each, done) {\n  var result = new Array(ary.length);\n  var next = after(ary.length, done);\n\n  var eachWithIndex = function(i, el, cb) {\n    each(el, function(error, msg) {\n      result[i] = msg;\n      cb(error, result);\n    });\n  };\n\n  for (var i = 0; i < ary.length; i++) {\n    eachWithIndex(i, ary[i], next);\n  }\n}\n\n/*\n * Decodes data when a payload is maybe expected. Possible binary contents are\n * decoded from their base64 representation\n *\n * @param {String} data, callback method\n * @api public\n */\n\nexports.decodePayload = function (data, binaryType, callback) {\n  if (typeof data !== 'string') {\n    return exports.decodePayloadAsBinary(data, binaryType, callback);\n  }\n\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var packet;\n  if (data === '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n  var length = '', n, msg;\n\n  for (var i = 0, l = data.length; i < l; i++) {\n    var chr = data.charAt(i);\n\n    if (chr !== ':') {\n      length += chr;\n      continue;\n    }\n\n    if (length === '' || (length != (n = Number(length)))) {\n      // parser error - ignoring payload\n      return callback(err, 0, 1);\n    }\n\n    msg = data.substr(i + 1, n);\n\n    if (length != msg.length) {\n      // parser error - ignoring payload\n      return callback(err, 0, 1);\n    }\n\n    if (msg.length) {\n      packet = exports.decodePacket(msg, binaryType, false);\n\n      if (err.type === packet.type && err.data === packet.data) {\n        // parser error in individual packet - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      var ret = callback(packet, i + n, l);\n      if (false === ret) return;\n    }\n\n    // advance cursor\n    i += n;\n    length = '';\n  }\n\n  if (length !== '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n};\n\n/**\n * Encodes multiple messages (payload) as binary.\n *\n * <1 = binary, 0 = string><number from 0-9><number from 0-9>[...]<number\n * 255><data>\n *\n * Example:\n * 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers\n *\n * @param {Array} packets\n * @return {ArrayBuffer} encoded payload\n * @api private\n */\n\nexports.encodePayloadAsArrayBuffer = function(packets, callback) {\n  if (!packets.length) {\n    return callback(new ArrayBuffer(0));\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(data) {\n      return doneCallback(null, data);\n    });\n  }\n\n  map(packets, encodeOne, function(err, encodedPackets) {\n    var totalLength = encodedPackets.reduce(function(acc, p) {\n      var len;\n      if (typeof p === 'string'){\n        len = p.length;\n      } else {\n        len = p.byteLength;\n      }\n      return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2\n    }, 0);\n\n    var resultArray = new Uint8Array(totalLength);\n\n    var bufferIndex = 0;\n    encodedPackets.forEach(function(p) {\n      var isString = typeof p === 'string';\n      var ab = p;\n      if (isString) {\n        var view = new Uint8Array(p.length);\n        for (var i = 0; i < p.length; i++) {\n          view[i] = p.charCodeAt(i);\n        }\n        ab = view.buffer;\n      }\n\n      if (isString) { // not true binary\n        resultArray[bufferIndex++] = 0;\n      } else { // true binary\n        resultArray[bufferIndex++] = 1;\n      }\n\n      var lenStr = ab.byteLength.toString();\n      for (var i = 0; i < lenStr.length; i++) {\n        resultArray[bufferIndex++] = parseInt(lenStr[i]);\n      }\n      resultArray[bufferIndex++] = 255;\n\n      var view = new Uint8Array(ab);\n      for (var i = 0; i < view.length; i++) {\n        resultArray[bufferIndex++] = view[i];\n      }\n    });\n\n    return callback(resultArray.buffer);\n  });\n};\n\n/**\n * Encode as Blob\n */\n\nexports.encodePayloadAsBlob = function(packets, callback) {\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(encoded) {\n      var binaryIdentifier = new Uint8Array(1);\n      binaryIdentifier[0] = 1;\n      if (typeof encoded === 'string') {\n        var view = new Uint8Array(encoded.length);\n        for (var i = 0; i < encoded.length; i++) {\n          view[i] = encoded.charCodeAt(i);\n        }\n        encoded = view.buffer;\n        binaryIdentifier[0] = 0;\n      }\n\n      var len = (encoded instanceof ArrayBuffer)\n        ? encoded.byteLength\n        : encoded.size;\n\n      var lenStr = len.toString();\n      var lengthAry = new Uint8Array(lenStr.length + 1);\n      for (var i = 0; i < lenStr.length; i++) {\n        lengthAry[i] = parseInt(lenStr[i]);\n      }\n      lengthAry[lenStr.length] = 255;\n\n      if (Blob) {\n        var blob = new Blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);\n        doneCallback(null, blob);\n      }\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(new Blob(results));\n  });\n};\n\n/*\n * Decodes data when a payload is maybe expected. Strings are decoded by\n * interpreting each byte as a key code for entries marked to start with 0. See\n * description of encodePayloadAsBinary\n *\n * @param {ArrayBuffer} data, callback method\n * @api public\n */\n\nexports.decodePayloadAsBinary = function (data, binaryType, callback) {\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var bufferTail = data;\n  var buffers = [];\n\n  while (bufferTail.byteLength > 0) {\n    var tailArray = new Uint8Array(bufferTail);\n    var isString = tailArray[0] === 0;\n    var msgLength = '';\n\n    for (var i = 1; ; i++) {\n      if (tailArray[i] === 255) break;\n\n      // 310 = char length of Number.MAX_VALUE\n      if (msgLength.length > 310) {\n        return callback(err, 0, 1);\n      }\n\n      msgLength += tailArray[i];\n    }\n\n    bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);\n    msgLength = parseInt(msgLength);\n\n    var msg = sliceBuffer(bufferTail, 0, msgLength);\n    if (isString) {\n      try {\n        msg = String.fromCharCode.apply(null, new Uint8Array(msg));\n      } catch (e) {\n        // iPhone Safari doesn't let you apply to typed arrays\n        var typed = new Uint8Array(msg);\n        msg = '';\n        for (var i = 0; i < typed.length; i++) {\n          msg += String.fromCharCode(typed[i]);\n        }\n      }\n    }\n\n    buffers.push(msg);\n    bufferTail = sliceBuffer(bufferTail, msgLength);\n  }\n\n  var total = buffers.length;\n  buffers.forEach(function(buffer, i) {\n    callback(exports.decodePacket(buffer, binaryType, true), i, total);\n  });\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-parser/lib/browser.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-parser/lib/keys.js":
+/*!***************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-parser/lib/keys.js ***!
+  \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("\n/**\n * Gets the keys for an object.\n *\n * @return {Array} keys\n * @api private\n */\n\nmodule.exports = Object.keys || function keys (obj){\n  var arr = [];\n  var has = Object.prototype.hasOwnProperty;\n\n  for (var i in obj) {\n    if (has.call(obj, i)) {\n      arr.push(i);\n    }\n  }\n  return arr;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-parser/lib/keys.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/engine.io-parser/lib/utf8.js":
+/*!***************************************************************!*\
+  !*** ./jaas-client/node_modules/engine.io-parser/lib/utf8.js ***!
+  \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/*! https://mths.be/utf8js v2.1.2 by @mathias */\n\nvar stringFromCharCode = String.fromCharCode;\n\n// Taken from https://mths.be/punycode\nfunction ucs2decode(string) {\n\tvar output = [];\n\tvar counter = 0;\n\tvar length = string.length;\n\tvar value;\n\tvar extra;\n\twhile (counter < length) {\n\t\tvalue = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// high surrogate, and there is a next character\n\t\t\textra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n// Taken from https://mths.be/punycode\nfunction ucs2encode(array) {\n\tvar length = array.length;\n\tvar index = -1;\n\tvar value;\n\tvar output = '';\n\twhile (++index < length) {\n\t\tvalue = array[index];\n\t\tif (value > 0xFFFF) {\n\t\t\tvalue -= 0x10000;\n\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t}\n\t\toutput += stringFromCharCode(value);\n\t}\n\treturn output;\n}\n\nfunction checkScalarValue(codePoint, strict) {\n\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\tif (strict) {\n\t\t\tthrow Error(\n\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t' is not a scalar value'\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\treturn true;\n}\n/*--------------------------------------------------------------------------*/\n\nfunction createByte(codePoint, shift) {\n\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n}\n\nfunction encodeCodePoint(codePoint, strict) {\n\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\treturn stringFromCharCode(codePoint);\n\t}\n\tvar symbol = '';\n\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t}\n\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\tif (!checkScalarValue(codePoint, strict)) {\n\t\t\tcodePoint = 0xFFFD;\n\t\t}\n\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\tsymbol += createByte(codePoint, 6);\n\t}\n\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\tsymbol += createByte(codePoint, 12);\n\t\tsymbol += createByte(codePoint, 6);\n\t}\n\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\treturn symbol;\n}\n\nfunction utf8encode(string, opts) {\n\topts = opts || {};\n\tvar strict = false !== opts.strict;\n\n\tvar codePoints = ucs2decode(string);\n\tvar length = codePoints.length;\n\tvar index = -1;\n\tvar codePoint;\n\tvar byteString = '';\n\twhile (++index < length) {\n\t\tcodePoint = codePoints[index];\n\t\tbyteString += encodeCodePoint(codePoint, strict);\n\t}\n\treturn byteString;\n}\n\n/*--------------------------------------------------------------------------*/\n\nfunction readContinuationByte() {\n\tif (byteIndex >= byteCount) {\n\t\tthrow Error('Invalid byte index');\n\t}\n\n\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\tbyteIndex++;\n\n\tif ((continuationByte & 0xC0) == 0x80) {\n\t\treturn continuationByte & 0x3F;\n\t}\n\n\t// If we end up here, it’s not a continuation byte\n\tthrow Error('Invalid continuation byte');\n}\n\nfunction decodeSymbol(strict) {\n\tvar byte1;\n\tvar byte2;\n\tvar byte3;\n\tvar byte4;\n\tvar codePoint;\n\n\tif (byteIndex > byteCount) {\n\t\tthrow Error('Invalid byte index');\n\t}\n\n\tif (byteIndex == byteCount) {\n\t\treturn false;\n\t}\n\n\t// Read first byte\n\tbyte1 = byteArray[byteIndex] & 0xFF;\n\tbyteIndex++;\n\n\t// 1-byte sequence (no continuation bytes)\n\tif ((byte1 & 0x80) == 0) {\n\t\treturn byte1;\n\t}\n\n\t// 2-byte sequence\n\tif ((byte1 & 0xE0) == 0xC0) {\n\t\tbyte2 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\tif (codePoint >= 0x80) {\n\t\t\treturn codePoint;\n\t\t} else {\n\t\t\tthrow Error('Invalid continuation byte');\n\t\t}\n\t}\n\n\t// 3-byte sequence (may include unpaired surrogates)\n\tif ((byte1 & 0xF0) == 0xE0) {\n\t\tbyte2 = readContinuationByte();\n\t\tbyte3 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\tif (codePoint >= 0x0800) {\n\t\t\treturn checkScalarValue(codePoint, strict) ? codePoint : 0xFFFD;\n\t\t} else {\n\t\t\tthrow Error('Invalid continuation byte');\n\t\t}\n\t}\n\n\t// 4-byte sequence\n\tif ((byte1 & 0xF8) == 0xF0) {\n\t\tbyte2 = readContinuationByte();\n\t\tbyte3 = readContinuationByte();\n\t\tbyte4 = readContinuationByte();\n\t\tcodePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |\n\t\t\t(byte3 << 0x06) | byte4;\n\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\treturn codePoint;\n\t\t}\n\t}\n\n\tthrow Error('Invalid UTF-8 detected');\n}\n\nvar byteArray;\nvar byteCount;\nvar byteIndex;\nfunction utf8decode(byteString, opts) {\n\topts = opts || {};\n\tvar strict = false !== opts.strict;\n\n\tbyteArray = ucs2decode(byteString);\n\tbyteCount = byteArray.length;\n\tbyteIndex = 0;\n\tvar codePoints = [];\n\tvar tmp;\n\twhile ((tmp = decodeSymbol(strict)) !== false) {\n\t\tcodePoints.push(tmp);\n\t}\n\treturn ucs2encode(codePoints);\n}\n\nmodule.exports = {\n\tversion: '2.1.2',\n\tencode: utf8encode,\n\tdecode: utf8decode\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/engine.io-parser/lib/utf8.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/has-binary2/index.js":
+/*!*******************************************************!*\
+  !*** ./jaas-client/node_modules/has-binary2/index.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(Buffer) {/* global Blob File */\n\n/*\n * Module requirements.\n */\n\nvar isArray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js\");\n\nvar toString = Object.prototype.toString;\nvar withNativeBlob = typeof Blob === 'function' ||\n                        typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]';\nvar withNativeFile = typeof File === 'function' ||\n                        typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]';\n\n/**\n * Module exports.\n */\n\nmodule.exports = hasBinary;\n\n/**\n * Checks for binary data.\n *\n * Supports Buffer, ArrayBuffer, Blob and File.\n *\n * @param {Object} anything\n * @api public\n */\n\nfunction hasBinary (obj) {\n  if (!obj || typeof obj !== 'object') {\n    return false;\n  }\n\n  if (isArray(obj)) {\n    for (var i = 0, l = obj.length; i < l; i++) {\n      if (hasBinary(obj[i])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  if ((typeof Buffer === 'function' && Buffer.isBuffer && Buffer.isBuffer(obj)) ||\n    (typeof ArrayBuffer === 'function' && obj instanceof ArrayBuffer) ||\n    (withNativeBlob && obj instanceof Blob) ||\n    (withNativeFile && obj instanceof File)\n  ) {\n    return true;\n  }\n\n  // see: https://github.com/Automattic/has-binary/pull/4\n  if (obj.toJSON && typeof obj.toJSON === 'function' && arguments.length === 1) {\n    return hasBinary(obj.toJSON(), true);\n  }\n\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/has-binary2/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js ***!
+  \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/has-binary2/node_modules/isarray/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/has-cors/index.js":
+/*!****************************************************!*\
+  !*** ./jaas-client/node_modules/has-cors/index.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("\n/**\n * Module exports.\n *\n * Logic borrowed from Modernizr:\n *\n *   - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n */\n\ntry {\n  module.exports = typeof XMLHttpRequest !== 'undefined' &&\n    'withCredentials' in new XMLHttpRequest();\n} catch (err) {\n  // if XMLHttp support is disabled in IE then it will throw\n  // when trying to create\n  module.exports = false;\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/has-cors/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/history/esm/history.js":
+/*!*********************************************************!*\
+  !*** ./jaas-client/node_modules/history/esm/history.js ***!
+  \*********************************************************/
+/*! exports provided: createBrowserHistory, createHashHistory, createMemoryHistory, createLocation, locationsAreEqual, parsePath, createPath */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createBrowserHistory\", function() { return createBrowserHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createHashHistory\", function() { return createHashHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createMemoryHistory\", function() { return createMemoryHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createLocation\", function() { return createLocation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"locationsAreEqual\", function() { return locationsAreEqual; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parsePath\", function() { return parsePath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createPath\", function() { return createPath; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var resolve_pathname__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! resolve-pathname */ \"./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js\");\n/* harmony import */ var value_equal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! value-equal */ \"./jaas-client/node_modules/value-equal/esm/value-equal.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tiny-invariant */ \"./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js\");\n\n\n\n\n\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path : '/' + path;\n}\nfunction stripLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path.substr(1) : path;\n}\nfunction hasBasename(path, prefix) {\n  return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && '/?#'.indexOf(path.charAt(prefix.length)) !== -1;\n}\nfunction stripBasename(path, prefix) {\n  return hasBasename(path, prefix) ? path.substr(prefix.length) : path;\n}\nfunction stripTrailingSlash(path) {\n  return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;\n}\nfunction parsePath(path) {\n  var pathname = path || '/';\n  var search = '';\n  var hash = '';\n  var hashIndex = pathname.indexOf('#');\n\n  if (hashIndex !== -1) {\n    hash = pathname.substr(hashIndex);\n    pathname = pathname.substr(0, hashIndex);\n  }\n\n  var searchIndex = pathname.indexOf('?');\n\n  if (searchIndex !== -1) {\n    search = pathname.substr(searchIndex);\n    pathname = pathname.substr(0, searchIndex);\n  }\n\n  return {\n    pathname: pathname,\n    search: search === '?' ? '' : search,\n    hash: hash === '#' ? '' : hash\n  };\n}\nfunction createPath(location) {\n  var pathname = location.pathname,\n      search = location.search,\n      hash = location.hash;\n  var path = pathname || '/';\n  if (search && search !== '?') path += search.charAt(0) === '?' ? search : \"?\" + search;\n  if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : \"#\" + hash;\n  return path;\n}\n\nfunction createLocation(path, state, key, currentLocation) {\n  var location;\n\n  if (typeof path === 'string') {\n    // Two-arg form: push(path, state)\n    location = parsePath(path);\n    location.state = state;\n  } else {\n    // One-arg form: push(location)\n    location = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, path);\n    if (location.pathname === undefined) location.pathname = '';\n\n    if (location.search) {\n      if (location.search.charAt(0) !== '?') location.search = '?' + location.search;\n    } else {\n      location.search = '';\n    }\n\n    if (location.hash) {\n      if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;\n    } else {\n      location.hash = '';\n    }\n\n    if (state !== undefined && location.state === undefined) location.state = state;\n  }\n\n  try {\n    location.pathname = decodeURI(location.pathname);\n  } catch (e) {\n    if (e instanceof URIError) {\n      throw new URIError('Pathname \"' + location.pathname + '\" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');\n    } else {\n      throw e;\n    }\n  }\n\n  if (key) location.key = key;\n\n  if (currentLocation) {\n    // Resolve incomplete/relative pathname relative to current location.\n    if (!location.pathname) {\n      location.pathname = currentLocation.pathname;\n    } else if (location.pathname.charAt(0) !== '/') {\n      location.pathname = Object(resolve_pathname__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(location.pathname, currentLocation.pathname);\n    }\n  } else {\n    // When there is no prior location and pathname is empty, set it to /\n    if (!location.pathname) {\n      location.pathname = '/';\n    }\n  }\n\n  return location;\n}\nfunction locationsAreEqual(a, b) {\n  return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && Object(value_equal__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(a.state, b.state);\n}\n\nfunction createTransitionManager() {\n  var prompt = null;\n\n  function setPrompt(nextPrompt) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(prompt == null, 'A history supports only one prompt at a time') : undefined;\n    prompt = nextPrompt;\n    return function () {\n      if (prompt === nextPrompt) prompt = null;\n    };\n  }\n\n  function confirmTransitionTo(location, action, getUserConfirmation, callback) {\n    // TODO: If another transition starts while we're still confirming\n    // the previous one, we may end up in a weird state. Figure out the\n    // best way to handle this.\n    if (prompt != null) {\n      var result = typeof prompt === 'function' ? prompt(location, action) : prompt;\n\n      if (typeof result === 'string') {\n        if (typeof getUserConfirmation === 'function') {\n          getUserConfirmation(result, callback);\n        } else {\n           true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(false, 'A history needs a getUserConfirmation function in order to use a prompt message') : undefined;\n          callback(true);\n        }\n      } else {\n        // Return false from a transition hook to cancel the transition.\n        callback(result !== false);\n      }\n    } else {\n      callback(true);\n    }\n  }\n\n  var listeners = [];\n\n  function appendListener(fn) {\n    var isActive = true;\n\n    function listener() {\n      if (isActive) fn.apply(void 0, arguments);\n    }\n\n    listeners.push(listener);\n    return function () {\n      isActive = false;\n      listeners = listeners.filter(function (item) {\n        return item !== listener;\n      });\n    };\n  }\n\n  function notifyListeners() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    listeners.forEach(function (listener) {\n      return listener.apply(void 0, args);\n    });\n  }\n\n  return {\n    setPrompt: setPrompt,\n    confirmTransitionTo: confirmTransitionTo,\n    appendListener: appendListener,\n    notifyListeners: notifyListeners\n  };\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction getConfirmation(message, callback) {\n  callback(window.confirm(message)); // eslint-disable-line no-alert\n}\n/**\n * Returns true if the HTML5 history API is supported. Taken from Modernizr.\n *\n * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n * changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586\n */\n\nfunction supportsHistory() {\n  var ua = window.navigator.userAgent;\n  if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;\n  return window.history && 'pushState' in window.history;\n}\n/**\n * Returns true if browser fires popstate on hash change.\n * IE10 and IE11 do not.\n */\n\nfunction supportsPopStateOnHashChange() {\n  return window.navigator.userAgent.indexOf('Trident') === -1;\n}\n/**\n * Returns false if using go(n) with hash history causes a full page reload.\n */\n\nfunction supportsGoWithoutReloadUsingHash() {\n  return window.navigator.userAgent.indexOf('Firefox') === -1;\n}\n/**\n * Returns true if a given popstate event is an extraneous WebKit event.\n * Accounts for the fact that Chrome on iOS fires real popstate events\n * containing undefined state when pressing the back button.\n */\n\nfunction isExtraneousPopstateEvent(event) {\n  return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;\n}\n\nvar PopStateEvent = 'popstate';\nvar HashChangeEvent = 'hashchange';\n\nfunction getHistoryState() {\n  try {\n    return window.history.state || {};\n  } catch (e) {\n    // IE 11 sometimes throws when accessing window.history.state\n    // See https://github.com/ReactTraining/history/pull/289\n    return {};\n  }\n}\n/**\n * Creates a history object that uses the HTML5 history API including\n * pushState, replaceState, and the popstate event.\n */\n\n\nfunction createBrowserHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(false, 'Browser history needs a DOM') : undefined : void 0;\n  var globalHistory = window.history;\n  var canUseHistory = supportsHistory();\n  var needsHashChangeListener = !supportsPopStateOnHashChange();\n  var _props = props,\n      _props$forceRefresh = _props.forceRefresh,\n      forceRefresh = _props$forceRefresh === void 0 ? false : _props$forceRefresh,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n\n  function getDOMLocation(historyState) {\n    var _ref = historyState || {},\n        key = _ref.key,\n        state = _ref.state;\n\n    var _window$location = window.location,\n        pathname = _window$location.pathname,\n        search = _window$location.search,\n        hash = _window$location.hash;\n    var path = pathname + search + hash;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : undefined;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path, state, key);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function handlePopState(event) {\n    // Ignore extraneous popstate events in WebKit.\n    if (isExtraneousPopstateEvent(event)) return;\n    handlePop(getDOMLocation(event.state));\n  }\n\n  function handleHashChange() {\n    handlePop(getDOMLocation(getHistoryState()));\n  }\n\n  var forceNextPop = false;\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of keys we've seen in sessionStorage.\n    // Instead, we just default to 0 for keys we don't know.\n\n    var toIndex = allKeys.indexOf(toLocation.key);\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allKeys.indexOf(fromLocation.key);\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  }\n\n  var initialLocation = getDOMLocation(getHistoryState());\n  var allKeys = [initialLocation.key]; // Public interface\n\n  function createHref(location) {\n    return basename + createPath(location);\n  }\n\n  function push(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.pushState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.href = href;\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          var nextKeys = allKeys.slice(0, prevIndex + 1);\n          nextKeys.push(location.key);\n          allKeys = nextKeys;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n         true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history') : undefined;\n        window.location.href = href;\n      }\n    });\n  }\n\n  function replace(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.replaceState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.replace(href);\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          if (prevIndex !== -1) allKeys[prevIndex] = location.key;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n         true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history') : undefined;\n        window.location.replace(href);\n      }\n    });\n  }\n\n  function go(n) {\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.addEventListener(HashChangeEvent, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.removeEventListener(HashChangeEvent, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nvar HashChangeEvent$1 = 'hashchange';\nvar HashPathCoders = {\n  hashbang: {\n    encodePath: function encodePath(path) {\n      return path.charAt(0) === '!' ? path : '!/' + stripLeadingSlash(path);\n    },\n    decodePath: function decodePath(path) {\n      return path.charAt(0) === '!' ? path.substr(1) : path;\n    }\n  },\n  noslash: {\n    encodePath: stripLeadingSlash,\n    decodePath: addLeadingSlash\n  },\n  slash: {\n    encodePath: addLeadingSlash,\n    decodePath: addLeadingSlash\n  }\n};\n\nfunction stripHash(url) {\n  var hashIndex = url.indexOf('#');\n  return hashIndex === -1 ? url : url.slice(0, hashIndex);\n}\n\nfunction getHashPath() {\n  // We can't use window.location.hash here because it's not\n  // consistent across browsers - Firefox will pre-decode it!\n  var href = window.location.href;\n  var hashIndex = href.indexOf('#');\n  return hashIndex === -1 ? '' : href.substring(hashIndex + 1);\n}\n\nfunction pushHashPath(path) {\n  window.location.hash = path;\n}\n\nfunction replaceHashPath(path) {\n  window.location.replace(stripHash(window.location.href) + '#' + path);\n}\n\nfunction createHashHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(false, 'Hash history needs a DOM') : undefined : void 0;\n  var globalHistory = window.history;\n  var canGoWithoutReload = supportsGoWithoutReloadUsingHash();\n  var _props = props,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$hashType = _props.hashType,\n      hashType = _props$hashType === void 0 ? 'slash' : _props$hashType;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n  var _HashPathCoders$hashT = HashPathCoders[hashType],\n      encodePath = _HashPathCoders$hashT.encodePath,\n      decodePath = _HashPathCoders$hashT.decodePath;\n\n  function getDOMLocation() {\n    var path = decodePath(getHashPath());\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : undefined;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  var forceNextPop = false;\n  var ignorePath = null;\n\n  function locationsAreEqual$$1(a, b) {\n    return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash;\n  }\n\n  function handleHashChange() {\n    var path = getHashPath();\n    var encodedPath = encodePath(path);\n\n    if (path !== encodedPath) {\n      // Ensure we always have a properly-encoded hash.\n      replaceHashPath(encodedPath);\n    } else {\n      var location = getDOMLocation();\n      var prevLocation = history.location;\n      if (!forceNextPop && locationsAreEqual$$1(prevLocation, location)) return; // A hashchange doesn't always == location change.\n\n      if (ignorePath === createPath(location)) return; // Ignore this change; we already setState in push/replace.\n\n      ignorePath = null;\n      handlePop(location);\n    }\n  }\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of paths we've seen in sessionStorage.\n    // Instead, we just default to 0 for paths we don't know.\n\n    var toIndex = allPaths.lastIndexOf(createPath(toLocation));\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allPaths.lastIndexOf(createPath(fromLocation));\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  } // Ensure the hash is encoded properly before doing anything else.\n\n\n  var path = getHashPath();\n  var encodedPath = encodePath(path);\n  if (path !== encodedPath) replaceHashPath(encodedPath);\n  var initialLocation = getDOMLocation();\n  var allPaths = [createPath(initialLocation)]; // Public interface\n\n  function createHref(location) {\n    var baseTag = document.querySelector('base');\n    var href = '';\n\n    if (baseTag && baseTag.getAttribute('href')) {\n      href = stripHash(window.location.href);\n    }\n\n    return href + '#' + encodePath(basename + createPath(location));\n  }\n\n  function push(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Hash history cannot push state; it is ignored') : undefined;\n    var action = 'PUSH';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a PUSH, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        pushHashPath(encodedPath);\n        var prevIndex = allPaths.lastIndexOf(createPath(history.location));\n        var nextPaths = allPaths.slice(0, prevIndex + 1);\n        nextPaths.push(path);\n        allPaths = nextPaths;\n        setState({\n          action: action,\n          location: location\n        });\n      } else {\n         true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack') : undefined;\n        setState();\n      }\n    });\n  }\n\n  function replace(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state === undefined, 'Hash history cannot replace state; it is ignored') : undefined;\n    var action = 'REPLACE';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a REPLACE, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        replaceHashPath(encodedPath);\n      }\n\n      var prevIndex = allPaths.indexOf(createPath(history.location));\n      if (prevIndex !== -1) allPaths[prevIndex] = path;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser') : undefined;\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(HashChangeEvent$1, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(HashChangeEvent$1, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nfunction clamp(n, lowerBound, upperBound) {\n  return Math.min(Math.max(n, lowerBound), upperBound);\n}\n/**\n * Creates a history object that stores locations in memory.\n */\n\n\nfunction createMemoryHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  var _props = props,\n      getUserConfirmation = _props.getUserConfirmation,\n      _props$initialEntries = _props.initialEntries,\n      initialEntries = _props$initialEntries === void 0 ? ['/'] : _props$initialEntries,\n      _props$initialIndex = _props.initialIndex,\n      initialIndex = _props$initialIndex === void 0 ? 0 : _props$initialIndex,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(history, nextState);\n\n    history.length = history.entries.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var index = clamp(initialIndex, 0, initialEntries.length - 1);\n  var entries = initialEntries.map(function (entry) {\n    return typeof entry === 'string' ? createLocation(entry, undefined, createKey()) : createLocation(entry, undefined, entry.key || createKey());\n  }); // Public interface\n\n  var createHref = createPath;\n\n  function push(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var prevIndex = history.index;\n      var nextIndex = prevIndex + 1;\n      var nextEntries = history.entries.slice(0);\n\n      if (nextEntries.length > nextIndex) {\n        nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);\n      } else {\n        nextEntries.push(location);\n      }\n\n      setState({\n        action: action,\n        location: location,\n        index: nextIndex,\n        entries: nextEntries\n      });\n    });\n  }\n\n  function replace(path, state) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : undefined;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      history.entries[history.index] = location;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n    var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);\n    var action = 'POP';\n    var location = history.entries[nextIndex];\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (ok) {\n        setState({\n          action: action,\n          location: location,\n          index: nextIndex\n        });\n      } else {\n        // Mimic the behavior of DOM histories by\n        // causing a render after a cancelled POP.\n        setState();\n      }\n    });\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  function canGo(n) {\n    var nextIndex = history.index + n;\n    return nextIndex >= 0 && nextIndex < history.entries.length;\n  }\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    return transitionManager.setPrompt(prompt);\n  }\n\n  function listen(listener) {\n    return transitionManager.appendListener(listener);\n  }\n\n  var history = {\n    length: entries.length,\n    action: 'POP',\n    location: entries[index],\n    index: index,\n    entries: entries,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    canGo: canGo,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/history/esm/history.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js":
+/*!**********************************************************************************************!*\
+  !*** ./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js ***!
+  \**********************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar reactIs = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n  childContextTypes: true,\n  contextType: true,\n  contextTypes: true,\n  defaultProps: true,\n  displayName: true,\n  getDefaultProps: true,\n  getDerivedStateFromError: true,\n  getDerivedStateFromProps: true,\n  mixins: true,\n  propTypes: true,\n  type: true\n};\nvar KNOWN_STATICS = {\n  name: true,\n  length: true,\n  prototype: true,\n  caller: true,\n  callee: true,\n  arguments: true,\n  arity: true\n};\nvar FORWARD_REF_STATICS = {\n  '$$typeof': true,\n  render: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true\n};\nvar MEMO_STATICS = {\n  '$$typeof': true,\n  compare: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true,\n  type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n  // React v16.11 and below\n  if (reactIs.isMemo(component)) {\n    return MEMO_STATICS;\n  } // React v16.12 and above\n\n\n  return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n  if (typeof sourceComponent !== 'string') {\n    // don't hoist over string (html) components\n    if (objectPrototype) {\n      var inheritedComponent = getPrototypeOf(sourceComponent);\n\n      if (inheritedComponent && inheritedComponent !== objectPrototype) {\n        hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n      }\n    }\n\n    var keys = getOwnPropertyNames(sourceComponent);\n\n    if (getOwnPropertySymbols) {\n      keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n    }\n\n    var targetStatics = getStatics(targetComponent);\n    var sourceStatics = getStatics(sourceComponent);\n\n    for (var i = 0; i < keys.length; ++i) {\n      var key = keys[i];\n\n      if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n        var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n        try {\n          // Avoid failures from read-only properties\n          defineProperty(targetComponent, key, descriptor);\n        } catch (e) {}\n      }\n    }\n  }\n\n  return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/hyphenate-style-name/index.js":
+/*!****************************************************************!*\
+  !*** ./jaas-client/node_modules/hyphenate-style-name/index.js ***!
+  \****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* eslint-disable no-var, prefer-template */\nvar uppercasePattern = /[A-Z]/g\nvar msPattern = /^ms-/\nvar cache = {}\n\nfunction toHyphenLower(match) {\n  return '-' + match.toLowerCase()\n}\n\nfunction hyphenateStyleName(name) {\n  if (cache.hasOwnProperty(name)) {\n    return cache[name]\n  }\n\n  var hName = name.replace(uppercasePattern, toHyphenLower)\n  return (cache[name] = msPattern.test(hName) ? '-' + hName : hName)\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (hyphenateStyleName);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/hyphenate-style-name/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/indexof/index.js":
+/*!***************************************************!*\
+  !*** ./jaas-client/node_modules/indexof/index.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("\nvar indexOf = [].indexOf;\n\nmodule.exports = function(arr, obj){\n  if (indexOf) return arr.indexOf(obj);\n  for (var i = 0; i < arr.length; ++i) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n};\n\n//# sourceURL=webpack:///./jaas-client/node_modules/indexof/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/is-in-browser/dist/module.js":
+/*!***************************************************************!*\
+  !*** ./jaas-client/node_modules/is-in-browser/dist/module.js ***!
+  \***************************************************************/
+/*! exports provided: isBrowser, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isBrowser\", function() { return isBrowser; });\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar isBrowser = (typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\" && (typeof document === \"undefined\" ? \"undefined\" : _typeof(document)) === 'object' && document.nodeType === 9;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (isBrowser);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/is-in-browser/dist/module.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/isarray/index.js":
+/*!***************************************************!*\
+  !*** ./jaas-client/node_modules/isarray/index.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/isarray/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js":
+/*!******************************************************************************************!*\
+  !*** ./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js ***!
+  \******************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var hyphenate_style_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hyphenate-style-name */ \"./jaas-client/node_modules/hyphenate-style-name/index.js\");\n\n\n/**\n * Convert camel cased property names to dash separated.\n *\n * @param {Object} style\n * @return {Object}\n */\n\nfunction convertCase(style) {\n  var converted = {};\n\n  for (var prop in style) {\n    var key = prop.indexOf('--') === 0 ? prop : Object(hyphenate_style_name__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(prop);\n    converted[key] = style[prop];\n  }\n\n  if (style.fallbacks) {\n    if (Array.isArray(style.fallbacks)) converted.fallbacks = style.fallbacks.map(convertCase);else converted.fallbacks = convertCase(style.fallbacks);\n  }\n\n  return converted;\n}\n/**\n * Allow camel cased property names by converting them back to dasherized.\n *\n * @param {Rule} rule\n */\n\n\nfunction camelCase() {\n  function onProcessStyle(style) {\n    if (Array.isArray(style)) {\n      // Handle rules like @font-face, which can have multiple styles in an array\n      for (var index = 0; index < style.length; index++) {\n        style[index] = convertCase(style[index]);\n      }\n\n      return style;\n    }\n\n    return convertCase(style);\n  }\n\n  function onChangeValue(value, prop, rule) {\n    if (prop.indexOf('--') === 0) {\n      return value;\n    }\n\n    var hyphenatedProp = Object(hyphenate_style_name__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(prop); // There was no camel case in place\n\n    if (prop === hyphenatedProp) return value;\n    rule.prop(hyphenatedProp, value); // Core will ignore that property value we set the proper one above.\n\n    return null;\n  }\n\n  return {\n    onProcessStyle: onProcessStyle,\n    onChangeValue: onChangeValue\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (camelCase);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-camel-case/dist/jss-plugin-camel-case.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js":
+/*!**********************************************************************************************!*\
+  !*** ./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js ***!
+  \**********************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\nvar px = jss__WEBPACK_IMPORTED_MODULE_0__[\"hasCSSTOMSupport\"] && CSS ? CSS.px : 'px';\nvar ms = jss__WEBPACK_IMPORTED_MODULE_0__[\"hasCSSTOMSupport\"] && CSS ? CSS.ms : 'ms';\nvar percent = jss__WEBPACK_IMPORTED_MODULE_0__[\"hasCSSTOMSupport\"] && CSS ? CSS.percent : '%';\n/**\n * Generated jss-plugin-default-unit CSS property units\n *\n * @type object\n */\n\nvar defaultUnits = {\n  // Animation properties\n  'animation-delay': ms,\n  'animation-duration': ms,\n  // Background properties\n  'background-position': px,\n  'background-position-x': px,\n  'background-position-y': px,\n  'background-size': px,\n  // Border Properties\n  border: px,\n  'border-bottom': px,\n  'border-bottom-left-radius': px,\n  'border-bottom-right-radius': px,\n  'border-bottom-width': px,\n  'border-left': px,\n  'border-left-width': px,\n  'border-radius': px,\n  'border-right': px,\n  'border-right-width': px,\n  'border-top': px,\n  'border-top-left-radius': px,\n  'border-top-right-radius': px,\n  'border-top-width': px,\n  'border-width': px,\n  // Margin properties\n  margin: px,\n  'margin-bottom': px,\n  'margin-left': px,\n  'margin-right': px,\n  'margin-top': px,\n  // Padding properties\n  padding: px,\n  'padding-bottom': px,\n  'padding-left': px,\n  'padding-right': px,\n  'padding-top': px,\n  // Mask properties\n  'mask-position-x': px,\n  'mask-position-y': px,\n  'mask-size': px,\n  // Width and height properties\n  height: px,\n  width: px,\n  'min-height': px,\n  'max-height': px,\n  'min-width': px,\n  'max-width': px,\n  // Position properties\n  bottom: px,\n  left: px,\n  top: px,\n  right: px,\n  // Shadow properties\n  'box-shadow': px,\n  'text-shadow': px,\n  // Column properties\n  'column-gap': px,\n  'column-rule': px,\n  'column-rule-width': px,\n  'column-width': px,\n  // Font and text properties\n  'font-size': px,\n  'font-size-delta': px,\n  'letter-spacing': px,\n  'text-indent': px,\n  'text-stroke': px,\n  'text-stroke-width': px,\n  'word-spacing': px,\n  // Motion properties\n  motion: px,\n  'motion-offset': px,\n  // Outline properties\n  outline: px,\n  'outline-offset': px,\n  'outline-width': px,\n  // Perspective properties\n  perspective: px,\n  'perspective-origin-x': percent,\n  'perspective-origin-y': percent,\n  // Transform properties\n  'transform-origin': percent,\n  'transform-origin-x': percent,\n  'transform-origin-y': percent,\n  'transform-origin-z': percent,\n  // Transition properties\n  'transition-delay': ms,\n  'transition-duration': ms,\n  // Alignment properties\n  'vertical-align': px,\n  'flex-basis': px,\n  // Some random properties\n  'shape-margin': px,\n  size: px,\n  // Grid properties\n  grid: px,\n  'grid-gap': px,\n  'grid-row-gap': px,\n  'grid-column-gap': px,\n  'grid-template-rows': px,\n  'grid-template-columns': px,\n  'grid-auto-rows': px,\n  'grid-auto-columns': px,\n  // Not existing properties.\n  // Used to avoid issues with jss-plugin-expand integration.\n  'box-shadow-x': px,\n  'box-shadow-y': px,\n  'box-shadow-blur': px,\n  'box-shadow-spread': px,\n  'font-line-height': px,\n  'text-shadow-x': px,\n  'text-shadow-y': px,\n  'text-shadow-blur': px\n};\n\n/**\n * Clones the object and adds a camel cased property version.\n */\nfunction addCamelCasedVersion(obj) {\n  var regExp = /(-[a-z])/g;\n\n  var replace = function replace(str) {\n    return str[1].toUpperCase();\n  };\n\n  var newObj = {};\n\n  for (var _key in obj) {\n    newObj[_key] = obj[_key];\n    newObj[_key.replace(regExp, replace)] = obj[_key];\n  }\n\n  return newObj;\n}\n\nvar units = addCamelCasedVersion(defaultUnits);\n/**\n * Recursive deep style passing function\n */\n\nfunction iterate(prop, value, options) {\n  if (!value) return value;\n\n  if (Array.isArray(value)) {\n    for (var i = 0; i < value.length; i++) {\n      value[i] = iterate(prop, value[i], options);\n    }\n  } else if (typeof value === 'object') {\n    if (prop === 'fallbacks') {\n      for (var innerProp in value) {\n        value[innerProp] = iterate(innerProp, value[innerProp], options);\n      }\n    } else {\n      for (var _innerProp in value) {\n        value[_innerProp] = iterate(prop + \"-\" + _innerProp, value[_innerProp], options);\n      }\n    }\n  } else if (typeof value === 'number') {\n    var unit = options[prop] || units[prop];\n\n    if (unit) {\n      return typeof unit === 'function' ? unit(value).toString() : \"\" + value + unit;\n    }\n\n    return value.toString();\n  }\n\n  return value;\n}\n/**\n * Add unit to numeric values.\n */\n\n\nfunction defaultUnit(options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var camelCasedOptions = addCamelCasedVersion(options);\n\n  function onProcessStyle(style, rule) {\n    if (rule.type !== 'style') return style;\n\n    for (var prop in style) {\n      style[prop] = iterate(prop, style[prop], camelCasedOptions);\n    }\n\n    return style;\n  }\n\n  function onChangeValue(value, prop) {\n    return iterate(prop, value, camelCasedOptions);\n  }\n\n  return {\n    onProcessStyle: onProcessStyle,\n    onChangeValue: onChangeValue\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (defaultUnit);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-default-unit/dist/jss-plugin-default-unit.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\n\nvar at = '@global';\nvar atPrefix = '@global ';\n\nvar GlobalContainerRule =\n/*#__PURE__*/\nfunction () {\n  function GlobalContainerRule(key, styles, options) {\n    this.type = 'global';\n    this.at = at;\n    this.rules = void 0;\n    this.options = void 0;\n    this.key = void 0;\n    this.isProcessed = false;\n    this.key = key;\n    this.options = options;\n    this.rules = new jss__WEBPACK_IMPORTED_MODULE_1__[\"RuleList\"](Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n\n    for (var selector in styles) {\n      this.rules.add(selector, styles[selector]);\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Get a rule.\n   */\n\n\n  var _proto = GlobalContainerRule.prototype;\n\n  _proto.getRule = function getRule(name) {\n    return this.rules.get(name);\n  }\n  /**\n   * Create and register rule, run plugins.\n   */\n  ;\n\n  _proto.addRule = function addRule(name, style, options) {\n    var rule = this.rules.add(name, style, options);\n    this.options.jss.plugins.onProcessRule(rule);\n    return rule;\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.rules.indexOf(rule);\n  }\n  /**\n   * Generates a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString() {\n    return this.rules.toString();\n  };\n\n  return GlobalContainerRule;\n}();\n\nvar GlobalPrefixedRule =\n/*#__PURE__*/\nfunction () {\n  function GlobalPrefixedRule(key, style, options) {\n    this.type = 'global';\n    this.at = at;\n    this.options = void 0;\n    this.rule = void 0;\n    this.isProcessed = false;\n    this.key = void 0;\n    this.key = key;\n    this.options = options;\n    var selector = key.substr(atPrefix.length);\n    this.rule = options.jss.createRule(selector, style, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n  }\n\n  var _proto2 = GlobalPrefixedRule.prototype;\n\n  _proto2.toString = function toString(options) {\n    return this.rule ? this.rule.toString(options) : '';\n  };\n\n  return GlobalPrefixedRule;\n}();\n\nvar separatorRegExp = /\\s*,\\s*/g;\n\nfunction addScope(selector, scope) {\n  var parts = selector.split(separatorRegExp);\n  var scoped = '';\n\n  for (var i = 0; i < parts.length; i++) {\n    scoped += scope + \" \" + parts[i].trim();\n    if (parts[i + 1]) scoped += ', ';\n  }\n\n  return scoped;\n}\n\nfunction handleNestedGlobalContainerRule(rule) {\n  var options = rule.options,\n      style = rule.style;\n  var rules = style ? style[at] : null;\n  if (!rules) return;\n\n  for (var name in rules) {\n    options.sheet.addRule(name, rules[name], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      selector: addScope(name, rule.selector)\n    }));\n  }\n\n  delete style[at];\n}\n\nfunction handlePrefixedGlobalRule(rule) {\n  var options = rule.options,\n      style = rule.style;\n\n  for (var prop in style) {\n    if (prop[0] !== '@' || prop.substr(0, at.length) !== at) continue;\n    var selector = addScope(prop.substr(at.length), rule.selector);\n    options.sheet.addRule(selector, style[prop], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      selector: selector\n    }));\n    delete style[prop];\n  }\n}\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\n\n\nfunction jssGlobal() {\n  function onCreateRule(name, styles, options) {\n    if (!name) return null;\n\n    if (name === at) {\n      return new GlobalContainerRule(name, styles, options);\n    }\n\n    if (name[0] === '@' && name.substr(0, atPrefix.length) === atPrefix) {\n      return new GlobalPrefixedRule(name, styles, options);\n    }\n\n    var parent = options.parent;\n\n    if (parent) {\n      if (parent.type === 'global' || parent.options.parent && parent.options.parent.type === 'global') {\n        options.scoped = false;\n      }\n    }\n\n    if (options.scoped === false) {\n      options.selector = name;\n    }\n\n    return null;\n  }\n\n  function onProcessRule(rule) {\n    if (rule.type !== 'style') return;\n    handleNestedGlobalContainerRule(rule);\n    handlePrefixedGlobalRule(rule);\n  }\n\n  return {\n    onCreateRule: onCreateRule,\n    onProcessRule: onProcessRule\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssGlobal);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-global/dist/jss-plugin-global.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n\n\n\nvar separatorRegExp = /\\s*,\\s*/g;\nvar parentRegExp = /&/g;\nvar refRegExp = /\\$([\\w-]+)/g;\n/**\n * Convert nested rules to separate, remove them from original styles.\n *\n * @param {Rule} rule\n * @api public\n */\n\nfunction jssNested() {\n  // Get a function to be used for $ref replacement.\n  function getReplaceRef(container, sheet) {\n    return function (match, key) {\n      var rule = container.getRule(key) || sheet && sheet.getRule(key);\n\n      if (rule) {\n        rule = rule;\n        return rule.selector;\n      }\n\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(false, \"[JSS] Could not find the referenced rule \\\"\" + key + \"\\\" in \\\"\" + (container.options.meta || container.toString()) + \"\\\".\") : undefined;\n      return key;\n    };\n  }\n\n  function replaceParentRefs(nestedProp, parentProp) {\n    var parentSelectors = parentProp.split(separatorRegExp);\n    var nestedSelectors = nestedProp.split(separatorRegExp);\n    var result = '';\n\n    for (var i = 0; i < parentSelectors.length; i++) {\n      var parent = parentSelectors[i];\n\n      for (var j = 0; j < nestedSelectors.length; j++) {\n        var nested = nestedSelectors[j];\n        if (result) result += ', '; // Replace all & by the parent or prefix & with the parent.\n\n        result += nested.indexOf('&') !== -1 ? nested.replace(parentRegExp, parent) : parent + \" \" + nested;\n      }\n    }\n\n    return result;\n  }\n\n  function getOptions(rule, container, prevOptions) {\n    // Options has been already created, now we only increase index.\n    if (prevOptions) return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, prevOptions, {\n      index: prevOptions.index + 1\n    });\n    var nestingLevel = rule.options.nestingLevel;\n    nestingLevel = nestingLevel === undefined ? 1 : nestingLevel + 1;\n\n    var options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, rule.options, {\n      nestingLevel: nestingLevel,\n      index: container.indexOf(rule) + 1 // We don't need the parent name to be set options for chlid.\n\n    });\n\n    delete options.name;\n    return options;\n  }\n\n  function onProcessStyle(style, rule, sheet) {\n    if (rule.type !== 'style') return style;\n    var styleRule = rule;\n    var container = styleRule.options.parent;\n    var options;\n    var replaceRef;\n\n    for (var prop in style) {\n      var isNested = prop.indexOf('&') !== -1;\n      var isNestedConditional = prop[0] === '@';\n      if (!isNested && !isNestedConditional) continue;\n      options = getOptions(styleRule, container, options);\n\n      if (isNested) {\n        var selector = replaceParentRefs(prop, styleRule.selector); // Lazily create the ref replacer function just once for\n        // all nested rules within the sheet.\n\n        if (!replaceRef) replaceRef = getReplaceRef(container, sheet); // Replace all $refs.\n\n        selector = selector.replace(refRegExp, replaceRef);\n        container.addRule(selector, style[prop], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n          selector: selector\n        }));\n      } else if (isNestedConditional) {\n        // Place conditional right after the parent rule to ensure right ordering.\n        container.addRule(prop, {}, options) // Flow expects more options but they aren't required\n        // And flow doesn't know this will always be a StyleRule which has the addRule method\n        // $FlowFixMe\n        .addRule(styleRule.key, style[prop], {\n          selector: styleRule.selector\n        });\n      }\n\n      delete style[prop];\n    }\n\n    return style;\n  }\n\n  return {\n    onProcessStyle: onProcessStyle\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssNested);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-nested/dist/jss-plugin-nested.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js":
+/*!******************************************************************************************!*\
+  !*** ./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js ***!
+  \******************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/**\n * Sort props by length.\n */\nfunction jssPropsSort() {\n  var sort = function sort(prop0, prop1) {\n    if (prop0.length === prop1.length) {\n      return prop0 > prop1 ? 1 : -1;\n    }\n\n    return prop0.length - prop1.length;\n  };\n\n  return {\n    onProcessStyle: function onProcessStyle(style, rule) {\n      if (rule.type !== 'style') return style;\n      var newStyle = {};\n      var props = Object.keys(style).sort(sort);\n\n      for (var i = 0; i < props.length; i++) {\n        newStyle[props[i]] = style[props[i]];\n      }\n\n      return newStyle;\n    }\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssPropsSort);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-props-sort/dist/jss-plugin-props-sort.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js":
+/*!************************************************************************************************************!*\
+  !*** ./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js ***!
+  \************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\n\nvar now = Date.now();\nvar fnValuesNs = \"fnValues\" + now;\nvar fnRuleNs = \"fnStyle\" + ++now;\nfunction functionPlugin() {\n  return {\n    onCreateRule: function onCreateRule(name, decl, options) {\n      if (typeof decl !== 'function') return null;\n      var rule = Object(jss__WEBPACK_IMPORTED_MODULE_1__[\"createRule\"])(name, {}, options);\n      rule[fnRuleNs] = decl;\n      return rule;\n    },\n    onProcessStyle: function onProcessStyle(style, rule) {\n      // We need to extract function values from the declaration, so that we can keep core unaware of them.\n      // We need to do that only once.\n      // We don't need to extract functions on each style update, since this can happen only once.\n      // We don't support function values inside of function rules.\n      if (fnValuesNs in rule || fnRuleNs in rule) return style;\n      var fnValues = {};\n\n      for (var prop in style) {\n        var value = style[prop];\n        if (typeof value !== 'function') continue;\n        delete style[prop];\n        fnValues[prop] = value;\n      } // $FlowFixMe\n\n\n      rule[fnValuesNs] = fnValues;\n      return style;\n    },\n    onUpdate: function onUpdate(data, rule, sheet, options) {\n      var styleRule = rule;\n      var fnRule = styleRule[fnRuleNs]; // If we have a style function, the entire rule is dynamic and style object\n      // will be returned from that function.\n\n      if (fnRule) {\n        // Empty object will remove all currently defined props\n        // in case function rule returns a falsy value.\n        styleRule.style = fnRule(data) || {};\n\n        if (true) {\n          for (var prop in styleRule.style) {\n            if (typeof styleRule.style[prop] === 'function') {\n               true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(false, '[JSS] Function values inside function rules are not supported.') : undefined;\n              break;\n            }\n          }\n        }\n      }\n\n      var fnValues = styleRule[fnValuesNs]; // If we have a fn values map, it is a rule with function values.\n\n      if (fnValues) {\n        for (var _prop in fnValues) {\n          styleRule.prop(_prop, fnValues[_prop](data), options);\n        }\n      }\n    }\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (functionPlugin);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-rule-value-function/dist/jss-plugin-rule-value-function.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js":
+/*!****************************************************************************************************!*\
+  !*** ./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js ***!
+  \****************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var css_vendor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! css-vendor */ \"./jaas-client/node_modules/css-vendor/dist/css-vendor.esm.js\");\n/* harmony import */ var jss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jss */ \"./jaas-client/node_modules/jss/dist/jss.esm.js\");\n\n\n\n/**\n * Add vendor prefix to a property name when needed.\n *\n * @api public\n */\n\nfunction jssVendorPrefixer() {\n  function onProcessRule(rule) {\n    if (rule.type === 'keyframes') {\n      var atRule = rule;\n      atRule.at = Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedKeyframes\"])(atRule.at);\n    }\n  }\n\n  function prefixStyle(style) {\n    for (var prop in style) {\n      var value = style[prop];\n\n      if (prop === 'fallbacks' && Array.isArray(value)) {\n        style[prop] = value.map(prefixStyle);\n        continue;\n      }\n\n      var changeProp = false;\n      var supportedProp = Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedProperty\"])(prop);\n      if (supportedProp && supportedProp !== prop) changeProp = true;\n      var changeValue = false;\n      var supportedValue$1 = Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedValue\"])(supportedProp, Object(jss__WEBPACK_IMPORTED_MODULE_1__[\"toCssValue\"])(value));\n      if (supportedValue$1 && supportedValue$1 !== value) changeValue = true;\n\n      if (changeProp || changeValue) {\n        if (changeProp) delete style[prop];\n        style[supportedProp || prop] = supportedValue$1 || value;\n      }\n    }\n\n    return style;\n  }\n\n  function onProcessStyle(style, rule) {\n    if (rule.type !== 'style') return style;\n    return prefixStyle(style);\n  }\n\n  function onChangeValue(value, prop) {\n    return Object(css_vendor__WEBPACK_IMPORTED_MODULE_0__[\"supportedValue\"])(prop, Object(jss__WEBPACK_IMPORTED_MODULE_1__[\"toCssValue\"])(value)) || value;\n  }\n\n  return {\n    onProcessRule: onProcessRule,\n    onProcessStyle: onProcessStyle,\n    onChangeValue: onChangeValue\n  };\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (jssVendorPrefixer);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss-plugin-vendor-prefixer/dist/jss-plugin-vendor-prefixer.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/jss/dist/jss.esm.js":
+/*!******************************************************!*\
+  !*** ./jaas-client/node_modules/jss/dist/jss.esm.js ***!
+  \******************************************************/
+/*! exports provided: default, RuleList, SheetsManager, SheetsRegistry, create, createGenerateId, createRule, getDynamicStyles, hasCSSTOMSupport, sheets, toCssValue */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RuleList\", function() { return RuleList; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SheetsManager\", function() { return SheetsManager; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SheetsRegistry\", function() { return SheetsRegistry; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"create\", function() { return create; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createGenerateId\", function() { return createGenerateId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createRule\", function() { return createRule; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getDynamicStyles\", function() { return getDynamicStyles; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hasCSSTOMSupport\", function() { return hasCSSTOMSupport; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"sheets\", function() { return sheets; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"toCssValue\", function() { return toCssValue; });\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var is_in_browser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! is-in-browser */ \"./jaas-client/node_modules/is-in-browser/dist/module.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/assertThisInitialized */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n\n\n\n\n\n\n\n\nvar plainObjectConstrurctor = {}.constructor;\nfunction cloneStyle(style) {\n  if (style == null || typeof style !== 'object') return style;\n  if (Array.isArray(style)) return style.map(cloneStyle);\n  if (style.constructor !== plainObjectConstrurctor) return style;\n  var newStyle = {};\n\n  for (var name in style) {\n    newStyle[name] = cloneStyle(style[name]);\n  }\n\n  return newStyle;\n}\n\n/**\n * Create a rule instance.\n */\n\nfunction createRule(name, decl, options) {\n  if (name === void 0) {\n    name = 'unnamed';\n  }\n\n  var jss = options.jss;\n  var declCopy = cloneStyle(decl);\n  var rule = jss.plugins.onCreateRule(name, declCopy, options);\n  if (rule) return rule; // It is an at-rule and it has no instance.\n\n  if (name[0] === '@') {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Unknown rule \" + name) : undefined;\n  }\n\n  return null;\n}\n\nvar join = function join(value, by) {\n  var result = '';\n\n  for (var i = 0; i < value.length; i++) {\n    // Remove !important from the value, it will be readded later.\n    if (value[i] === '!important') break;\n    if (result) result += by;\n    result += value[i];\n  }\n\n  return result;\n};\n/**\n * Converts array values to string.\n *\n * `margin: [['5px', '10px']]` > `margin: 5px 10px;`\n * `border: ['1px', '2px']` > `border: 1px, 2px;`\n * `margin: [['5px', '10px'], '!important']` > `margin: 5px 10px !important;`\n * `color: ['red', !important]` > `color: red !important;`\n */\n\n\nfunction toCssValue(value, ignoreImportant) {\n  if (ignoreImportant === void 0) {\n    ignoreImportant = false;\n  }\n\n  if (!Array.isArray(value)) return value;\n  var cssValue = ''; // Support space separated values via `[['5px', '10px']]`.\n\n  if (Array.isArray(value[0])) {\n    for (var i = 0; i < value.length; i++) {\n      if (value[i] === '!important') break;\n      if (cssValue) cssValue += ', ';\n      cssValue += join(value[i], ' ');\n    }\n  } else cssValue = join(value, ', '); // Add !important, because it was ignored.\n\n\n  if (!ignoreImportant && value[value.length - 1] === '!important') {\n    cssValue += ' !important';\n  }\n\n  return cssValue;\n}\n\n/**\n * Indent a string.\n * http://jsperf.com/array-join-vs-for\n */\nfunction indentStr(str, indent) {\n  var result = '';\n\n  for (var index = 0; index < indent; index++) {\n    result += '  ';\n  }\n\n  return result + str;\n}\n/**\n * Converts a Rule to CSS string.\n */\n\n\nfunction toCss(selector, style, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var result = '';\n  if (!style) return result;\n  var _options = options,\n      _options$indent = _options.indent,\n      indent = _options$indent === void 0 ? 0 : _options$indent;\n  var fallbacks = style.fallbacks;\n  if (selector) indent++; // Apply fallbacks first.\n\n  if (fallbacks) {\n    // Array syntax {fallbacks: [{prop: value}]}\n    if (Array.isArray(fallbacks)) {\n      for (var index = 0; index < fallbacks.length; index++) {\n        var fallback = fallbacks[index];\n\n        for (var prop in fallback) {\n          var value = fallback[prop];\n\n          if (value != null) {\n            if (result) result += '\\n';\n            result += \"\" + indentStr(prop + \": \" + toCssValue(value) + \";\", indent);\n          }\n        }\n      }\n    } else {\n      // Object syntax {fallbacks: {prop: value}}\n      for (var _prop in fallbacks) {\n        var _value = fallbacks[_prop];\n\n        if (_value != null) {\n          if (result) result += '\\n';\n          result += \"\" + indentStr(_prop + \": \" + toCssValue(_value) + \";\", indent);\n        }\n      }\n    }\n  }\n\n  for (var _prop2 in style) {\n    var _value2 = style[_prop2];\n\n    if (_value2 != null && _prop2 !== 'fallbacks') {\n      if (result) result += '\\n';\n      result += \"\" + indentStr(_prop2 + \": \" + toCssValue(_value2) + \";\", indent);\n    }\n  } // Allow empty style in this case, because properties will be added dynamically.\n\n\n  if (!result && !options.allowEmpty) return result; // When rule is being stringified before selector was defined.\n\n  if (!selector) return result;\n  indent--;\n  if (result) result = \"\\n\" + result + \"\\n\";\n  return indentStr(selector + \" {\" + result, indent) + indentStr('}', indent);\n}\n\nvar escapeRegex = /([[\\].#*$><+~=|^:(),\"'`\\s])/g;\nvar nativeEscape = typeof CSS !== 'undefined' && CSS.escape;\nvar escape = (function (str) {\n  return nativeEscape ? nativeEscape(str) : str.replace(escapeRegex, '\\\\$1');\n});\n\nvar BaseStyleRule =\n/*#__PURE__*/\nfunction () {\n  function BaseStyleRule(key, style, options) {\n    this.type = 'style';\n    this.key = void 0;\n    this.isProcessed = false;\n    this.style = void 0;\n    this.renderer = void 0;\n    this.renderable = void 0;\n    this.options = void 0;\n    var sheet = options.sheet,\n        Renderer = options.Renderer;\n    this.key = key;\n    this.options = options;\n    this.style = style;\n    if (sheet) this.renderer = sheet.renderer;else if (Renderer) this.renderer = new Renderer();\n  }\n  /**\n   * Get or set a style property.\n   */\n\n\n  var _proto = BaseStyleRule.prototype;\n\n  _proto.prop = function prop(name, value, options) {\n    // It's a getter.\n    if (value === undefined) return this.style[name]; // Don't do anything if the value has not changed.\n\n    var force = options ? options.force : false;\n    if (!force && this.style[name] === value) return this;\n    var newValue = value;\n\n    if (!options || options.process !== false) {\n      newValue = this.options.jss.plugins.onChangeValue(value, name, this);\n    }\n\n    var isEmpty = newValue == null || newValue === false;\n    var isDefined = name in this.style; // Value is empty and wasn't defined before.\n\n    if (isEmpty && !isDefined && !force) return this; // We are going to remove this value.\n\n    var remove = isEmpty && isDefined;\n    if (remove) delete this.style[name];else this.style[name] = newValue; // Renderable is defined if StyleSheet option `link` is true.\n\n    if (this.renderable && this.renderer) {\n      if (remove) this.renderer.removeProperty(this.renderable, name);else this.renderer.setProperty(this.renderable, name, newValue);\n      return this;\n    }\n\n    var sheet = this.options.sheet;\n\n    if (sheet && sheet.attached) {\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, '[JSS] Rule is not linked. Missing sheet option \"link: true\".') : undefined;\n    }\n\n    return this;\n  };\n\n  return BaseStyleRule;\n}();\nvar StyleRule =\n/*#__PURE__*/\nfunction (_BaseStyleRule) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(StyleRule, _BaseStyleRule);\n\n  function StyleRule(key, style, options) {\n    var _this;\n\n    _this = _BaseStyleRule.call(this, key, style, options) || this;\n    _this.selectorText = void 0;\n    _this.id = void 0;\n    _this.renderable = void 0;\n    var selector = options.selector,\n        scoped = options.scoped,\n        sheet = options.sheet,\n        generateId = options.generateId;\n\n    if (selector) {\n      _this.selectorText = selector;\n    } else if (scoped !== false) {\n      _this.id = generateId(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(_this)), sheet);\n      _this.selectorText = \".\" + escape(_this.id);\n    }\n\n    return _this;\n  }\n  /**\n   * Set selector string.\n   * Attention: use this with caution. Most browsers didn't implement\n   * selectorText setter, so this may result in rerendering of entire Style Sheet.\n   */\n\n\n  var _proto2 = StyleRule.prototype;\n\n  /**\n   * Apply rule to an element inline.\n   */\n  _proto2.applyTo = function applyTo(renderable) {\n    var renderer = this.renderer;\n\n    if (renderer) {\n      var json = this.toJSON();\n\n      for (var prop in json) {\n        renderer.setProperty(renderable, prop, json[prop]);\n      }\n    }\n\n    return this;\n  }\n  /**\n   * Returns JSON representation of the rule.\n   * Fallbacks are not supported.\n   * Useful for inline styles.\n   */\n  ;\n\n  _proto2.toJSON = function toJSON() {\n    var json = {};\n\n    for (var prop in this.style) {\n      var value = this.style[prop];\n      if (typeof value !== 'object') json[prop] = value;else if (Array.isArray(value)) json[prop] = toCssValue(value);\n    }\n\n    return json;\n  }\n  /**\n   * Generates a CSS string.\n   */\n  ;\n\n  _proto2.toString = function toString(options) {\n    var sheet = this.options.sheet;\n    var link = sheet ? sheet.options.link : false;\n    var opts = link ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      allowEmpty: true\n    }) : options;\n    return toCss(this.selectorText, this.style, opts);\n  };\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(StyleRule, [{\n    key: \"selector\",\n    set: function set(selector) {\n      if (selector === this.selectorText) return;\n      this.selectorText = selector;\n      var renderer = this.renderer,\n          renderable = this.renderable;\n      if (!renderable || !renderer) return;\n      var hasChanged = renderer.setSelector(renderable, selector); // If selector setter is not implemented, rerender the rule.\n\n      if (!hasChanged) {\n        renderer.replaceRule(renderable, this);\n      }\n    }\n    /**\n     * Get selector string.\n     */\n    ,\n    get: function get() {\n      return this.selectorText;\n    }\n  }]);\n\n  return StyleRule;\n}(BaseStyleRule);\nvar pluginStyleRule = {\n  onCreateRule: function onCreateRule(name, style, options) {\n    if (name[0] === '@' || options.parent && options.parent.type === 'keyframes') {\n      return null;\n    }\n\n    return new StyleRule(name, style, options);\n  }\n};\n\nvar defaultToStringOptions = {\n  indent: 1,\n  children: true\n};\nvar atRegExp = /@([\\w-]+)/;\n/**\n * Conditional rule for @media, @supports\n */\n\nvar ConditionalRule =\n/*#__PURE__*/\nfunction () {\n  function ConditionalRule(key, styles, options) {\n    this.type = 'conditional';\n    this.at = void 0;\n    this.key = void 0;\n    this.query = void 0;\n    this.rules = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key; // Key might contain a unique suffix in case the `name` passed by user was duplicate.\n\n    this.query = options.name;\n    var atMatch = key.match(atRegExp);\n    this.at = atMatch ? atMatch[1] : 'unknown';\n    this.options = options;\n    this.rules = new RuleList(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n\n    for (var name in styles) {\n      this.rules.add(name, styles[name]);\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Get a rule.\n   */\n\n\n  var _proto = ConditionalRule.prototype;\n\n  _proto.getRule = function getRule(name) {\n    return this.rules.get(name);\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.rules.indexOf(rule);\n  }\n  /**\n   * Create and register rule, run plugins.\n   */\n  ;\n\n  _proto.addRule = function addRule(name, style, options) {\n    var rule = this.rules.add(name, style, options);\n    if (!rule) return null;\n    this.options.jss.plugins.onProcessRule(rule);\n    return rule;\n  }\n  /**\n   * Generates a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(options) {\n    if (options === void 0) {\n      options = defaultToStringOptions;\n    }\n\n    if (options.indent == null) options.indent = defaultToStringOptions.indent;\n    if (options.children == null) options.children = defaultToStringOptions.children;\n\n    if (options.children === false) {\n      return this.query + \" {}\";\n    }\n\n    var children = this.rules.toString(options);\n    return children ? this.query + \" {\\n\" + children + \"\\n}\" : '';\n  };\n\n  return ConditionalRule;\n}();\nvar keyRegExp = /@media|@supports\\s+/;\nvar pluginConditionalRule = {\n  onCreateRule: function onCreateRule(key, styles, options) {\n    return keyRegExp.test(key) ? new ConditionalRule(key, styles, options) : null;\n  }\n};\n\nvar defaultToStringOptions$1 = {\n  indent: 1,\n  children: true\n};\nvar nameRegExp = /@keyframes\\s+([\\w-]+)/;\n/**\n * Rule for @keyframes\n */\n\nvar KeyframesRule =\n/*#__PURE__*/\nfunction () {\n  function KeyframesRule(key, frames, options) {\n    this.type = 'keyframes';\n    this.at = '@keyframes';\n    this.key = void 0;\n    this.name = void 0;\n    this.id = void 0;\n    this.rules = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    var nameMatch = key.match(nameRegExp);\n\n    if (nameMatch && nameMatch[1]) {\n      this.name = nameMatch[1];\n    } else {\n      this.name = 'noname';\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Bad keyframes name \" + key) : undefined;\n    }\n\n    this.key = this.type + \"-\" + this.name;\n    this.options = options;\n    var scoped = options.scoped,\n        sheet = options.sheet,\n        generateId = options.generateId;\n    this.id = scoped === false ? this.name : escape(generateId(this, sheet));\n    this.rules = new RuleList(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      parent: this\n    }));\n\n    for (var name in frames) {\n      this.rules.add(name, frames[name], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n        parent: this\n      }));\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Generates a CSS string.\n   */\n\n\n  var _proto = KeyframesRule.prototype;\n\n  _proto.toString = function toString(options) {\n    if (options === void 0) {\n      options = defaultToStringOptions$1;\n    }\n\n    if (options.indent == null) options.indent = defaultToStringOptions$1.indent;\n    if (options.children == null) options.children = defaultToStringOptions$1.children;\n\n    if (options.children === false) {\n      return this.at + \" \" + this.id + \" {}\";\n    }\n\n    var children = this.rules.toString(options);\n    if (children) children = \"\\n\" + children + \"\\n\";\n    return this.at + \" \" + this.id + \" {\" + children + \"}\";\n  };\n\n  return KeyframesRule;\n}();\nvar keyRegExp$1 = /@keyframes\\s+/;\nvar refRegExp = /\\$([\\w-]+)/g;\n\nvar findReferencedKeyframe = function findReferencedKeyframe(val, keyframes) {\n  if (typeof val === 'string') {\n    return val.replace(refRegExp, function (match, name) {\n      if (name in keyframes) {\n        return keyframes[name];\n      }\n\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Referenced keyframes rule \\\"\" + name + \"\\\" is not defined.\") : undefined;\n      return match;\n    });\n  }\n\n  return val;\n};\n/**\n * Replace the reference for a animation name.\n */\n\n\nvar replaceRef = function replaceRef(style, prop, keyframes) {\n  var value = style[prop];\n  var refKeyframe = findReferencedKeyframe(value, keyframes);\n\n  if (refKeyframe !== value) {\n    style[prop] = refKeyframe;\n  }\n};\n\nvar plugin = {\n  onCreateRule: function onCreateRule(key, frames, options) {\n    return typeof key === 'string' && keyRegExp$1.test(key) ? new KeyframesRule(key, frames, options) : null;\n  },\n  // Animation name ref replacer.\n  onProcessStyle: function onProcessStyle(style, rule, sheet) {\n    if (rule.type !== 'style' || !sheet) return style;\n    if ('animation-name' in style) replaceRef(style, 'animation-name', sheet.keyframes);\n    if ('animation' in style) replaceRef(style, 'animation', sheet.keyframes);\n    return style;\n  },\n  onChangeValue: function onChangeValue(val, prop, rule) {\n    var sheet = rule.options.sheet;\n\n    if (!sheet) {\n      return val;\n    }\n\n    switch (prop) {\n      case 'animation':\n        return findReferencedKeyframe(val, sheet.keyframes);\n\n      case 'animation-name':\n        return findReferencedKeyframe(val, sheet.keyframes);\n\n      default:\n        return val;\n    }\n  }\n};\n\nvar KeyframeRule =\n/*#__PURE__*/\nfunction (_BaseStyleRule) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(KeyframeRule, _BaseStyleRule);\n\n  function KeyframeRule() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _BaseStyleRule.call.apply(_BaseStyleRule, [this].concat(args)) || this;\n    _this.renderable = void 0;\n    return _this;\n  }\n\n  var _proto = KeyframeRule.prototype;\n\n  /**\n   * Generates a CSS string.\n   */\n  _proto.toString = function toString(options) {\n    var sheet = this.options.sheet;\n    var link = sheet ? sheet.options.link : false;\n    var opts = link ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      allowEmpty: true\n    }) : options;\n    return toCss(this.key, this.style, opts);\n  };\n\n  return KeyframeRule;\n}(BaseStyleRule);\nvar pluginKeyframeRule = {\n  onCreateRule: function onCreateRule(key, style, options) {\n    if (options.parent && options.parent.type === 'keyframes') {\n      return new KeyframeRule(key, style, options);\n    }\n\n    return null;\n  }\n};\n\nvar FontFaceRule =\n/*#__PURE__*/\nfunction () {\n  function FontFaceRule(key, style, options) {\n    this.type = 'font-face';\n    this.at = '@font-face';\n    this.key = void 0;\n    this.style = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key;\n    this.style = style;\n    this.options = options;\n  }\n  /**\n   * Generates a CSS string.\n   */\n\n\n  var _proto = FontFaceRule.prototype;\n\n  _proto.toString = function toString(options) {\n    if (Array.isArray(this.style)) {\n      var str = '';\n\n      for (var index = 0; index < this.style.length; index++) {\n        str += toCss(this.at, this.style[index]);\n        if (this.style[index + 1]) str += '\\n';\n      }\n\n      return str;\n    }\n\n    return toCss(this.at, this.style, options);\n  };\n\n  return FontFaceRule;\n}();\nvar keyRegExp$2 = /@font-face/;\nvar pluginFontFaceRule = {\n  onCreateRule: function onCreateRule(key, style, options) {\n    return keyRegExp$2.test(key) ? new FontFaceRule(key, style, options) : null;\n  }\n};\n\nvar ViewportRule =\n/*#__PURE__*/\nfunction () {\n  function ViewportRule(key, style, options) {\n    this.type = 'viewport';\n    this.at = '@viewport';\n    this.key = void 0;\n    this.style = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key;\n    this.style = style;\n    this.options = options;\n  }\n  /**\n   * Generates a CSS string.\n   */\n\n\n  var _proto = ViewportRule.prototype;\n\n  _proto.toString = function toString(options) {\n    return toCss(this.key, this.style, options);\n  };\n\n  return ViewportRule;\n}();\nvar pluginViewportRule = {\n  onCreateRule: function onCreateRule(key, style, options) {\n    return key === '@viewport' || key === '@-ms-viewport' ? new ViewportRule(key, style, options) : null;\n  }\n};\n\nvar SimpleRule =\n/*#__PURE__*/\nfunction () {\n  function SimpleRule(key, value, options) {\n    this.type = 'simple';\n    this.key = void 0;\n    this.value = void 0;\n    this.options = void 0;\n    this.isProcessed = false;\n    this.renderable = void 0;\n    this.key = key;\n    this.value = value;\n    this.options = options;\n  }\n  /**\n   * Generates a CSS string.\n   */\n  // eslint-disable-next-line no-unused-vars\n\n\n  var _proto = SimpleRule.prototype;\n\n  _proto.toString = function toString(options) {\n    if (Array.isArray(this.value)) {\n      var str = '';\n\n      for (var index = 0; index < this.value.length; index++) {\n        str += this.key + \" \" + this.value[index] + \";\";\n        if (this.value[index + 1]) str += '\\n';\n      }\n\n      return str;\n    }\n\n    return this.key + \" \" + this.value + \";\";\n  };\n\n  return SimpleRule;\n}();\nvar keysMap = {\n  '@charset': true,\n  '@import': true,\n  '@namespace': true\n};\nvar pluginSimpleRule = {\n  onCreateRule: function onCreateRule(key, value, options) {\n    return key in keysMap ? new SimpleRule(key, value, options) : null;\n  }\n};\n\nvar plugins = [pluginStyleRule, pluginConditionalRule, plugin, pluginKeyframeRule, pluginFontFaceRule, pluginViewportRule, pluginSimpleRule];\n\nvar defaultUpdateOptions = {\n  process: true\n};\nvar forceUpdateOptions = {\n  force: true,\n  process: true\n  /**\n   * Contains rules objects and allows adding/removing etc.\n   * Is used for e.g. by `StyleSheet` or `ConditionalRule`.\n   */\n\n};\n\nvar RuleList =\n/*#__PURE__*/\nfunction () {\n  // Rules registry for access by .get() method.\n  // It contains the same rule registered by name and by selector.\n  // Original styles object.\n  // Used to ensure correct rules order.\n  function RuleList(options) {\n    this.map = {};\n    this.raw = {};\n    this.index = [];\n    this.counter = 0;\n    this.options = void 0;\n    this.classes = void 0;\n    this.keyframes = void 0;\n    this.options = options;\n    this.classes = options.classes;\n    this.keyframes = options.keyframes;\n  }\n  /**\n   * Create and register rule.\n   *\n   * Will not render after Style Sheet was rendered the first time.\n   */\n\n\n  var _proto = RuleList.prototype;\n\n  _proto.add = function add(name, decl, ruleOptions) {\n    var _this$options = this.options,\n        parent = _this$options.parent,\n        sheet = _this$options.sheet,\n        jss = _this$options.jss,\n        Renderer = _this$options.Renderer,\n        generateId = _this$options.generateId,\n        scoped = _this$options.scoped;\n\n    var options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n      classes: this.classes,\n      parent: parent,\n      sheet: sheet,\n      jss: jss,\n      Renderer: Renderer,\n      generateId: generateId,\n      scoped: scoped,\n      name: name\n    }, ruleOptions); // When user uses .createStyleSheet(), duplicate names are not possible, but\n    // `sheet.addRule()` opens the door for any duplicate rule name. When this happens\n    // we need to make the key unique within this RuleList instance scope.\n\n\n    var key = name;\n\n    if (name in this.raw) {\n      key = name + \"-d\" + this.counter++;\n    } // We need to save the original decl before creating the rule\n    // because cache plugin needs to use it as a key to return a cached rule.\n\n\n    this.raw[key] = decl;\n\n    if (key in this.classes) {\n      // E.g. rules inside of @media container\n      options.selector = \".\" + escape(this.classes[key]);\n    }\n\n    var rule = createRule(key, decl, options);\n    if (!rule) return null;\n    this.register(rule);\n    var index = options.index === undefined ? this.index.length : options.index;\n    this.index.splice(index, 0, rule);\n    return rule;\n  }\n  /**\n   * Get a rule.\n   */\n  ;\n\n  _proto.get = function get(name) {\n    return this.map[name];\n  }\n  /**\n   * Delete a rule.\n   */\n  ;\n\n  _proto.remove = function remove(rule) {\n    this.unregister(rule);\n    delete this.raw[rule.key];\n    this.index.splice(this.index.indexOf(rule), 1);\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.index.indexOf(rule);\n  }\n  /**\n   * Run `onProcessRule()` plugins on every rule.\n   */\n  ;\n\n  _proto.process = function process() {\n    var plugins = this.options.jss.plugins; // We need to clone array because if we modify the index somewhere else during a loop\n    // we end up with very hard-to-track-down side effects.\n\n    this.index.slice(0).forEach(plugins.onProcessRule, plugins);\n  }\n  /**\n   * Register a rule in `.map`, `.classes` and `.keyframes` maps.\n   */\n  ;\n\n  _proto.register = function register(rule) {\n    this.map[rule.key] = rule;\n\n    if (rule instanceof StyleRule) {\n      this.map[rule.selector] = rule;\n      if (rule.id) this.classes[rule.key] = rule.id;\n    } else if (rule instanceof KeyframesRule && this.keyframes) {\n      this.keyframes[rule.name] = rule.id;\n    }\n  }\n  /**\n   * Unregister a rule.\n   */\n  ;\n\n  _proto.unregister = function unregister(rule) {\n    delete this.map[rule.key];\n\n    if (rule instanceof StyleRule) {\n      delete this.map[rule.selector];\n      delete this.classes[rule.key];\n    } else if (rule instanceof KeyframesRule) {\n      delete this.keyframes[rule.name];\n    }\n  }\n  /**\n   * Update the function values with a new data.\n   */\n  ;\n\n  _proto.update = function update() {\n    var name;\n    var data;\n    var options;\n\n    if (typeof (arguments.length <= 0 ? undefined : arguments[0]) === 'string') {\n      name = arguments.length <= 0 ? undefined : arguments[0]; // $FlowFixMe\n\n      data = arguments.length <= 1 ? undefined : arguments[1]; // $FlowFixMe\n\n      options = arguments.length <= 2 ? undefined : arguments[2];\n    } else {\n      data = arguments.length <= 0 ? undefined : arguments[0]; // $FlowFixMe\n\n      options = arguments.length <= 1 ? undefined : arguments[1];\n      name = null;\n    }\n\n    if (name) {\n      this.updateOne(this.map[name], data, options);\n    } else {\n      for (var index = 0; index < this.index.length; index++) {\n        this.updateOne(this.index[index], data, options);\n      }\n    }\n  }\n  /**\n   * Execute plugins, update rule props.\n   */\n  ;\n\n  _proto.updateOne = function updateOne(rule, data, options) {\n    if (options === void 0) {\n      options = defaultUpdateOptions;\n    }\n\n    var _this$options2 = this.options,\n        plugins = _this$options2.jss.plugins,\n        sheet = _this$options2.sheet; // It is a rules container like for e.g. ConditionalRule.\n\n    if (rule.rules instanceof RuleList) {\n      rule.rules.update(data, options);\n      return;\n    }\n\n    var styleRule = rule;\n    var style = styleRule.style;\n    plugins.onUpdate(data, rule, sheet, options); // We rely on a new `style` ref in case it was mutated during onUpdate hook.\n\n    if (options.process && style && style !== styleRule.style) {\n      // We need to run the plugins in case new `style` relies on syntax plugins.\n      plugins.onProcessStyle(styleRule.style, styleRule, sheet); // Update and add props.\n\n      for (var prop in styleRule.style) {\n        var nextValue = styleRule.style[prop];\n        var prevValue = style[prop]; // We need to use `force: true` because `rule.style` has been updated during onUpdate hook, so `rule.prop()` will not update the CSSOM rule.\n        // We do this comparison to avoid unneeded `rule.prop()` calls, since we have the old `style` object here.\n\n        if (nextValue !== prevValue) {\n          styleRule.prop(prop, nextValue, forceUpdateOptions);\n        }\n      } // Remove props.\n\n\n      for (var _prop in style) {\n        var _nextValue = styleRule.style[_prop];\n        var _prevValue = style[_prop]; // We need to use `force: true` because `rule.style` has been updated during onUpdate hook, so `rule.prop()` will not update the CSSOM rule.\n        // We do this comparison to avoid unneeded `rule.prop()` calls, since we have the old `style` object here.\n\n        if (_nextValue == null && _nextValue !== _prevValue) {\n          styleRule.prop(_prop, null, forceUpdateOptions);\n        }\n      }\n    }\n  }\n  /**\n   * Convert rules to a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(options) {\n    var str = '';\n    var sheet = this.options.sheet;\n    var link = sheet ? sheet.options.link : false;\n\n    for (var index = 0; index < this.index.length; index++) {\n      var rule = this.index[index];\n      var css = rule.toString(options); // No need to render an empty rule.\n\n      if (!css && !link) continue;\n      if (str) str += '\\n';\n      str += css;\n    }\n\n    return str;\n  };\n\n  return RuleList;\n}();\n\nvar StyleSheet =\n/*#__PURE__*/\nfunction () {\n  function StyleSheet(styles, options) {\n    this.options = void 0;\n    this.deployed = void 0;\n    this.attached = void 0;\n    this.rules = void 0;\n    this.renderer = void 0;\n    this.classes = void 0;\n    this.keyframes = void 0;\n    this.queue = void 0;\n    this.attached = false;\n    this.deployed = false;\n    this.classes = {};\n    this.keyframes = {};\n    this.options = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      sheet: this,\n      parent: this,\n      classes: this.classes,\n      keyframes: this.keyframes\n    });\n\n    if (options.Renderer) {\n      this.renderer = new options.Renderer(this);\n    }\n\n    this.rules = new RuleList(this.options);\n\n    for (var name in styles) {\n      this.rules.add(name, styles[name]);\n    }\n\n    this.rules.process();\n  }\n  /**\n   * Attach renderable to the render tree.\n   */\n\n\n  var _proto = StyleSheet.prototype;\n\n  _proto.attach = function attach() {\n    if (this.attached) return this;\n    if (this.renderer) this.renderer.attach();\n    this.attached = true; // Order is important, because we can't use insertRule API if style element is not attached.\n\n    if (!this.deployed) this.deploy();\n    return this;\n  }\n  /**\n   * Remove renderable from render tree.\n   */\n  ;\n\n  _proto.detach = function detach() {\n    if (!this.attached) return this;\n    if (this.renderer) this.renderer.detach();\n    this.attached = false;\n    return this;\n  }\n  /**\n   * Add a rule to the current stylesheet.\n   * Will insert a rule also after the stylesheet has been rendered first time.\n   */\n  ;\n\n  _proto.addRule = function addRule(name, decl, options) {\n    var queue = this.queue; // Plugins can create rules.\n    // In order to preserve the right order, we need to queue all `.addRule` calls,\n    // which happen after the first `rules.add()` call.\n\n    if (this.attached && !queue) this.queue = [];\n    var rule = this.rules.add(name, decl, options);\n    if (!rule) return null;\n    this.options.jss.plugins.onProcessRule(rule);\n\n    if (this.attached) {\n      if (!this.deployed) return rule; // Don't insert rule directly if there is no stringified version yet.\n      // It will be inserted all together when .attach is called.\n\n      if (queue) queue.push(rule);else {\n        this.insertRule(rule);\n\n        if (this.queue) {\n          this.queue.forEach(this.insertRule, this);\n          this.queue = undefined;\n        }\n      }\n      return rule;\n    } // We can't add rules to a detached style node.\n    // We will redeploy the sheet once user will attach it.\n\n\n    this.deployed = false;\n    return rule;\n  }\n  /**\n   * Insert rule into the StyleSheet\n   */\n  ;\n\n  _proto.insertRule = function insertRule(rule) {\n    if (this.renderer) {\n      this.renderer.insertRule(rule);\n    }\n  }\n  /**\n   * Create and add rules.\n   * Will render also after Style Sheet was rendered the first time.\n   */\n  ;\n\n  _proto.addRules = function addRules(styles, options) {\n    var added = [];\n\n    for (var name in styles) {\n      var rule = this.addRule(name, styles[name], options);\n      if (rule) added.push(rule);\n    }\n\n    return added;\n  }\n  /**\n   * Get a rule by name.\n   */\n  ;\n\n  _proto.getRule = function getRule(name) {\n    return this.rules.get(name);\n  }\n  /**\n   * Delete a rule by name.\n   * Returns `true`: if rule has been deleted from the DOM.\n   */\n  ;\n\n  _proto.deleteRule = function deleteRule(name) {\n    var rule = typeof name === 'object' ? name : this.rules.get(name);\n    if (!rule) return false;\n    this.rules.remove(rule);\n\n    if (this.attached && rule.renderable && this.renderer) {\n      return this.renderer.deleteRule(rule.renderable);\n    }\n\n    return true;\n  }\n  /**\n   * Get index of a rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(rule) {\n    return this.rules.indexOf(rule);\n  }\n  /**\n   * Deploy pure CSS string to a renderable.\n   */\n  ;\n\n  _proto.deploy = function deploy() {\n    if (this.renderer) this.renderer.deploy();\n    this.deployed = true;\n    return this;\n  }\n  /**\n   * Update the function values with a new data.\n   */\n  ;\n\n  _proto.update = function update() {\n    var _this$rules;\n\n    (_this$rules = this.rules).update.apply(_this$rules, arguments);\n\n    return this;\n  }\n  /**\n   * Updates a single rule.\n   */\n  ;\n\n  _proto.updateOne = function updateOne(rule, data, options) {\n    this.rules.updateOne(rule, data, options);\n    return this;\n  }\n  /**\n   * Convert rules to a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(options) {\n    return this.rules.toString(options);\n  };\n\n  return StyleSheet;\n}();\n\nvar PluginsRegistry =\n/*#__PURE__*/\nfunction () {\n  function PluginsRegistry() {\n    this.plugins = {\n      internal: [],\n      external: []\n    };\n    this.registry = void 0;\n  }\n\n  var _proto = PluginsRegistry.prototype;\n\n  /**\n   * Call `onCreateRule` hooks and return an object if returned by a hook.\n   */\n  _proto.onCreateRule = function onCreateRule(name, decl, options) {\n    for (var i = 0; i < this.registry.onCreateRule.length; i++) {\n      var rule = this.registry.onCreateRule[i](name, decl, options);\n      if (rule) return rule;\n    }\n\n    return null;\n  }\n  /**\n   * Call `onProcessRule` hooks.\n   */\n  ;\n\n  _proto.onProcessRule = function onProcessRule(rule) {\n    if (rule.isProcessed) return;\n    var sheet = rule.options.sheet;\n\n    for (var i = 0; i < this.registry.onProcessRule.length; i++) {\n      this.registry.onProcessRule[i](rule, sheet);\n    }\n\n    if (rule.style) this.onProcessStyle(rule.style, rule, sheet);\n    rule.isProcessed = true;\n  }\n  /**\n   * Call `onProcessStyle` hooks.\n   */\n  ;\n\n  _proto.onProcessStyle = function onProcessStyle(style, rule, sheet) {\n    for (var i = 0; i < this.registry.onProcessStyle.length; i++) {\n      // $FlowFixMe\n      rule.style = this.registry.onProcessStyle[i](rule.style, rule, sheet);\n    }\n  }\n  /**\n   * Call `onProcessSheet` hooks.\n   */\n  ;\n\n  _proto.onProcessSheet = function onProcessSheet(sheet) {\n    for (var i = 0; i < this.registry.onProcessSheet.length; i++) {\n      this.registry.onProcessSheet[i](sheet);\n    }\n  }\n  /**\n   * Call `onUpdate` hooks.\n   */\n  ;\n\n  _proto.onUpdate = function onUpdate(data, rule, sheet, options) {\n    for (var i = 0; i < this.registry.onUpdate.length; i++) {\n      this.registry.onUpdate[i](data, rule, sheet, options);\n    }\n  }\n  /**\n   * Call `onChangeValue` hooks.\n   */\n  ;\n\n  _proto.onChangeValue = function onChangeValue(value, prop, rule) {\n    var processedValue = value;\n\n    for (var i = 0; i < this.registry.onChangeValue.length; i++) {\n      processedValue = this.registry.onChangeValue[i](processedValue, prop, rule);\n    }\n\n    return processedValue;\n  }\n  /**\n   * Register a plugin.\n   */\n  ;\n\n  _proto.use = function use(newPlugin, options) {\n    if (options === void 0) {\n      options = {\n        queue: 'external'\n      };\n    }\n\n    var plugins = this.plugins[options.queue]; // Avoids applying same plugin twice, at least based on ref.\n\n    if (plugins.indexOf(newPlugin) !== -1) {\n      return;\n    }\n\n    plugins.push(newPlugin);\n    this.registry = [].concat(this.plugins.external, this.plugins.internal).reduce(function (registry, plugin) {\n      for (var name in plugin) {\n        if (name in registry) {\n          registry[name].push(plugin[name]);\n        } else {\n           true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Unknown hook \\\"\" + name + \"\\\".\") : undefined;\n        }\n      }\n\n      return registry;\n    }, {\n      onCreateRule: [],\n      onProcessRule: [],\n      onProcessStyle: [],\n      onProcessSheet: [],\n      onChangeValue: [],\n      onUpdate: []\n    });\n  };\n\n  return PluginsRegistry;\n}();\n\n/**\n * Sheets registry to access them all at one place.\n */\nvar SheetsRegistry =\n/*#__PURE__*/\nfunction () {\n  function SheetsRegistry() {\n    this.registry = [];\n  }\n\n  var _proto = SheetsRegistry.prototype;\n\n  /**\n   * Register a Style Sheet.\n   */\n  _proto.add = function add(sheet) {\n    var registry = this.registry;\n    var index = sheet.options.index;\n    if (registry.indexOf(sheet) !== -1) return;\n\n    if (registry.length === 0 || index >= this.index) {\n      registry.push(sheet);\n      return;\n    } // Find a position.\n\n\n    for (var i = 0; i < registry.length; i++) {\n      if (registry[i].options.index > index) {\n        registry.splice(i, 0, sheet);\n        return;\n      }\n    }\n  }\n  /**\n   * Reset the registry.\n   */\n  ;\n\n  _proto.reset = function reset() {\n    this.registry = [];\n  }\n  /**\n   * Remove a Style Sheet.\n   */\n  ;\n\n  _proto.remove = function remove(sheet) {\n    var index = this.registry.indexOf(sheet);\n    this.registry.splice(index, 1);\n  }\n  /**\n   * Convert all attached sheets to a CSS string.\n   */\n  ;\n\n  _proto.toString = function toString(_temp) {\n    var _ref = _temp === void 0 ? {} : _temp,\n        attached = _ref.attached,\n        options = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(_ref, [\"attached\"]);\n\n    var css = '';\n\n    for (var i = 0; i < this.registry.length; i++) {\n      var sheet = this.registry[i];\n\n      if (attached != null && sheet.attached !== attached) {\n        continue;\n      }\n\n      if (css) css += '\\n';\n      css += sheet.toString(options);\n    }\n\n    return css;\n  };\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(SheetsRegistry, [{\n    key: \"index\",\n\n    /**\n     * Current highest index number.\n     */\n    get: function get() {\n      return this.registry.length === 0 ? 0 : this.registry[this.registry.length - 1].options.index;\n    }\n  }]);\n\n  return SheetsRegistry;\n}();\n\n/**\n * This is a global sheets registry. Only DomRenderer will add sheets to it.\n * On the server one should use an own SheetsRegistry instance and add the\n * sheets to it, because you need to make sure to create a new registry for\n * each request in order to not leak sheets across requests.\n */\n\nvar sheets = new SheetsRegistry();\n\n/* eslint-disable */\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar globalThis = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\n\nvar ns = '2f1acc6c3a606b082e5eef5e54414ffb';\nif (globalThis[ns] == null) globalThis[ns] = 0; // Bundle may contain multiple JSS versions at the same time. In order to identify\n// the current version with just one short number and use it for classes generation\n// we use a counter. Also it is more accurate, because user can manually reevaluate\n// the module.\n\nvar moduleId = globalThis[ns]++;\n\nvar maxRules = 1e10;\n\n/**\n * Returns a function which generates unique class names based on counters.\n * When new generator function is created, rule counter is reseted.\n * We need to reset the rule counter for SSR for each request.\n */\nvar createGenerateId = function createGenerateId(options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var ruleCounter = 0;\n  return function (rule, sheet) {\n    ruleCounter += 1;\n\n    if (ruleCounter > maxRules) {\n       true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] You might have a memory leak. Rule counter is at \" + ruleCounter + \".\") : undefined;\n    }\n\n    var jssId = '';\n    var prefix = '';\n\n    if (sheet) {\n      if (sheet.options.classNamePrefix) {\n        prefix = sheet.options.classNamePrefix;\n      }\n\n      if (sheet.options.jss.id != null) {\n        jssId = String(sheet.options.jss.id);\n      }\n    }\n\n    if (options.minify) {\n      // Using \"c\" because a number can't be the first char in a class name.\n      return \"\" + (prefix || 'c') + moduleId + jssId + ruleCounter;\n    }\n\n    return prefix + rule.key + \"-\" + moduleId + (jssId ? \"-\" + jssId : '') + \"-\" + ruleCounter;\n  };\n};\n\n/**\n * Cache the value from the first time a function is called.\n */\nvar memoize = function memoize(fn) {\n  var value;\n  return function () {\n    if (!value) value = fn();\n    return value;\n  };\n};\n/**\n * Get a style property value.\n */\n\n\nfunction getPropertyValue(cssRule, prop) {\n  try {\n    // Support CSSTOM.\n    if (cssRule.attributeStyleMap) {\n      return cssRule.attributeStyleMap.get(prop);\n    }\n\n    return cssRule.style.getPropertyValue(prop);\n  } catch (err) {\n    // IE may throw if property is unknown.\n    return '';\n  }\n}\n/**\n * Set a style property.\n */\n\n\nfunction setProperty(cssRule, prop, value) {\n  try {\n    var cssValue = value;\n\n    if (Array.isArray(value)) {\n      cssValue = toCssValue(value, true);\n\n      if (value[value.length - 1] === '!important') {\n        cssRule.style.setProperty(prop, cssValue, 'important');\n        return true;\n      }\n    } // Support CSSTOM.\n\n\n    if (cssRule.attributeStyleMap) {\n      cssRule.attributeStyleMap.set(prop, cssValue);\n    } else {\n      cssRule.style.setProperty(prop, cssValue);\n    }\n  } catch (err) {\n    // IE may throw if property is unknown.\n    return false;\n  }\n\n  return true;\n}\n/**\n * Remove a style property.\n */\n\n\nfunction removeProperty(cssRule, prop) {\n  try {\n    // Support CSSTOM.\n    if (cssRule.attributeStyleMap) {\n      cssRule.attributeStyleMap.delete(prop);\n    } else {\n      cssRule.style.removeProperty(prop);\n    }\n  } catch (err) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] DOMException \\\"\" + err.message + \"\\\" was thrown. Tried to remove property \\\"\" + prop + \"\\\".\") : undefined;\n  }\n}\n/**\n * Set the selector.\n */\n\n\nfunction setSelector(cssRule, selectorText) {\n  cssRule.selectorText = selectorText; // Return false if setter was not successful.\n  // Currently works in chrome only.\n\n  return cssRule.selectorText === selectorText;\n}\n/**\n * Gets the `head` element upon the first call and caches it.\n * We assume it can't be null.\n */\n\n\nvar getHead = memoize(function () {\n  return document.querySelector('head');\n});\n/**\n * Find attached sheet with an index higher than the passed one.\n */\n\nfunction findHigherSheet(registry, options) {\n  for (var i = 0; i < registry.length; i++) {\n    var sheet = registry[i];\n\n    if (sheet.attached && sheet.options.index > options.index && sheet.options.insertionPoint === options.insertionPoint) {\n      return sheet;\n    }\n  }\n\n  return null;\n}\n/**\n * Find attached sheet with the highest index.\n */\n\n\nfunction findHighestSheet(registry, options) {\n  for (var i = registry.length - 1; i >= 0; i--) {\n    var sheet = registry[i];\n\n    if (sheet.attached && sheet.options.insertionPoint === options.insertionPoint) {\n      return sheet;\n    }\n  }\n\n  return null;\n}\n/**\n * Find a comment with \"jss\" inside.\n */\n\n\nfunction findCommentNode(text) {\n  var head = getHead();\n\n  for (var i = 0; i < head.childNodes.length; i++) {\n    var node = head.childNodes[i];\n\n    if (node.nodeType === 8 && node.nodeValue.trim() === text) {\n      return node;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Find a node before which we can insert the sheet.\n */\nfunction findPrevNode(options) {\n  var registry = sheets.registry;\n\n  if (registry.length > 0) {\n    // Try to insert before the next higher sheet.\n    var sheet = findHigherSheet(registry, options);\n\n    if (sheet && sheet.renderer) {\n      return {\n        parent: sheet.renderer.element.parentNode,\n        node: sheet.renderer.element\n      };\n    } // Otherwise insert after the last attached.\n\n\n    sheet = findHighestSheet(registry, options);\n\n    if (sheet && sheet.renderer) {\n      return {\n        parent: sheet.renderer.element.parentNode,\n        node: sheet.renderer.element.nextSibling\n      };\n    }\n  } // Try to find a comment placeholder if registry is empty.\n\n\n  var insertionPoint = options.insertionPoint;\n\n  if (insertionPoint && typeof insertionPoint === 'string') {\n    var comment = findCommentNode(insertionPoint);\n\n    if (comment) {\n      return {\n        parent: comment.parentNode,\n        node: comment.nextSibling\n      };\n    } // If user specifies an insertion point and it can't be found in the document -\n    // bad specificity issues may appear.\n\n\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] Insertion point \\\"\" + insertionPoint + \"\\\" not found.\") : undefined;\n  }\n\n  return false;\n}\n/**\n * Insert style element into the DOM.\n */\n\n\nfunction insertStyle(style, options) {\n  var insertionPoint = options.insertionPoint;\n  var nextNode = findPrevNode(options);\n\n  if (nextNode !== false && nextNode.parent) {\n    nextNode.parent.insertBefore(style, nextNode.node);\n    return;\n  } // Works with iframes and any node types.\n\n\n  if (insertionPoint && typeof insertionPoint.nodeType === 'number') {\n    // https://stackoverflow.com/questions/41328728/force-casting-in-flow\n    var insertionPointElement = insertionPoint;\n    var parentNode = insertionPointElement.parentNode;\n    if (parentNode) parentNode.insertBefore(style, insertionPointElement.nextSibling);else  true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, '[JSS] Insertion point is not in the DOM.') : undefined;\n    return;\n  }\n\n  getHead().appendChild(style);\n}\n/**\n * Read jss nonce setting from the page if the user has set it.\n */\n\n\nvar getNonce = memoize(function () {\n  var node = document.querySelector('meta[property=\"csp-nonce\"]');\n  return node ? node.getAttribute('content') : null;\n});\n\nvar _insertRule = function insertRule(container, rule, index) {\n  var maxIndex = container.cssRules.length; // In case previous insertion fails, passed index might be wrong\n\n  if (index === undefined || index > maxIndex) {\n    // eslint-disable-next-line no-param-reassign\n    index = maxIndex;\n  }\n\n  try {\n    if ('insertRule' in container) {\n      var c = container;\n      c.insertRule(rule, index);\n    } // Keyframes rule.\n    else if ('appendRule' in container) {\n        var _c = container;\n\n        _c.appendRule(rule);\n      }\n  } catch (err) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] \" + err.message) : undefined;\n    return false;\n  }\n\n  return container.cssRules[index];\n};\n\nvar createStyle = function createStyle() {\n  var el = document.createElement('style'); // Without it, IE will have a broken source order specificity if we\n  // insert rules after we insert the style tag.\n  // It seems to kick-off the source order specificity algorithm.\n\n  el.textContent = '\\n';\n  return el;\n};\n\nvar DomRenderer =\n/*#__PURE__*/\nfunction () {\n  // HTMLStyleElement needs fixing https://github.com/facebook/flow/issues/2696\n  function DomRenderer(sheet) {\n    this.getPropertyValue = getPropertyValue;\n    this.setProperty = setProperty;\n    this.removeProperty = removeProperty;\n    this.setSelector = setSelector;\n    this.element = void 0;\n    this.sheet = void 0;\n    this.hasInsertedRules = false;\n    // There is no sheet when the renderer is used from a standalone StyleRule.\n    if (sheet) sheets.add(sheet);\n    this.sheet = sheet;\n\n    var _ref = this.sheet ? this.sheet.options : {},\n        media = _ref.media,\n        meta = _ref.meta,\n        element = _ref.element;\n\n    this.element = element || createStyle();\n    this.element.setAttribute('data-jss', '');\n    if (media) this.element.setAttribute('media', media);\n    if (meta) this.element.setAttribute('data-meta', meta);\n    var nonce = getNonce();\n    if (nonce) this.element.setAttribute('nonce', nonce);\n  }\n  /**\n   * Insert style element into render tree.\n   */\n\n\n  var _proto = DomRenderer.prototype;\n\n  _proto.attach = function attach() {\n    // In the case the element node is external and it is already in the DOM.\n    if (this.element.parentNode || !this.sheet) return;\n    insertStyle(this.element, this.sheet.options); // When rules are inserted using `insertRule` API, after `sheet.detach().attach()`\n    // most browsers create a new CSSStyleSheet, except of all IEs.\n\n    var deployed = Boolean(this.sheet && this.sheet.deployed);\n\n    if (this.hasInsertedRules && deployed) {\n      this.hasInsertedRules = false;\n      this.deploy();\n    }\n  }\n  /**\n   * Remove style element from render tree.\n   */\n  ;\n\n  _proto.detach = function detach() {\n    var parentNode = this.element.parentNode;\n    if (parentNode) parentNode.removeChild(this.element);\n  }\n  /**\n   * Inject CSS string into element.\n   */\n  ;\n\n  _proto.deploy = function deploy() {\n    var sheet = this.sheet;\n    if (!sheet) return;\n\n    if (sheet.options.link) {\n      this.insertRules(sheet.rules);\n      return;\n    }\n\n    this.element.textContent = \"\\n\" + sheet.toString() + \"\\n\";\n  }\n  /**\n   * Insert RuleList into an element.\n   */\n  ;\n\n  _proto.insertRules = function insertRules(rules, nativeParent) {\n    for (var i = 0; i < rules.index.length; i++) {\n      this.insertRule(rules.index[i], i, nativeParent);\n    }\n  }\n  /**\n   * Insert a rule into element.\n   */\n  ;\n\n  _proto.insertRule = function insertRule(rule, index, nativeParent) {\n    if (nativeParent === void 0) {\n      nativeParent = this.element.sheet;\n    }\n\n    if (rule.rules) {\n      var parent = rule;\n      var latestNativeParent = nativeParent;\n\n      if (rule.type === 'conditional' || rule.type === 'keyframes') {\n        // We need to render the container without children first.\n        latestNativeParent = _insertRule(nativeParent, parent.toString({\n          children: false\n        }), index);\n\n        if (latestNativeParent === false) {\n          return false;\n        }\n      }\n\n      this.insertRules(parent.rules, latestNativeParent);\n      return latestNativeParent;\n    } // IE keeps the CSSStyleSheet after style node has been reattached,\n    // so we need to check if the `renderable` reference the right style sheet and not\n    // rerender those rules.\n\n\n    if (rule.renderable && rule.renderable.parentStyleSheet === this.element.sheet) {\n      return rule.renderable;\n    }\n\n    var ruleStr = rule.toString();\n    if (!ruleStr) return false;\n\n    var nativeRule = _insertRule(nativeParent, ruleStr, index);\n\n    if (nativeRule === false) {\n      return false;\n    }\n\n    this.hasInsertedRules = true;\n    rule.renderable = nativeRule;\n    return nativeRule;\n  }\n  /**\n   * Delete a rule.\n   */\n  ;\n\n  _proto.deleteRule = function deleteRule(cssRule) {\n    var sheet = this.element.sheet;\n    var index = this.indexOf(cssRule);\n    if (index === -1) return false;\n    sheet.deleteRule(index);\n    return true;\n  }\n  /**\n   * Get index of a CSS Rule.\n   */\n  ;\n\n  _proto.indexOf = function indexOf(cssRule) {\n    var cssRules = this.element.sheet.cssRules;\n\n    for (var index = 0; index < cssRules.length; index++) {\n      if (cssRule === cssRules[index]) return index;\n    }\n\n    return -1;\n  }\n  /**\n   * Generate a new CSS rule and replace the existing one.\n   *\n   * Only used for some old browsers because they can't set a selector.\n   */\n  ;\n\n  _proto.replaceRule = function replaceRule(cssRule, rule) {\n    var index = this.indexOf(cssRule);\n    if (index === -1) return false;\n    this.element.sheet.deleteRule(index);\n    return this.insertRule(rule, index);\n  }\n  /**\n   * Get all rules elements.\n   */\n  ;\n\n  _proto.getRules = function getRules() {\n    return this.element.sheet.cssRules;\n  };\n\n  return DomRenderer;\n}();\n\nvar instanceCounter = 0;\n\nvar Jss =\n/*#__PURE__*/\nfunction () {\n  function Jss(options) {\n    this.id = instanceCounter++;\n    this.version = \"10.3.0\";\n    this.plugins = new PluginsRegistry();\n    this.options = {\n      id: {\n        minify: false\n      },\n      createGenerateId: createGenerateId,\n      Renderer: is_in_browser__WEBPACK_IMPORTED_MODULE_1__[\"default\"] ? DomRenderer : null,\n      plugins: []\n    };\n    this.generateId = createGenerateId({\n      minify: false\n    });\n\n    for (var i = 0; i < plugins.length; i++) {\n      this.plugins.use(plugins[i], {\n        queue: 'internal'\n      });\n    }\n\n    this.setup(options);\n  }\n  /**\n   * Prepares various options, applies plugins.\n   * Should not be used twice on the same instance, because there is no plugins\n   * deduplication logic.\n   */\n\n\n  var _proto = Jss.prototype;\n\n  _proto.setup = function setup(options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    if (options.createGenerateId) {\n      this.options.createGenerateId = options.createGenerateId;\n    }\n\n    if (options.id) {\n      this.options.id = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, this.options.id, options.id);\n    }\n\n    if (options.createGenerateId || options.id) {\n      this.generateId = this.options.createGenerateId(this.options.id);\n    }\n\n    if (options.insertionPoint != null) this.options.insertionPoint = options.insertionPoint;\n\n    if ('Renderer' in options) {\n      this.options.Renderer = options.Renderer;\n    } // eslint-disable-next-line prefer-spread\n\n\n    if (options.plugins) this.use.apply(this, options.plugins);\n    return this;\n  }\n  /**\n   * Create a Style Sheet.\n   */\n  ;\n\n  _proto.createStyleSheet = function createStyleSheet(styles, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var _options = options,\n        index = _options.index;\n\n    if (typeof index !== 'number') {\n      index = sheets.index === 0 ? 0 : sheets.index + 1;\n    }\n\n    var sheet = new StyleSheet(styles, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      jss: this,\n      generateId: options.generateId || this.generateId,\n      insertionPoint: this.options.insertionPoint,\n      Renderer: this.options.Renderer,\n      index: index\n    }));\n    this.plugins.onProcessSheet(sheet);\n    return sheet;\n  }\n  /**\n   * Detach the Style Sheet and remove it from the registry.\n   */\n  ;\n\n  _proto.removeStyleSheet = function removeStyleSheet(sheet) {\n    sheet.detach();\n    sheets.remove(sheet);\n    return this;\n  }\n  /**\n   * Create a rule without a Style Sheet.\n   * [Deprecated] will be removed in the next major version.\n   */\n  ;\n\n  _proto.createRule = function createRule$1(name, style, options) {\n    if (style === void 0) {\n      style = {};\n    }\n\n    if (options === void 0) {\n      options = {};\n    }\n\n    // Enable rule without name for inline styles.\n    if (typeof name === 'object') {\n      return this.createRule(undefined, name, style);\n    }\n\n    var ruleOptions = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, options, {\n      name: name,\n      jss: this,\n      Renderer: this.options.Renderer\n    });\n\n    if (!ruleOptions.generateId) ruleOptions.generateId = this.generateId;\n    if (!ruleOptions.classes) ruleOptions.classes = {};\n    if (!ruleOptions.keyframes) ruleOptions.keyframes = {};\n\n    var rule = createRule(name, style, ruleOptions);\n\n    if (rule) this.plugins.onProcessRule(rule);\n    return rule;\n  }\n  /**\n   * Register plugin. Passed function will be invoked with a rule instance.\n   */\n  ;\n\n  _proto.use = function use() {\n    var _this = this;\n\n    for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n      plugins[_key] = arguments[_key];\n    }\n\n    plugins.forEach(function (plugin) {\n      _this.plugins.use(plugin);\n    });\n    return this;\n  };\n\n  return Jss;\n}();\n\n/**\n * Extracts a styles object with only props that contain function values.\n */\nfunction getDynamicStyles(styles) {\n  var to = null;\n\n  for (var key in styles) {\n    var value = styles[key];\n    var type = typeof value;\n\n    if (type === 'function') {\n      if (!to) to = {};\n      to[key] = value;\n    } else if (type === 'object' && value !== null && !Array.isArray(value)) {\n      var extracted = getDynamicStyles(value);\n\n      if (extracted) {\n        if (!to) to = {};\n        to[key] = extracted;\n      }\n    }\n  }\n\n  return to;\n}\n\n/**\n * SheetsManager is like a WeakMap which is designed to count StyleSheet\n * instances and attach/detach automatically.\n */\nvar SheetsManager =\n/*#__PURE__*/\nfunction () {\n  function SheetsManager() {\n    this.length = 0;\n    this.sheets = new WeakMap();\n  }\n\n  var _proto = SheetsManager.prototype;\n\n  _proto.get = function get(key) {\n    var entry = this.sheets.get(key);\n    return entry && entry.sheet;\n  };\n\n  _proto.add = function add(key, sheet) {\n    if (this.sheets.has(key)) return;\n    this.length++;\n    this.sheets.set(key, {\n      sheet: sheet,\n      refs: 0\n    });\n  };\n\n  _proto.manage = function manage(key) {\n    var entry = this.sheets.get(key);\n\n    if (entry) {\n      if (entry.refs === 0) {\n        entry.sheet.attach();\n      }\n\n      entry.refs++;\n      return entry.sheet;\n    }\n\n    Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"[JSS] SheetsManager: can't find sheet to manage\");\n    return undefined;\n  };\n\n  _proto.unmanage = function unmanage(key) {\n    var entry = this.sheets.get(key);\n\n    if (entry) {\n      if (entry.refs > 0) {\n        entry.refs--;\n        if (entry.refs === 0) entry.sheet.detach();\n      }\n    } else {\n      Object(tiny_warning__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(false, \"SheetsManager: can't find sheet to unmanage\");\n    }\n  };\n\n  Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(SheetsManager, [{\n    key: \"size\",\n    get: function get() {\n      return this.length;\n    }\n  }]);\n\n  return SheetsManager;\n}();\n\n/**\n * A better abstraction over CSS.\n *\n * @copyright Oleg Isonen (Slobodskoi) / Isonen 2014-present\n * @website https://github.com/cssinjs/jss\n * @license MIT\n */\n\n/**\n * Export a constant indicating if this browser has CSSTOM support.\n * https://developers.google.com/web/updates/2018/03/cssom\n */\nvar hasCSSTOMSupport = typeof CSS !== 'undefined' && CSS && 'number' in CSS;\n/**\n * Creates a new instance of Jss.\n */\n\nvar create = function create(options) {\n  return new Jss(options);\n};\n/**\n * A global Jss instance.\n */\n\nvar index = create();\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (index);\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/jss/dist/jss.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js ***!
+  \******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n\n\n\n\n\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {};\n\nfunction getUniqueId() {\n  var key = '__global_unique_id__';\n  return commonjsGlobal[key] = (commonjsGlobal[key] || 0) + 1;\n}\n\nfunction objectIs(x, y) {\n  if (x === y) {\n    return x !== 0 || 1 / x === 1 / y;\n  } else {\n    return x !== x && y !== y;\n  }\n}\n\nfunction createEventEmitter(value) {\n  var handlers = [];\n  return {\n    on: function on(handler) {\n      handlers.push(handler);\n    },\n    off: function off(handler) {\n      handlers = handlers.filter(function (h) {\n        return h !== handler;\n      });\n    },\n    get: function get() {\n      return value;\n    },\n    set: function set(newValue, changedBits) {\n      value = newValue;\n      handlers.forEach(function (handler) {\n        return handler(value, changedBits);\n      });\n    }\n  };\n}\n\nfunction onlyChild(children) {\n  return Array.isArray(children) ? children[0] : children;\n}\n\nfunction createReactContext(defaultValue, calculateChangedBits) {\n  var _Provider$childContex, _Consumer$contextType;\n\n  var contextProp = '__create-react-context-' + getUniqueId() + '__';\n\n  var Provider = /*#__PURE__*/function (_Component) {\n    Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Provider, _Component);\n\n    function Provider() {\n      var _this;\n\n      _this = _Component.apply(this, arguments) || this;\n      _this.emitter = createEventEmitter(_this.props.value);\n      return _this;\n    }\n\n    var _proto = Provider.prototype;\n\n    _proto.getChildContext = function getChildContext() {\n      var _ref;\n\n      return _ref = {}, _ref[contextProp] = this.emitter, _ref;\n    };\n\n    _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      if (this.props.value !== nextProps.value) {\n        var oldValue = this.props.value;\n        var newValue = nextProps.value;\n        var changedBits;\n\n        if (objectIs(oldValue, newValue)) {\n          changedBits = 0;\n        } else {\n          changedBits = typeof calculateChangedBits === 'function' ? calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n\n          if (true) {\n            Object(tiny_warning__WEBPACK_IMPORTED_MODULE_3__[\"default\"])((changedBits & MAX_SIGNED_31_BIT_INT) === changedBits, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: ' + changedBits);\n          }\n\n          changedBits |= 0;\n\n          if (changedBits !== 0) {\n            this.emitter.set(nextProps.value, changedBits);\n          }\n        }\n      }\n    };\n\n    _proto.render = function render() {\n      return this.props.children;\n    };\n\n    return Provider;\n  }(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\n  Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[contextProp] = prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object.isRequired, _Provider$childContex);\n\n  var Consumer = /*#__PURE__*/function (_Component2) {\n    Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Consumer, _Component2);\n\n    function Consumer() {\n      var _this2;\n\n      _this2 = _Component2.apply(this, arguments) || this;\n      _this2.state = {\n        value: _this2.getValue()\n      };\n\n      _this2.onUpdate = function (newValue, changedBits) {\n        var observedBits = _this2.observedBits | 0;\n\n        if ((observedBits & changedBits) !== 0) {\n          _this2.setState({\n            value: _this2.getValue()\n          });\n        }\n      };\n\n      return _this2;\n    }\n\n    var _proto2 = Consumer.prototype;\n\n    _proto2.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      var observedBits = nextProps.observedBits;\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;\n    };\n\n    _proto2.componentDidMount = function componentDidMount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].on(this.onUpdate);\n      }\n\n      var observedBits = this.props.observedBits;\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;\n    };\n\n    _proto2.componentWillUnmount = function componentWillUnmount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].off(this.onUpdate);\n      }\n    };\n\n    _proto2.getValue = function getValue() {\n      if (this.context[contextProp]) {\n        return this.context[contextProp].get();\n      } else {\n        return defaultValue;\n      }\n    };\n\n    _proto2.render = function render() {\n      return onlyChild(this.props.children)(this.state.value);\n    };\n\n    return Consumer;\n  }(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\n  Consumer.contextTypes = (_Consumer$contextType = {}, _Consumer$contextType[contextProp] = prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object, _Consumer$contextType);\n  return {\n    Provider: Provider,\n    Consumer: Consumer\n  };\n}\n\nvar index = react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext || createReactContext;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (index);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/ms/index.js":
+/*!**********************************************!*\
+  !*** ./jaas-client/node_modules/ms/index.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/ms/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/object-assign/index.js":
+/*!*********************************************************!*\
+  !*** ./jaas-client/node_modules/object-assign/index.js ***!
+  \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/object-assign/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/parseqs/index.js":
+/*!***************************************************!*\
+  !*** ./jaas-client/node_modules/parseqs/index.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/**\r\n * Compiles a querystring\r\n * Returns string representation of the object\r\n *\r\n * @param {Object}\r\n * @api private\r\n */\r\n\r\nexports.encode = function (obj) {\r\n  var str = '';\r\n\r\n  for (var i in obj) {\r\n    if (obj.hasOwnProperty(i)) {\r\n      if (str.length) str += '&';\r\n      str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\r\n    }\r\n  }\r\n\r\n  return str;\r\n};\r\n\r\n/**\r\n * Parses a simple querystring into an object\r\n *\r\n * @param {String} qs\r\n * @api private\r\n */\r\n\r\nexports.decode = function(qs){\r\n  var qry = {};\r\n  var pairs = qs.split('&');\r\n  for (var i = 0, l = pairs.length; i < l; i++) {\r\n    var pair = pairs[i].split('=');\r\n    qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\r\n  }\r\n  return qry;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/parseqs/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/parseuri/index.js":
+/*!****************************************************!*\
+  !*** ./jaas-client/node_modules/parseuri/index.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/**\r\n * Parses an URI\r\n *\r\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\r\n * @api private\r\n */\r\n\r\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\r\n\r\nvar parts = [\r\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\r\n];\r\n\r\nmodule.exports = function parseuri(str) {\r\n    var src = str,\r\n        b = str.indexOf('['),\r\n        e = str.indexOf(']');\r\n\r\n    if (b != -1 && e != -1) {\r\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\r\n    }\r\n\r\n    var m = re.exec(str || ''),\r\n        uri = {},\r\n        i = 14;\r\n\r\n    while (i--) {\r\n        uri[parts[i]] = m[i] || '';\r\n    }\r\n\r\n    if (b != -1 && e != -1) {\r\n        uri.source = src;\r\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\r\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\r\n        uri.ipv6uri = true;\r\n    }\r\n\r\n    return uri;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/parseuri/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/path-to-regexp/index.js":
+/*!**********************************************************!*\
+  !*** ./jaas-client/node_modules/path-to-regexp/index.js ***!
+  \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var isarray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/isarray/index.js\")\n\n/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n  // Match escaped characters that would otherwise appear in future matches.\n  // This allows the user to escape special characters that won't transform.\n  '(\\\\\\\\.)',\n  // Match Express-style parameters and un-named parameters with a prefix\n  // and optional suffixes. Matches appear as:\n  //\n  // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n  // \"/route(\\\\d+)\"  => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n  // \"/*\"            => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n  '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param  {string}  str\n * @param  {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n  var tokens = []\n  var key = 0\n  var index = 0\n  var path = ''\n  var defaultDelimiter = options && options.delimiter || '/'\n  var res\n\n  while ((res = PATH_REGEXP.exec(str)) != null) {\n    var m = res[0]\n    var escaped = res[1]\n    var offset = res.index\n    path += str.slice(index, offset)\n    index = offset + m.length\n\n    // Ignore already escaped sequences.\n    if (escaped) {\n      path += escaped[1]\n      continue\n    }\n\n    var next = str[index]\n    var prefix = res[2]\n    var name = res[3]\n    var capture = res[4]\n    var group = res[5]\n    var modifier = res[6]\n    var asterisk = res[7]\n\n    // Push the current path onto the tokens.\n    if (path) {\n      tokens.push(path)\n      path = ''\n    }\n\n    var partial = prefix != null && next != null && next !== prefix\n    var repeat = modifier === '+' || modifier === '*'\n    var optional = modifier === '?' || modifier === '*'\n    var delimiter = res[2] || defaultDelimiter\n    var pattern = capture || group\n\n    tokens.push({\n      name: name || key++,\n      prefix: prefix || '',\n      delimiter: delimiter,\n      optional: optional,\n      repeat: repeat,\n      partial: partial,\n      asterisk: !!asterisk,\n      pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n    })\n  }\n\n  // Match any characters still remaining.\n  if (index < str.length) {\n    path += str.substr(index)\n  }\n\n  // If the path exists, push it onto the end.\n  if (path) {\n    tokens.push(path)\n  }\n\n  return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param  {string}             str\n * @param  {Object=}            options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n  return tokensToFunction(parse(str, options), options)\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n  return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n  return encodeURI(str).replace(/[?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens, options) {\n  // Compile all the tokens into regexps.\n  var matches = new Array(tokens.length)\n\n  // Compile all the patterns before compilation.\n  for (var i = 0; i < tokens.length; i++) {\n    if (typeof tokens[i] === 'object') {\n      matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options))\n    }\n  }\n\n  return function (obj, opts) {\n    var path = ''\n    var data = obj || {}\n    var options = opts || {}\n    var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent\n\n    for (var i = 0; i < tokens.length; i++) {\n      var token = tokens[i]\n\n      if (typeof token === 'string') {\n        path += token\n\n        continue\n      }\n\n      var value = data[token.name]\n      var segment\n\n      if (value == null) {\n        if (token.optional) {\n          // Prepend partial segment prefixes.\n          if (token.partial) {\n            path += token.prefix\n          }\n\n          continue\n        } else {\n          throw new TypeError('Expected \"' + token.name + '\" to be defined')\n        }\n      }\n\n      if (isarray(value)) {\n        if (!token.repeat) {\n          throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n        }\n\n        if (value.length === 0) {\n          if (token.optional) {\n            continue\n          } else {\n            throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n          }\n        }\n\n        for (var j = 0; j < value.length; j++) {\n          segment = encode(value[j])\n\n          if (!matches[i].test(segment)) {\n            throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n          }\n\n          path += (j === 0 ? token.prefix : token.delimiter) + segment\n        }\n\n        continue\n      }\n\n      segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n      if (!matches[i].test(segment)) {\n        throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n      }\n\n      path += token.prefix + segment\n    }\n\n    return path\n  }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param  {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n  return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param  {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n  return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param  {!RegExp} re\n * @param  {Array}   keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n  re.keys = keys\n  return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param  {Object} options\n * @return {string}\n */\nfunction flags (options) {\n  return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param  {!RegExp} path\n * @param  {!Array}  keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n  // Use a negative lookahead to match only capturing groups.\n  var groups = path.source.match(/\\((?!\\?)/g)\n\n  if (groups) {\n    for (var i = 0; i < groups.length; i++) {\n      keys.push({\n        name: i,\n        prefix: null,\n        delimiter: null,\n        optional: false,\n        repeat: false,\n        partial: false,\n        asterisk: false,\n        pattern: null\n      })\n    }\n  }\n\n  return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param  {!Array}  path\n * @param  {Array}   keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n  var parts = []\n\n  for (var i = 0; i < path.length; i++) {\n    parts.push(pathToRegexp(path[i], keys, options).source)\n  }\n\n  var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n  return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param  {string}  path\n * @param  {!Array}  keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n  return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param  {!Array}          tokens\n * @param  {(Array|Object)=} keys\n * @param  {Object=}         options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  var strict = options.strict\n  var end = options.end !== false\n  var route = ''\n\n  // Iterate over the tokens and create our regexp string.\n  for (var i = 0; i < tokens.length; i++) {\n    var token = tokens[i]\n\n    if (typeof token === 'string') {\n      route += escapeString(token)\n    } else {\n      var prefix = escapeString(token.prefix)\n      var capture = '(?:' + token.pattern + ')'\n\n      keys.push(token)\n\n      if (token.repeat) {\n        capture += '(?:' + prefix + capture + ')*'\n      }\n\n      if (token.optional) {\n        if (!token.partial) {\n          capture = '(?:' + prefix + '(' + capture + '))?'\n        } else {\n          capture = prefix + '(' + capture + ')?'\n        }\n      } else {\n        capture = prefix + '(' + capture + ')'\n      }\n\n      route += capture\n    }\n  }\n\n  var delimiter = escapeString(options.delimiter || '/')\n  var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n  // In non-strict mode we allow a slash at the end of match. If the path to\n  // match already ends with a slash, we remove it for consistency. The slash\n  // is valid at the end of a path match, not in the middle. This is important\n  // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n  if (!strict) {\n    route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n  }\n\n  if (end) {\n    route += '$'\n  } else {\n    // In non-ending mode, we need the capturing groups to match as much as\n    // possible by using a positive lookahead to the end or next path segment.\n    route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n  }\n\n  return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param  {(string|RegExp|Array)} path\n * @param  {(Array|Object)=}       keys\n * @param  {Object=}               options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  if (path instanceof RegExp) {\n    return regexpToRegexp(path, /** @type {!Array} */ (keys))\n  }\n\n  if (isarray(path)) {\n    return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n  }\n\n  return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/path-to-regexp/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/prop-types/checkPropTypes.js":
+/*!***************************************************************!*\
+  !*** ./jaas-client/node_modules/prop-types/checkPropTypes.js ***!
+  \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar printWarning = function() {};\n\nif (true) {\n  var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ \"./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js\");\n  var loggedTypeFailures = {};\n  var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n  printWarning = function(text) {\n    var message = 'Warning: ' + text;\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n  if (true) {\n    for (var typeSpecName in typeSpecs) {\n      if (has(typeSpecs, typeSpecName)) {\n        var error;\n        // Prop type validation may throw. In case they do, we don't want to\n        // fail the render phase where it didn't fail before. So we log it.\n        // After these have been cleaned up, we'll let them throw.\n        try {\n          // This is intentionally an invariant that gets caught. It's the same\n          // behavior as without this statement except with a better message.\n          if (typeof typeSpecs[typeSpecName] !== 'function') {\n            var err = Error(\n              (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n              'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'\n            );\n            err.name = 'Invariant Violation';\n            throw err;\n          }\n          error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n        } catch (ex) {\n          error = ex;\n        }\n        if (error && !(error instanceof Error)) {\n          printWarning(\n            (componentName || 'React class') + ': type specification of ' +\n            location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n            'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n            'You may have forgotten to pass an argument to the type checker ' +\n            'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n            'shape all require an argument).'\n          );\n        }\n        if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n          // Only monitor this failure once because there tends to be a lot of the\n          // same error.\n          loggedTypeFailures[error.message] = true;\n\n          var stack = getStack ? getStack() : '';\n\n          printWarning(\n            'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n          );\n        }\n      }\n    }\n  }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n  if (true) {\n    loggedTypeFailures = {};\n  }\n}\n\nmodule.exports = checkPropTypes;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/checkPropTypes.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js ***!
+  \************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactIs = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\nvar assign = __webpack_require__(/*! object-assign */ \"./jaas-client/node_modules/object-assign/index.js\");\n\nvar ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ \"./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js\");\nvar checkPropTypes = __webpack_require__(/*! ./checkPropTypes */ \"./jaas-client/node_modules/prop-types/checkPropTypes.js\");\n\nvar has = Function.call.bind(Object.prototype.hasOwnProperty);\nvar printWarning = function() {};\n\nif (true) {\n  printWarning = function(text) {\n    var message = 'Warning: ' + text;\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n  return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n  /* global Symbol */\n  var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n  var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n  /**\n   * Returns the iterator method function contained on the iterable object.\n   *\n   * Be sure to invoke the function with the iterable as context:\n   *\n   *     var iteratorFn = getIteratorFn(myIterable);\n   *     if (iteratorFn) {\n   *       var iterator = iteratorFn.call(myIterable);\n   *       ...\n   *     }\n   *\n   * @param {?object} maybeIterable\n   * @return {?function}\n   */\n  function getIteratorFn(maybeIterable) {\n    var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n    if (typeof iteratorFn === 'function') {\n      return iteratorFn;\n    }\n  }\n\n  /**\n   * Collection of methods that allow declaration and validation of props that are\n   * supplied to React components. Example usage:\n   *\n   *   var Props = require('ReactPropTypes');\n   *   var MyArticle = React.createClass({\n   *     propTypes: {\n   *       // An optional string prop named \"description\".\n   *       description: Props.string,\n   *\n   *       // A required enum prop named \"category\".\n   *       category: Props.oneOf(['News','Photos']).isRequired,\n   *\n   *       // A prop named \"dialog\" that requires an instance of Dialog.\n   *       dialog: Props.instanceOf(Dialog).isRequired\n   *     },\n   *     render: function() { ... }\n   *   });\n   *\n   * A more formal specification of how these methods are used:\n   *\n   *   type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n   *   decl := ReactPropTypes.{type}(.isRequired)?\n   *\n   * Each and every declaration produces a function with the same signature. This\n   * allows the creation of custom validation functions. For example:\n   *\n   *  var MyLink = React.createClass({\n   *    propTypes: {\n   *      // An optional string or URI prop named \"href\".\n   *      href: function(props, propName, componentName) {\n   *        var propValue = props[propName];\n   *        if (propValue != null && typeof propValue !== 'string' &&\n   *            !(propValue instanceof URI)) {\n   *          return new Error(\n   *            'Expected a string or an URI for ' + propName + ' in ' +\n   *            componentName\n   *          );\n   *        }\n   *      }\n   *    },\n   *    render: function() {...}\n   *  });\n   *\n   * @internal\n   */\n\n  var ANONYMOUS = '<<anonymous>>';\n\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n  var ReactPropTypes = {\n    array: createPrimitiveTypeChecker('array'),\n    bool: createPrimitiveTypeChecker('boolean'),\n    func: createPrimitiveTypeChecker('function'),\n    number: createPrimitiveTypeChecker('number'),\n    object: createPrimitiveTypeChecker('object'),\n    string: createPrimitiveTypeChecker('string'),\n    symbol: createPrimitiveTypeChecker('symbol'),\n\n    any: createAnyTypeChecker(),\n    arrayOf: createArrayOfTypeChecker,\n    element: createElementTypeChecker(),\n    elementType: createElementTypeTypeChecker(),\n    instanceOf: createInstanceTypeChecker,\n    node: createNodeChecker(),\n    objectOf: createObjectOfTypeChecker,\n    oneOf: createEnumTypeChecker,\n    oneOfType: createUnionTypeChecker,\n    shape: createShapeTypeChecker,\n    exact: createStrictShapeTypeChecker,\n  };\n\n  /**\n   * inlined Object.is polyfill to avoid requiring consumers ship their own\n   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n   */\n  /*eslint-disable no-self-compare*/\n  function is(x, y) {\n    // SameValue algorithm\n    if (x === y) {\n      // Steps 1-5, 7-10\n      // Steps 6.b-6.e: +0 != -0\n      return x !== 0 || 1 / x === 1 / y;\n    } else {\n      // Step 6.a: NaN == NaN\n      return x !== x && y !== y;\n    }\n  }\n  /*eslint-enable no-self-compare*/\n\n  /**\n   * We use an Error-like object for backward compatibility as people may call\n   * PropTypes directly and inspect their output. However, we don't use real\n   * Errors anymore. We don't inspect their stack anyway, and creating them\n   * is prohibitively expensive if they are created too often, such as what\n   * happens in oneOfType() for any type before the one that matched.\n   */\n  function PropTypeError(message) {\n    this.message = message;\n    this.stack = '';\n  }\n  // Make `instanceof Error` still work for returned errors.\n  PropTypeError.prototype = Error.prototype;\n\n  function createChainableTypeChecker(validate) {\n    if (true) {\n      var manualPropTypeCallCache = {};\n      var manualPropTypeWarningCount = 0;\n    }\n    function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n      componentName = componentName || ANONYMOUS;\n      propFullName = propFullName || propName;\n\n      if (secret !== ReactPropTypesSecret) {\n        if (throwOnDirectAccess) {\n          // New behavior only for users of `prop-types` package\n          var err = new Error(\n            'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n            'Use `PropTypes.checkPropTypes()` to call them. ' +\n            'Read more at http://fb.me/use-check-prop-types'\n          );\n          err.name = 'Invariant Violation';\n          throw err;\n        } else if ( true && typeof console !== 'undefined') {\n          // Old behavior for people using React.PropTypes\n          var cacheKey = componentName + ':' + propName;\n          if (\n            !manualPropTypeCallCache[cacheKey] &&\n            // Avoid spamming the console because they are often not actionable except for lib authors\n            manualPropTypeWarningCount < 3\n          ) {\n            printWarning(\n              'You are manually calling a React.PropTypes validation ' +\n              'function for the `' + propFullName + '` prop on `' + componentName  + '`. This is deprecated ' +\n              'and will throw in the standalone `prop-types` package. ' +\n              'You may be seeing this warning due to a third-party PropTypes ' +\n              'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n            );\n            manualPropTypeCallCache[cacheKey] = true;\n            manualPropTypeWarningCount++;\n          }\n        }\n      }\n      if (props[propName] == null) {\n        if (isRequired) {\n          if (props[propName] === null) {\n            return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n          }\n          return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n        }\n        return null;\n      } else {\n        return validate(props, propName, componentName, location, propFullName);\n      }\n    }\n\n    var chainedCheckType = checkType.bind(null, false);\n    chainedCheckType.isRequired = checkType.bind(null, true);\n\n    return chainedCheckType;\n  }\n\n  function createPrimitiveTypeChecker(expectedType) {\n    function validate(props, propName, componentName, location, propFullName, secret) {\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== expectedType) {\n        // `propValue` being instance of, say, date/regexp, pass the 'object'\n        // check, but we can offer a more precise error message here rather than\n        // 'of type `object`'.\n        var preciseType = getPreciseType(propValue);\n\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createAnyTypeChecker() {\n    return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n  }\n\n  function createArrayOfTypeChecker(typeChecker) {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (typeof typeChecker !== 'function') {\n        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n      }\n      var propValue = props[propName];\n      if (!Array.isArray(propValue)) {\n        var propType = getPropType(propValue);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n      }\n      for (var i = 0; i < propValue.length; i++) {\n        var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n        if (error instanceof Error) {\n          return error;\n        }\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createElementTypeChecker() {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      if (!isValidElement(propValue)) {\n        var propType = getPropType(propValue);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createElementTypeTypeChecker() {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      if (!ReactIs.isValidElementType(propValue)) {\n        var propType = getPropType(propValue);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createInstanceTypeChecker(expectedClass) {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (!(props[propName] instanceof expectedClass)) {\n        var expectedClassName = expectedClass.name || ANONYMOUS;\n        var actualClassName = getClassName(props[propName]);\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createEnumTypeChecker(expectedValues) {\n    if (!Array.isArray(expectedValues)) {\n      if (true) {\n        if (arguments.length > 1) {\n          printWarning(\n            'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n            'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n          );\n        } else {\n          printWarning('Invalid argument supplied to oneOf, expected an array.');\n        }\n      }\n      return emptyFunctionThatReturnsNull;\n    }\n\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      for (var i = 0; i < expectedValues.length; i++) {\n        if (is(propValue, expectedValues[i])) {\n          return null;\n        }\n      }\n\n      var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n        var type = getPreciseType(value);\n        if (type === 'symbol') {\n          return String(value);\n        }\n        return value;\n      });\n      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createObjectOfTypeChecker(typeChecker) {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (typeof typeChecker !== 'function') {\n        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n      }\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== 'object') {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n      }\n      for (var key in propValue) {\n        if (has(propValue, key)) {\n          var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n          if (error instanceof Error) {\n            return error;\n          }\n        }\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createUnionTypeChecker(arrayOfTypeCheckers) {\n    if (!Array.isArray(arrayOfTypeCheckers)) {\n       true ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : undefined;\n      return emptyFunctionThatReturnsNull;\n    }\n\n    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n      var checker = arrayOfTypeCheckers[i];\n      if (typeof checker !== 'function') {\n        printWarning(\n          'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n          'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n        );\n        return emptyFunctionThatReturnsNull;\n      }\n    }\n\n    function validate(props, propName, componentName, location, propFullName) {\n      for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n        var checker = arrayOfTypeCheckers[i];\n        if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {\n          return null;\n        }\n      }\n\n      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createNodeChecker() {\n    function validate(props, propName, componentName, location, propFullName) {\n      if (!isNode(props[propName])) {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createShapeTypeChecker(shapeTypes) {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== 'object') {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n      }\n      for (var key in shapeTypes) {\n        var checker = shapeTypes[key];\n        if (!checker) {\n          continue;\n        }\n        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n        if (error) {\n          return error;\n        }\n      }\n      return null;\n    }\n    return createChainableTypeChecker(validate);\n  }\n\n  function createStrictShapeTypeChecker(shapeTypes) {\n    function validate(props, propName, componentName, location, propFullName) {\n      var propValue = props[propName];\n      var propType = getPropType(propValue);\n      if (propType !== 'object') {\n        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n      }\n      // We need to check all keys in case some are required but missing from\n      // props.\n      var allKeys = assign({}, props[propName], shapeTypes);\n      for (var key in allKeys) {\n        var checker = shapeTypes[key];\n        if (!checker) {\n          return new PropTypeError(\n            'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n            '\\nBad object: ' + JSON.stringify(props[propName], null, '  ') +\n            '\\nValid keys: ' +  JSON.stringify(Object.keys(shapeTypes), null, '  ')\n          );\n        }\n        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n        if (error) {\n          return error;\n        }\n      }\n      return null;\n    }\n\n    return createChainableTypeChecker(validate);\n  }\n\n  function isNode(propValue) {\n    switch (typeof propValue) {\n      case 'number':\n      case 'string':\n      case 'undefined':\n        return true;\n      case 'boolean':\n        return !propValue;\n      case 'object':\n        if (Array.isArray(propValue)) {\n          return propValue.every(isNode);\n        }\n        if (propValue === null || isValidElement(propValue)) {\n          return true;\n        }\n\n        var iteratorFn = getIteratorFn(propValue);\n        if (iteratorFn) {\n          var iterator = iteratorFn.call(propValue);\n          var step;\n          if (iteratorFn !== propValue.entries) {\n            while (!(step = iterator.next()).done) {\n              if (!isNode(step.value)) {\n                return false;\n              }\n            }\n          } else {\n            // Iterator will provide entry [k,v] tuples rather than values.\n            while (!(step = iterator.next()).done) {\n              var entry = step.value;\n              if (entry) {\n                if (!isNode(entry[1])) {\n                  return false;\n                }\n              }\n            }\n          }\n        } else {\n          return false;\n        }\n\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  function isSymbol(propType, propValue) {\n    // Native Symbol.\n    if (propType === 'symbol') {\n      return true;\n    }\n\n    // falsy value can't be a Symbol\n    if (!propValue) {\n      return false;\n    }\n\n    // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n    if (propValue['@@toStringTag'] === 'Symbol') {\n      return true;\n    }\n\n    // Fallback for non-spec compliant Symbols which are polyfilled.\n    if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n      return true;\n    }\n\n    return false;\n  }\n\n  // Equivalent of `typeof` but with special handling for array and regexp.\n  function getPropType(propValue) {\n    var propType = typeof propValue;\n    if (Array.isArray(propValue)) {\n      return 'array';\n    }\n    if (propValue instanceof RegExp) {\n      // Old webkits (at least until Android 4.0) return 'function' rather than\n      // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n      // passes PropTypes.object.\n      return 'object';\n    }\n    if (isSymbol(propType, propValue)) {\n      return 'symbol';\n    }\n    return propType;\n  }\n\n  // This handles more types than `getPropType`. Only used for error messages.\n  // See `createPrimitiveTypeChecker`.\n  function getPreciseType(propValue) {\n    if (typeof propValue === 'undefined' || propValue === null) {\n      return '' + propValue;\n    }\n    var propType = getPropType(propValue);\n    if (propType === 'object') {\n      if (propValue instanceof Date) {\n        return 'date';\n      } else if (propValue instanceof RegExp) {\n        return 'regexp';\n      }\n    }\n    return propType;\n  }\n\n  // Returns a string that is postfixed to a warning about an invalid type.\n  // For example, \"undefined\" or \"of type array\"\n  function getPostfixForTypeWarning(value) {\n    var type = getPreciseType(value);\n    switch (type) {\n      case 'array':\n      case 'object':\n        return 'an ' + type;\n      case 'boolean':\n      case 'date':\n      case 'regexp':\n        return 'a ' + type;\n      default:\n        return type;\n    }\n  }\n\n  // Returns class name of the object, if any.\n  function getClassName(propValue) {\n    if (!propValue.constructor || !propValue.constructor.name) {\n      return ANONYMOUS;\n    }\n    return propValue.constructor.name;\n  }\n\n  ReactPropTypes.checkPropTypes = checkPropTypes;\n  ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/prop-types/index.js":
+/*!******************************************************!*\
+  !*** ./jaas-client/node_modules/prop-types/index.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (true) {\n  var ReactIs = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = __webpack_require__(/*! ./factoryWithTypeCheckers */ \"./jaas-client/node_modules/prop-types/factoryWithTypeCheckers.js\")(ReactIs.isElement, throwOnDirectAccess);\n} else {}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js ***!
+  \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/prop-types/lib/ReactPropTypesSecret.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-dom/cjs/react-dom.development.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-dom/cjs/react-dom.development.js ***!
+  \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/** @license React v16.13.1\n * react-dom.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar React = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\nvar _assign = __webpack_require__(/*! object-assign */ \"./jaas-client/node_modules/object-assign/index.js\");\nvar Scheduler = __webpack_require__(/*! scheduler */ \"./jaas-client/node_modules/scheduler/index.js\");\nvar checkPropTypes = __webpack_require__(/*! prop-types/checkPropTypes */ \"./jaas-client/node_modules/prop-types/checkPropTypes.js\");\nvar tracing = __webpack_require__(/*! scheduler/tracing */ \"./jaas-client/node_modules/scheduler/tracing.js\");\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; // Prevent newer renderers from RTE when used with older react package versions.\n// Current owner and dispatcher used to share the same ref,\n// but PR #14548 split them out to better support the react-debug-tools package.\n\nif (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) {\n  ReactSharedInternals.ReactCurrentDispatcher = {\n    current: null\n  };\n}\n\nif (!ReactSharedInternals.hasOwnProperty('ReactCurrentBatchConfig')) {\n  ReactSharedInternals.ReactCurrentBatchConfig = {\n    suspense: null\n  };\n}\n\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n  {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    printWarning('warn', format, args);\n  }\n}\nfunction error(format) {\n  {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n\n    printWarning('error', format, args);\n  }\n}\n\nfunction printWarning(level, format, args) {\n  // When changing this logic, you might want to also\n  // update consoleWithStackDev.www.js as well.\n  {\n    var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\\n    in') === 0;\n\n    if (!hasExistingStack) {\n      var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n      var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n      if (stack !== '') {\n        format += '%s';\n        args = args.concat([stack]);\n      }\n    }\n\n    var argsWithFormat = args.map(function (item) {\n      return '' + item;\n    }); // Careful: RN currently depends on this prefix\n\n    argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n    // breaks IE9: https://github.com/facebook/react/issues/13610\n    // eslint-disable-next-line react-internal/no-production-logging\n\n    Function.prototype.apply.call(console[level], console, argsWithFormat);\n\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      var argIndex = 0;\n      var message = 'Warning: ' + format.replace(/%s/g, function () {\n        return args[argIndex++];\n      });\n      throw new Error(message);\n    } catch (x) {}\n  }\n}\n\nif (!React) {\n  {\n    throw Error( \"ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.\" );\n  }\n}\n\nvar invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) {\n  var funcArgs = Array.prototype.slice.call(arguments, 3);\n\n  try {\n    func.apply(context, funcArgs);\n  } catch (error) {\n    this.onError(error);\n  }\n};\n\n{\n  // In DEV mode, we swap out invokeGuardedCallback for a special version\n  // that plays more nicely with the browser's DevTools. The idea is to preserve\n  // \"Pause on exceptions\" behavior. Because React wraps all user-provided\n  // functions in invokeGuardedCallback, and the production version of\n  // invokeGuardedCallback uses a try-catch, all user exceptions are treated\n  // like caught exceptions, and the DevTools won't pause unless the developer\n  // takes the extra step of enabling pause on caught exceptions. This is\n  // unintuitive, though, because even though React has caught the error, from\n  // the developer's perspective, the error is uncaught.\n  //\n  // To preserve the expected \"Pause on exceptions\" behavior, we don't use a\n  // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake\n  // DOM node, and call the user-provided callback from inside an event handler\n  // for that fake event. If the callback throws, the error is \"captured\" using\n  // a global event handler. But because the error happens in a different\n  // event loop context, it does not interrupt the normal program flow.\n  // Effectively, this gives us try-catch behavior without actually using\n  // try-catch. Neat!\n  // Check that the browser supports the APIs we need to implement our special\n  // DEV version of invokeGuardedCallback\n  if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {\n    var fakeNode = document.createElement('react');\n\n    var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) {\n      // If document doesn't exist we know for sure we will crash in this method\n      // when we call document.createEvent(). However this can cause confusing\n      // errors: https://github.com/facebookincubator/create-react-app/issues/3482\n      // So we preemptively throw with a better message instead.\n      if (!(typeof document !== 'undefined')) {\n        {\n          throw Error( \"The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.\" );\n        }\n      }\n\n      var evt = document.createEvent('Event'); // Keeps track of whether the user-provided callback threw an error. We\n      // set this to true at the beginning, then set it to false right after\n      // calling the function. If the function errors, `didError` will never be\n      // set to false. This strategy works even if the browser is flaky and\n      // fails to call our global error handler, because it doesn't rely on\n      // the error event at all.\n\n      var didError = true; // Keeps track of the value of window.event so that we can reset it\n      // during the callback to let user code access window.event in the\n      // browsers that support it.\n\n      var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event\n      // dispatching: https://github.com/facebook/react/issues/13688\n\n      var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); // Create an event handler for our fake event. We will synchronously\n      // dispatch our fake event using `dispatchEvent`. Inside the handler, we\n      // call the user-provided callback.\n\n      var funcArgs = Array.prototype.slice.call(arguments, 3);\n\n      function callCallback() {\n        // We immediately remove the callback from event listeners so that\n        // nested `invokeGuardedCallback` calls do not clash. Otherwise, a\n        // nested call would trigger the fake event handlers of any call higher\n        // in the stack.\n        fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the\n        // window.event assignment in both IE <= 10 as they throw an error\n        // \"Member not found\" in strict mode, and in Firefox which does not\n        // support window.event.\n\n        if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {\n          window.event = windowEvent;\n        }\n\n        func.apply(context, funcArgs);\n        didError = false;\n      } // Create a global error event handler. We use this to capture the value\n      // that was thrown. It's possible that this error handler will fire more\n      // than once; for example, if non-React code also calls `dispatchEvent`\n      // and a handler for that event throws. We should be resilient to most of\n      // those cases. Even if our error event handler fires more than once, the\n      // last error event is always used. If the callback actually does error,\n      // we know that the last error event is the correct one, because it's not\n      // possible for anything else to have happened in between our callback\n      // erroring and the code that follows the `dispatchEvent` call below. If\n      // the callback doesn't error, but the error event was fired, we know to\n      // ignore it because `didError` will be false, as described above.\n\n\n      var error; // Use this to track whether the error event is ever called.\n\n      var didSetError = false;\n      var isCrossOriginError = false;\n\n      function handleWindowError(event) {\n        error = event.error;\n        didSetError = true;\n\n        if (error === null && event.colno === 0 && event.lineno === 0) {\n          isCrossOriginError = true;\n        }\n\n        if (event.defaultPrevented) {\n          // Some other error handler has prevented default.\n          // Browsers silence the error report if this happens.\n          // We'll remember this to later decide whether to log it or not.\n          if (error != null && typeof error === 'object') {\n            try {\n              error._suppressLogging = true;\n            } catch (inner) {// Ignore.\n            }\n          }\n        }\n      } // Create a fake event type.\n\n\n      var evtType = \"react-\" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers\n\n      window.addEventListener('error', handleWindowError);\n      fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function\n      // errors, it will trigger our global error handler.\n\n      evt.initEvent(evtType, false, false);\n      fakeNode.dispatchEvent(evt);\n\n      if (windowEventDescriptor) {\n        Object.defineProperty(window, 'event', windowEventDescriptor);\n      }\n\n      if (didError) {\n        if (!didSetError) {\n          // The callback errored, but the error event never fired.\n          error = new Error('An error was thrown inside one of your components, but React ' + \"doesn't know what it was. This is likely due to browser \" + 'flakiness. React does its best to preserve the \"Pause on ' + 'exceptions\" behavior of the DevTools, which requires some ' + \"DEV-mode only tricks. It's possible that these don't work in \" + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');\n        } else if (isCrossOriginError) {\n          error = new Error(\"A cross-origin error was thrown. React doesn't have access to \" + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.');\n        }\n\n        this.onError(error);\n      } // Remove our event listeners\n\n\n      window.removeEventListener('error', handleWindowError);\n    };\n\n    invokeGuardedCallbackImpl = invokeGuardedCallbackDev;\n  }\n}\n\nvar invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;\n\nvar hasError = false;\nvar caughtError = null; // Used by event system to capture/rethrow the first error.\n\nvar hasRethrowError = false;\nvar rethrowError = null;\nvar reporter = {\n  onError: function (error) {\n    hasError = true;\n    caughtError = error;\n  }\n};\n/**\n * Call a function while guarding against errors that happens within it.\n * Returns an error if it throws, otherwise null.\n *\n * In production, this is implemented using a try-catch. The reason we don't\n * use a try-catch directly is so that we can swap out a different\n * implementation in DEV mode.\n *\n * @param {String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} context The context to use when calling the function\n * @param {...*} args Arguments for function\n */\n\nfunction invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {\n  hasError = false;\n  caughtError = null;\n  invokeGuardedCallbackImpl$1.apply(reporter, arguments);\n}\n/**\n * Same as invokeGuardedCallback, but instead of returning an error, it stores\n * it in a global so it can be rethrown by `rethrowCaughtError` later.\n * TODO: See if caughtError and rethrowError can be unified.\n *\n * @param {String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} context The context to use when calling the function\n * @param {...*} args Arguments for function\n */\n\nfunction invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {\n  invokeGuardedCallback.apply(this, arguments);\n\n  if (hasError) {\n    var error = clearCaughtError();\n\n    if (!hasRethrowError) {\n      hasRethrowError = true;\n      rethrowError = error;\n    }\n  }\n}\n/**\n * During execution of guarded functions we will capture the first error which\n * we will rethrow to be handled by the top level error handler.\n */\n\nfunction rethrowCaughtError() {\n  if (hasRethrowError) {\n    var error = rethrowError;\n    hasRethrowError = false;\n    rethrowError = null;\n    throw error;\n  }\n}\nfunction hasCaughtError() {\n  return hasError;\n}\nfunction clearCaughtError() {\n  if (hasError) {\n    var error = caughtError;\n    hasError = false;\n    caughtError = null;\n    return error;\n  } else {\n    {\n      {\n        throw Error( \"clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n}\n\nvar getFiberCurrentPropsFromNode = null;\nvar getInstanceFromNode = null;\nvar getNodeFromInstance = null;\nfunction setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) {\n  getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl;\n  getInstanceFromNode = getInstanceFromNodeImpl;\n  getNodeFromInstance = getNodeFromInstanceImpl;\n\n  {\n    if (!getNodeFromInstance || !getInstanceFromNode) {\n      error('EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.');\n    }\n  }\n}\nvar validateEventDispatches;\n\n{\n  validateEventDispatches = function (event) {\n    var dispatchListeners = event._dispatchListeners;\n    var dispatchInstances = event._dispatchInstances;\n    var listenersIsArr = Array.isArray(dispatchListeners);\n    var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;\n    var instancesIsArr = Array.isArray(dispatchInstances);\n    var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;\n\n    if (instancesIsArr !== listenersIsArr || instancesLen !== listenersLen) {\n      error('EventPluginUtils: Invalid `event`.');\n    }\n  };\n}\n/**\n * Dispatch the event to the listener.\n * @param {SyntheticEvent} event SyntheticEvent to handle\n * @param {function} listener Application-level callback\n * @param {*} inst Internal component instance\n */\n\n\nfunction executeDispatch(event, listener, inst) {\n  var type = event.type || 'unknown-event';\n  event.currentTarget = getNodeFromInstance(inst);\n  invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);\n  event.currentTarget = null;\n}\n/**\n * Standard/simple iteration through an event's collected dispatches.\n */\n\nfunction executeDispatchesInOrder(event) {\n  var dispatchListeners = event._dispatchListeners;\n  var dispatchInstances = event._dispatchInstances;\n\n  {\n    validateEventDispatches(event);\n  }\n\n  if (Array.isArray(dispatchListeners)) {\n    for (var i = 0; i < dispatchListeners.length; i++) {\n      if (event.isPropagationStopped()) {\n        break;\n      } // Listeners and Instances are two parallel arrays that are always in sync.\n\n\n      executeDispatch(event, dispatchListeners[i], dispatchInstances[i]);\n    }\n  } else if (dispatchListeners) {\n    executeDispatch(event, dispatchListeners, dispatchInstances);\n  }\n\n  event._dispatchListeners = null;\n  event._dispatchInstances = null;\n}\n\nvar FunctionComponent = 0;\nvar ClassComponent = 1;\nvar IndeterminateComponent = 2; // Before we know whether it is function or class\n\nvar HostRoot = 3; // Root of a host tree. Could be nested inside another node.\n\nvar HostPortal = 4; // A subtree. Could be an entry point to a different renderer.\n\nvar HostComponent = 5;\nvar HostText = 6;\nvar Fragment = 7;\nvar Mode = 8;\nvar ContextConsumer = 9;\nvar ContextProvider = 10;\nvar ForwardRef = 11;\nvar Profiler = 12;\nvar SuspenseComponent = 13;\nvar MemoComponent = 14;\nvar SimpleMemoComponent = 15;\nvar LazyComponent = 16;\nvar IncompleteClassComponent = 17;\nvar DehydratedFragment = 18;\nvar SuspenseListComponent = 19;\nvar FundamentalComponent = 20;\nvar ScopeComponent = 21;\nvar Block = 22;\n\n/**\n * Injectable ordering of event plugins.\n */\nvar eventPluginOrder = null;\n/**\n * Injectable mapping from names to event plugin modules.\n */\n\nvar namesToPlugins = {};\n/**\n * Recomputes the plugin list using the injected plugins and plugin ordering.\n *\n * @private\n */\n\nfunction recomputePluginOrdering() {\n  if (!eventPluginOrder) {\n    // Wait until an `eventPluginOrder` is injected.\n    return;\n  }\n\n  for (var pluginName in namesToPlugins) {\n    var pluginModule = namesToPlugins[pluginName];\n    var pluginIndex = eventPluginOrder.indexOf(pluginName);\n\n    if (!(pluginIndex > -1)) {\n      {\n        throw Error( \"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `\" + pluginName + \"`.\" );\n      }\n    }\n\n    if (plugins[pluginIndex]) {\n      continue;\n    }\n\n    if (!pluginModule.extractEvents) {\n      {\n        throw Error( \"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `\" + pluginName + \"` does not.\" );\n      }\n    }\n\n    plugins[pluginIndex] = pluginModule;\n    var publishedEvents = pluginModule.eventTypes;\n\n    for (var eventName in publishedEvents) {\n      if (!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName)) {\n        {\n          throw Error( \"EventPluginRegistry: Failed to publish event `\" + eventName + \"` for plugin `\" + pluginName + \"`.\" );\n        }\n      }\n    }\n  }\n}\n/**\n * Publishes an event so that it can be dispatched by the supplied plugin.\n *\n * @param {object} dispatchConfig Dispatch configuration for the event.\n * @param {object} PluginModule Plugin publishing the event.\n * @return {boolean} True if the event was successfully published.\n * @private\n */\n\n\nfunction publishEventForPlugin(dispatchConfig, pluginModule, eventName) {\n  if (!!eventNameDispatchConfigs.hasOwnProperty(eventName)) {\n    {\n      throw Error( \"EventPluginRegistry: More than one plugin attempted to publish the same event name, `\" + eventName + \"`.\" );\n    }\n  }\n\n  eventNameDispatchConfigs[eventName] = dispatchConfig;\n  var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n\n  if (phasedRegistrationNames) {\n    for (var phaseName in phasedRegistrationNames) {\n      if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n        var phasedRegistrationName = phasedRegistrationNames[phaseName];\n        publishRegistrationName(phasedRegistrationName, pluginModule, eventName);\n      }\n    }\n\n    return true;\n  } else if (dispatchConfig.registrationName) {\n    publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);\n    return true;\n  }\n\n  return false;\n}\n/**\n * Publishes a registration name that is used to identify dispatched events.\n *\n * @param {string} registrationName Registration name to add.\n * @param {object} PluginModule Plugin publishing the event.\n * @private\n */\n\n\nfunction publishRegistrationName(registrationName, pluginModule, eventName) {\n  if (!!registrationNameModules[registrationName]) {\n    {\n      throw Error( \"EventPluginRegistry: More than one plugin attempted to publish the same registration name, `\" + registrationName + \"`.\" );\n    }\n  }\n\n  registrationNameModules[registrationName] = pluginModule;\n  registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;\n\n  {\n    var lowerCasedName = registrationName.toLowerCase();\n    possibleRegistrationNames[lowerCasedName] = registrationName;\n\n    if (registrationName === 'onDoubleClick') {\n      possibleRegistrationNames.ondblclick = registrationName;\n    }\n  }\n}\n/**\n * Registers plugins so that they can extract and dispatch events.\n */\n\n/**\n * Ordered list of injected plugins.\n */\n\n\nvar plugins = [];\n/**\n * Mapping from event name to dispatch config\n */\n\nvar eventNameDispatchConfigs = {};\n/**\n * Mapping from registration name to plugin module\n */\n\nvar registrationNameModules = {};\n/**\n * Mapping from registration name to event name\n */\n\nvar registrationNameDependencies = {};\n/**\n * Mapping from lowercase registration names to the properly cased version,\n * used to warn in the case of missing event handlers. Available\n * only in true.\n * @type {Object}\n */\n\nvar possibleRegistrationNames =  {} ; // Trust the developer to only use possibleRegistrationNames in true\n\n/**\n * Injects an ordering of plugins (by plugin name). This allows the ordering\n * to be decoupled from injection of the actual plugins so that ordering is\n * always deterministic regardless of packaging, on-the-fly injection, etc.\n *\n * @param {array} InjectedEventPluginOrder\n * @internal\n */\n\nfunction injectEventPluginOrder(injectedEventPluginOrder) {\n  if (!!eventPluginOrder) {\n    {\n      throw Error( \"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.\" );\n    }\n  } // Clone the ordering so it cannot be dynamically mutated.\n\n\n  eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);\n  recomputePluginOrdering();\n}\n/**\n * Injects plugins to be used by plugin event system. The plugin names must be\n * in the ordering injected by `injectEventPluginOrder`.\n *\n * Plugins can be injected as part of page initialization or on-the-fly.\n *\n * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n * @internal\n */\n\nfunction injectEventPluginsByName(injectedNamesToPlugins) {\n  var isOrderingDirty = false;\n\n  for (var pluginName in injectedNamesToPlugins) {\n    if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n      continue;\n    }\n\n    var pluginModule = injectedNamesToPlugins[pluginName];\n\n    if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {\n      if (!!namesToPlugins[pluginName]) {\n        {\n          throw Error( \"EventPluginRegistry: Cannot inject two different event plugins using the same name, `\" + pluginName + \"`.\" );\n        }\n      }\n\n      namesToPlugins[pluginName] = pluginModule;\n      isOrderingDirty = true;\n    }\n  }\n\n  if (isOrderingDirty) {\n    recomputePluginOrdering();\n  }\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');\n\nvar PLUGIN_EVENT_SYSTEM = 1;\nvar IS_REPLAYED = 1 << 5;\nvar IS_FIRST_ANCESTOR = 1 << 6;\n\nvar restoreImpl = null;\nvar restoreTarget = null;\nvar restoreQueue = null;\n\nfunction restoreStateOfTarget(target) {\n  // We perform this translation at the end of the event loop so that we\n  // always receive the correct fiber here\n  var internalInstance = getInstanceFromNode(target);\n\n  if (!internalInstance) {\n    // Unmounted\n    return;\n  }\n\n  if (!(typeof restoreImpl === 'function')) {\n    {\n      throw Error( \"setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted.\n\n  if (stateNode) {\n    var _props = getFiberCurrentPropsFromNode(stateNode);\n\n    restoreImpl(internalInstance.stateNode, internalInstance.type, _props);\n  }\n}\n\nfunction setRestoreImplementation(impl) {\n  restoreImpl = impl;\n}\nfunction enqueueStateRestore(target) {\n  if (restoreTarget) {\n    if (restoreQueue) {\n      restoreQueue.push(target);\n    } else {\n      restoreQueue = [target];\n    }\n  } else {\n    restoreTarget = target;\n  }\n}\nfunction needsStateRestore() {\n  return restoreTarget !== null || restoreQueue !== null;\n}\nfunction restoreStateIfNeeded() {\n  if (!restoreTarget) {\n    return;\n  }\n\n  var target = restoreTarget;\n  var queuedTargets = restoreQueue;\n  restoreTarget = null;\n  restoreQueue = null;\n  restoreStateOfTarget(target);\n\n  if (queuedTargets) {\n    for (var i = 0; i < queuedTargets.length; i++) {\n      restoreStateOfTarget(queuedTargets[i]);\n    }\n  }\n}\n\nvar enableProfilerTimer = true; // Trace which interactions trigger each commit.\n\nvar enableDeprecatedFlareAPI = false; // Experimental Host Component support.\n\nvar enableFundamentalAPI = false; // Experimental Scope support.\nvar warnAboutStringRefs = false;\n\n// the renderer. Such as when we're dispatching events or if third party\n// libraries need to call batchedUpdates. Eventually, this API will go away when\n// everything is batched by default. We'll then have a similar API to opt-out of\n// scheduled work and instead do synchronous work.\n// Defaults\n\nvar batchedUpdatesImpl = function (fn, bookkeeping) {\n  return fn(bookkeeping);\n};\n\nvar discreteUpdatesImpl = function (fn, a, b, c, d) {\n  return fn(a, b, c, d);\n};\n\nvar flushDiscreteUpdatesImpl = function () {};\n\nvar batchedEventUpdatesImpl = batchedUpdatesImpl;\nvar isInsideEventHandler = false;\nvar isBatchingEventUpdates = false;\n\nfunction finishEventHandler() {\n  // Here we wait until all updates have propagated, which is important\n  // when using controlled components within layers:\n  // https://github.com/facebook/react/issues/1698\n  // Then we restore state of any controlled component.\n  var controlledComponentsHavePendingUpdates = needsStateRestore();\n\n  if (controlledComponentsHavePendingUpdates) {\n    // If a controlled event was fired, we may need to restore the state of\n    // the DOM node back to the controlled value. This is necessary when React\n    // bails out of the update without touching the DOM.\n    flushDiscreteUpdatesImpl();\n    restoreStateIfNeeded();\n  }\n}\n\nfunction batchedUpdates(fn, bookkeeping) {\n  if (isInsideEventHandler) {\n    // If we are currently inside another batch, we need to wait until it\n    // fully completes before restoring state.\n    return fn(bookkeeping);\n  }\n\n  isInsideEventHandler = true;\n\n  try {\n    return batchedUpdatesImpl(fn, bookkeeping);\n  } finally {\n    isInsideEventHandler = false;\n    finishEventHandler();\n  }\n}\nfunction batchedEventUpdates(fn, a, b) {\n  if (isBatchingEventUpdates) {\n    // If we are currently inside another batch, we need to wait until it\n    // fully completes before restoring state.\n    return fn(a, b);\n  }\n\n  isBatchingEventUpdates = true;\n\n  try {\n    return batchedEventUpdatesImpl(fn, a, b);\n  } finally {\n    isBatchingEventUpdates = false;\n    finishEventHandler();\n  }\n} // This is for the React Flare event system\nfunction discreteUpdates(fn, a, b, c, d) {\n  var prevIsInsideEventHandler = isInsideEventHandler;\n  isInsideEventHandler = true;\n\n  try {\n    return discreteUpdatesImpl(fn, a, b, c, d);\n  } finally {\n    isInsideEventHandler = prevIsInsideEventHandler;\n\n    if (!isInsideEventHandler) {\n      finishEventHandler();\n    }\n  }\n}\nfunction flushDiscreteUpdatesIfNeeded(timeStamp) {\n  // event.timeStamp isn't overly reliable due to inconsistencies in\n  // how different browsers have historically provided the time stamp.\n  // Some browsers provide high-resolution time stamps for all events,\n  // some provide low-resolution time stamps for all events. FF < 52\n  // even mixes both time stamps together. Some browsers even report\n  // negative time stamps or time stamps that are 0 (iOS9) in some cases.\n  // Given we are only comparing two time stamps with equality (!==),\n  // we are safe from the resolution differences. If the time stamp is 0\n  // we bail-out of preventing the flush, which can affect semantics,\n  // such as if an earlier flush removes or adds event listeners that\n  // are fired in the subsequent flush. However, this is the same\n  // behaviour as we had before this change, so the risks are low.\n  if (!isInsideEventHandler && (!enableDeprecatedFlareAPI  )) {\n    flushDiscreteUpdatesImpl();\n  }\n}\nfunction setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) {\n  batchedUpdatesImpl = _batchedUpdatesImpl;\n  discreteUpdatesImpl = _discreteUpdatesImpl;\n  flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl;\n  batchedEventUpdatesImpl = _batchedEventUpdatesImpl;\n}\n\nvar DiscreteEvent = 0;\nvar UserBlockingEvent = 1;\nvar ContinuousEvent = 2;\n\n// A reserved attribute.\n// It is handled by React separately and shouldn't be written to the DOM.\nvar RESERVED = 0; // A simple string attribute.\n// Attributes that aren't in the whitelist are presumed to have this type.\n\nvar STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called\n// \"enumerated\" attributes with \"true\" and \"false\" as possible values.\n// When true, it should be set to a \"true\" string.\n// When false, it should be set to a \"false\" string.\n\nvar BOOLEANISH_STRING = 2; // A real boolean attribute.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n\nvar BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n// For any other value, should be present with that value.\n\nvar OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.\n// When falsy, it should be removed.\n\nvar NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.\n// When falsy, it should be removed.\n\nvar POSITIVE_NUMERIC = 6;\n\n/* eslint-disable max-len */\nvar ATTRIBUTE_NAME_START_CHAR = \":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n/* eslint-enable max-len */\n\nvar ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + \"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\nvar ROOT_ATTRIBUTE_NAME = 'data-reactroot';\nvar VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar illegalAttributeNameCache = {};\nvar validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n  if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {\n    return true;\n  }\n\n  if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {\n    return false;\n  }\n\n  if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {\n    validatedAttributeNameCache[attributeName] = true;\n    return true;\n  }\n\n  illegalAttributeNameCache[attributeName] = true;\n\n  {\n    error('Invalid attribute name: `%s`', attributeName);\n  }\n\n  return false;\n}\nfunction shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {\n  if (propertyInfo !== null) {\n    return propertyInfo.type === RESERVED;\n  }\n\n  if (isCustomComponentTag) {\n    return false;\n  }\n\n  if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {\n    return true;\n  }\n\n  return false;\n}\nfunction shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {\n  if (propertyInfo !== null && propertyInfo.type === RESERVED) {\n    return false;\n  }\n\n  switch (typeof value) {\n    case 'function': // $FlowIssue symbol is perfectly valid here\n\n    case 'symbol':\n      // eslint-disable-line\n      return true;\n\n    case 'boolean':\n      {\n        if (isCustomComponentTag) {\n          return false;\n        }\n\n        if (propertyInfo !== null) {\n          return !propertyInfo.acceptsBooleans;\n        } else {\n          var prefix = name.toLowerCase().slice(0, 5);\n          return prefix !== 'data-' && prefix !== 'aria-';\n        }\n      }\n\n    default:\n      return false;\n  }\n}\nfunction shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {\n  if (value === null || typeof value === 'undefined') {\n    return true;\n  }\n\n  if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {\n    return true;\n  }\n\n  if (isCustomComponentTag) {\n    return false;\n  }\n\n  if (propertyInfo !== null) {\n    switch (propertyInfo.type) {\n      case BOOLEAN:\n        return !value;\n\n      case OVERLOADED_BOOLEAN:\n        return value === false;\n\n      case NUMERIC:\n        return isNaN(value);\n\n      case POSITIVE_NUMERIC:\n        return isNaN(value) || value < 1;\n    }\n  }\n\n  return false;\n}\nfunction getPropertyInfo(name) {\n  return properties.hasOwnProperty(name) ? properties[name] : null;\n}\n\nfunction PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL) {\n  this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;\n  this.attributeName = attributeName;\n  this.attributeNamespace = attributeNamespace;\n  this.mustUseProperty = mustUseProperty;\n  this.propertyName = name;\n  this.type = type;\n  this.sanitizeURL = sanitizeURL;\n} // When adding attributes to this list, be sure to also add them to\n// the `possibleStandardNames` module to ensure casing and incorrect\n// name warnings.\n\n\nvar properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.\n\nvar reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular\n// elements (not just inputs). Now that ReactDOMInput assigns to the\n// defaultValue property -- do we need this?\n'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];\n\nreservedProps.forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // A few React string attributes have a different name.\n// This is a mapping from React prop names to the attribute names.\n\n[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {\n  var name = _ref[0],\n      attributeName = _ref[1];\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are \"enumerated\" HTML attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n\n['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n  name.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are \"enumerated\" SVG attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n// Since these are SVG attributes, their attribute names are case-sensitive.\n\n['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML boolean attributes.\n\n['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM\n// on the client side because the browsers are inconsistent. Instead we call focus().\n'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata\n'itemScope'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty\n  name.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are the few React props that we set as DOM properties\n// rather than attributes. These are all booleans.\n\n['checked', // Note: `option.selected` is not updated if `select.multiple` is\n// disabled with `removeAttribute`. We have special logic for handling this.\n'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML attributes that are \"overloaded booleans\": they behave like\n// booleans, but can also accept a string value.\n\n['capture', 'download' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML attributes that must be positive numbers.\n\n['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty\n  name, // attributeName\n  null, // attributeNamespace\n  false);\n}); // These are HTML attributes that must be numbers.\n\n['rowSpan', 'start'].forEach(function (name) {\n  properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty\n  name.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n});\nvar CAMELIZE = /[\\-\\:]([a-z])/g;\n\nvar capitalize = function (token) {\n  return token[1].toUpperCase();\n}; // This is a list of all SVG attributes that need special casing, namespacing,\n// or boolean value assignment. Regular attributes that just accept strings\n// and have the same names are omitted, just like in the HTML whitelist.\n// Some of these attributes can be hard to find. This list was created by\n// scraping the MDN documentation.\n\n\n['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n  var name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, null, // attributeNamespace\n  false);\n}); // String SVG attributes with the xlink namespace.\n\n['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n  var name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, 'http://www.w3.org/1999/xlink', false);\n}); // String SVG attributes with the xml namespace.\n\n['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n  var name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n  attributeName, 'http://www.w3.org/XML/1998/namespace', false);\n}); // These attribute exists both in HTML and SVG.\n// The attribute name is case-sensitive in SVG so we can't just use\n// the React name like we do for attributes that exist only in HTML.\n\n['tabIndex', 'crossOrigin'].forEach(function (attributeName) {\n  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n  attributeName.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  false);\n}); // These attributes accept URLs. These must not allow javascript: URLS.\n// These will also need to accept Trusted Types object in the future.\n\nvar xlinkHref = 'xlinkHref';\nproperties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty\n'xlink:href', 'http://www.w3.org/1999/xlink', true);\n['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {\n  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n  attributeName.toLowerCase(), // attributeName\n  null, // attributeNamespace\n  true);\n});\n\nvar ReactDebugCurrentFrame = null;\n\n{\n  ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n} // A javascript: URL can contain leading C0 control or \\u0020 SPACE,\n// and any newline or tab are filtered out as if they're not part of the URL.\n// https://url.spec.whatwg.org/#url-parsing\n// Tab or newline are defined as \\r\\n\\t:\n// https://infra.spec.whatwg.org/#ascii-tab-or-newline\n// A C0 control is a code point in the range \\u0000 NULL to \\u001F\n// INFORMATION SEPARATOR ONE, inclusive:\n// https://infra.spec.whatwg.org/#c0-control-or-space\n\n/* eslint-disable max-len */\n\n\nvar isJavaScriptProtocol = /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*\\:/i;\nvar didWarn = false;\n\nfunction sanitizeURL(url) {\n  {\n    if (!didWarn && isJavaScriptProtocol.test(url)) {\n      didWarn = true;\n\n      error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));\n    }\n  }\n}\n\n/**\n * Get the value for a property on a node. Only used in DEV for SSR validation.\n * The \"expected\" argument is used as a hint of what the expected value is.\n * Some properties have multiple equivalent values.\n */\nfunction getValueForProperty(node, name, expected, propertyInfo) {\n  {\n    if (propertyInfo.mustUseProperty) {\n      var propertyName = propertyInfo.propertyName;\n      return node[propertyName];\n    } else {\n      if ( propertyInfo.sanitizeURL) {\n        // If we haven't fully disabled javascript: URLs, and if\n        // the hydration is successful of a javascript: URL, we\n        // still want to warn on the client.\n        sanitizeURL('' + expected);\n      }\n\n      var attributeName = propertyInfo.attributeName;\n      var stringValue = null;\n\n      if (propertyInfo.type === OVERLOADED_BOOLEAN) {\n        if (node.hasAttribute(attributeName)) {\n          var value = node.getAttribute(attributeName);\n\n          if (value === '') {\n            return true;\n          }\n\n          if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n            return value;\n          }\n\n          if (value === '' + expected) {\n            return expected;\n          }\n\n          return value;\n        }\n      } else if (node.hasAttribute(attributeName)) {\n        if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n          // We had an attribute but shouldn't have had one, so read it\n          // for the error message.\n          return node.getAttribute(attributeName);\n        }\n\n        if (propertyInfo.type === BOOLEAN) {\n          // If this was a boolean, it doesn't matter what the value is\n          // the fact that we have it is the same as the expected.\n          return expected;\n        } // Even if this property uses a namespace we use getAttribute\n        // because we assume its namespaced name is the same as our config.\n        // To use getAttributeNS we need the local name which we don't have\n        // in our config atm.\n\n\n        stringValue = node.getAttribute(attributeName);\n      }\n\n      if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n        return stringValue === null ? expected : stringValue;\n      } else if (stringValue === '' + expected) {\n        return expected;\n      } else {\n        return stringValue;\n      }\n    }\n  }\n}\n/**\n * Get the value for a attribute on a node. Only used in DEV for SSR validation.\n * The third argument is used as a hint of what the expected value is. Some\n * attributes have multiple equivalent values.\n */\n\nfunction getValueForAttribute(node, name, expected) {\n  {\n    if (!isAttributeNameSafe(name)) {\n      return;\n    }\n\n    if (!node.hasAttribute(name)) {\n      return expected === undefined ? undefined : null;\n    }\n\n    var value = node.getAttribute(name);\n\n    if (value === '' + expected) {\n      return expected;\n    }\n\n    return value;\n  }\n}\n/**\n * Sets the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n * @param {*} value\n */\n\nfunction setValueForProperty(node, name, value, isCustomComponentTag) {\n  var propertyInfo = getPropertyInfo(name);\n\n  if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {\n    return;\n  }\n\n  if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {\n    value = null;\n  } // If the prop isn't in the special list, treat it as a simple attribute.\n\n\n  if (isCustomComponentTag || propertyInfo === null) {\n    if (isAttributeNameSafe(name)) {\n      var _attributeName = name;\n\n      if (value === null) {\n        node.removeAttribute(_attributeName);\n      } else {\n        node.setAttribute(_attributeName,  '' + value);\n      }\n    }\n\n    return;\n  }\n\n  var mustUseProperty = propertyInfo.mustUseProperty;\n\n  if (mustUseProperty) {\n    var propertyName = propertyInfo.propertyName;\n\n    if (value === null) {\n      var type = propertyInfo.type;\n      node[propertyName] = type === BOOLEAN ? false : '';\n    } else {\n      // Contrary to `setAttribute`, object properties are properly\n      // `toString`ed by IE8/9.\n      node[propertyName] = value;\n    }\n\n    return;\n  } // The rest are treated as attributes with special cases.\n\n\n  var attributeName = propertyInfo.attributeName,\n      attributeNamespace = propertyInfo.attributeNamespace;\n\n  if (value === null) {\n    node.removeAttribute(attributeName);\n  } else {\n    var _type = propertyInfo.type;\n    var attributeValue;\n\n    if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {\n      // If attribute type is boolean, we know for sure it won't be an execution sink\n      // and we won't require Trusted Type here.\n      attributeValue = '';\n    } else {\n      // `setAttribute` with objects becomes only `[object]` in IE8/9,\n      // ('' + value) makes it output the correct toString()-value.\n      {\n        attributeValue = '' + value;\n      }\n\n      if (propertyInfo.sanitizeURL) {\n        sanitizeURL(attributeValue.toString());\n      }\n    }\n\n    if (attributeNamespace) {\n      node.setAttributeNS(attributeNamespace, attributeName, attributeValue);\n    } else {\n      node.setAttribute(attributeName, attributeValue);\n    }\n  }\n}\n\nvar BEFORE_SLASH_RE = /^(.*)[\\\\\\/]/;\nfunction describeComponentFrame (name, source, ownerName) {\n  var sourceInfo = '';\n\n  if (source) {\n    var path = source.fileName;\n    var fileName = path.replace(BEFORE_SLASH_RE, '');\n\n    {\n      // In DEV, include code for a common special case:\n      // prefer \"folder/index.js\" instead of just \"index.js\".\n      if (/^index\\./.test(fileName)) {\n        var match = path.match(BEFORE_SLASH_RE);\n\n        if (match) {\n          var pathBeforeSlash = match[1];\n\n          if (pathBeforeSlash) {\n            var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');\n            fileName = folderName + '/' + fileName;\n          }\n        }\n      }\n    }\n\n    sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';\n  } else if (ownerName) {\n    sourceInfo = ' (created by ' + ownerName + ')';\n  }\n\n  return '\\n    in ' + (name || 'Unknown') + sourceInfo;\n}\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n  if (maybeIterable === null || typeof maybeIterable !== 'object') {\n    return null;\n  }\n\n  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n  if (typeof maybeIterator === 'function') {\n    return maybeIterator;\n  }\n\n  return null;\n}\n\nvar Uninitialized = -1;\nvar Pending = 0;\nvar Resolved = 1;\nvar Rejected = 2;\nfunction refineResolvedLazyComponent(lazyComponent) {\n  return lazyComponent._status === Resolved ? lazyComponent._result : null;\n}\nfunction initializeLazyComponentType(lazyComponent) {\n  if (lazyComponent._status === Uninitialized) {\n    lazyComponent._status = Pending;\n    var ctor = lazyComponent._ctor;\n    var thenable = ctor();\n    lazyComponent._result = thenable;\n    thenable.then(function (moduleObject) {\n      if (lazyComponent._status === Pending) {\n        var defaultExport = moduleObject.default;\n\n        {\n          if (defaultExport === undefined) {\n            error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\\n\\nYour code should look like: \\n  ' + \"const MyComponent = lazy(() => import('./MyComponent'))\", moduleObject);\n          }\n        }\n\n        lazyComponent._status = Resolved;\n        lazyComponent._result = defaultExport;\n      }\n    }, function (error) {\n      if (lazyComponent._status === Pending) {\n        lazyComponent._status = Rejected;\n        lazyComponent._result = error;\n      }\n    });\n  }\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var functionName = innerType.displayName || innerType.name || '';\n  return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getComponentName(type) {\n  if (type == null) {\n    // Host root, text node or just invalid type.\n    return null;\n  }\n\n  {\n    if (typeof type.tag === 'number') {\n      error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n    }\n  }\n\n  if (typeof type === 'function') {\n    return type.displayName || type.name || null;\n  }\n\n  if (typeof type === 'string') {\n    return type;\n  }\n\n  switch (type) {\n    case REACT_FRAGMENT_TYPE:\n      return 'Fragment';\n\n    case REACT_PORTAL_TYPE:\n      return 'Portal';\n\n    case REACT_PROFILER_TYPE:\n      return \"Profiler\";\n\n    case REACT_STRICT_MODE_TYPE:\n      return 'StrictMode';\n\n    case REACT_SUSPENSE_TYPE:\n      return 'Suspense';\n\n    case REACT_SUSPENSE_LIST_TYPE:\n      return 'SuspenseList';\n  }\n\n  if (typeof type === 'object') {\n    switch (type.$$typeof) {\n      case REACT_CONTEXT_TYPE:\n        return 'Context.Consumer';\n\n      case REACT_PROVIDER_TYPE:\n        return 'Context.Provider';\n\n      case REACT_FORWARD_REF_TYPE:\n        return getWrappedName(type, type.render, 'ForwardRef');\n\n      case REACT_MEMO_TYPE:\n        return getComponentName(type.type);\n\n      case REACT_BLOCK_TYPE:\n        return getComponentName(type.render);\n\n      case REACT_LAZY_TYPE:\n        {\n          var thenable = type;\n          var resolvedThenable = refineResolvedLazyComponent(thenable);\n\n          if (resolvedThenable) {\n            return getComponentName(resolvedThenable);\n          }\n\n          break;\n        }\n    }\n  }\n\n  return null;\n}\n\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction describeFiber(fiber) {\n  switch (fiber.tag) {\n    case HostRoot:\n    case HostPortal:\n    case HostText:\n    case Fragment:\n    case ContextProvider:\n    case ContextConsumer:\n      return '';\n\n    default:\n      var owner = fiber._debugOwner;\n      var source = fiber._debugSource;\n      var name = getComponentName(fiber.type);\n      var ownerName = null;\n\n      if (owner) {\n        ownerName = getComponentName(owner.type);\n      }\n\n      return describeComponentFrame(name, source, ownerName);\n  }\n}\n\nfunction getStackByFiberInDevAndProd(workInProgress) {\n  var info = '';\n  var node = workInProgress;\n\n  do {\n    info += describeFiber(node);\n    node = node.return;\n  } while (node);\n\n  return info;\n}\nvar current = null;\nvar isRendering = false;\nfunction getCurrentFiberOwnerNameInDevOrNull() {\n  {\n    if (current === null) {\n      return null;\n    }\n\n    var owner = current._debugOwner;\n\n    if (owner !== null && typeof owner !== 'undefined') {\n      return getComponentName(owner.type);\n    }\n  }\n\n  return null;\n}\nfunction getCurrentFiberStackInDev() {\n  {\n    if (current === null) {\n      return '';\n    } // Safe because if current fiber exists, we are reconciling,\n    // and it is guaranteed to be the work-in-progress version.\n\n\n    return getStackByFiberInDevAndProd(current);\n  }\n}\nfunction resetCurrentFiber() {\n  {\n    ReactDebugCurrentFrame$1.getCurrentStack = null;\n    current = null;\n    isRendering = false;\n  }\n}\nfunction setCurrentFiber(fiber) {\n  {\n    ReactDebugCurrentFrame$1.getCurrentStack = getCurrentFiberStackInDev;\n    current = fiber;\n    isRendering = false;\n  }\n}\nfunction setIsRendering(rendering) {\n  {\n    isRendering = rendering;\n  }\n}\n\n// Flow does not allow string concatenation of most non-string types. To work\n// around this limitation, we use an opaque type that can only be obtained by\n// passing the value through getToStringValue first.\nfunction toString(value) {\n  return '' + value;\n}\nfunction getToStringValue(value) {\n  switch (typeof value) {\n    case 'boolean':\n    case 'number':\n    case 'object':\n    case 'string':\n    case 'undefined':\n      return value;\n\n    default:\n      // function, symbol are assigned as empty strings\n      return '';\n  }\n}\n\nvar ReactDebugCurrentFrame$2 = null;\nvar ReactControlledValuePropTypes = {\n  checkPropTypes: null\n};\n\n{\n  ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame;\n  var hasReadOnlyValue = {\n    button: true,\n    checkbox: true,\n    image: true,\n    hidden: true,\n    radio: true,\n    reset: true,\n    submit: true\n  };\n  var propTypes = {\n    value: function (props, propName, componentName) {\n      if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {\n        return null;\n      }\n\n      return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n    },\n    checked: function (props, propName, componentName) {\n      if (props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {\n        return null;\n      }\n\n      return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n    }\n  };\n  /**\n   * Provide a linked `value` attribute for controlled forms. You should not use\n   * this outside of the ReactDOM controlled form components.\n   */\n\n  ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) {\n    checkPropTypes(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$2.getStackAddendum);\n  };\n}\n\nfunction isCheckable(elem) {\n  var type = elem.type;\n  var nodeName = elem.nodeName;\n  return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');\n}\n\nfunction getTracker(node) {\n  return node._valueTracker;\n}\n\nfunction detachTracker(node) {\n  node._valueTracker = null;\n}\n\nfunction getValueFromNode(node) {\n  var value = '';\n\n  if (!node) {\n    return value;\n  }\n\n  if (isCheckable(node)) {\n    value = node.checked ? 'true' : 'false';\n  } else {\n    value = node.value;\n  }\n\n  return value;\n}\n\nfunction trackValueOnNode(node) {\n  var valueField = isCheckable(node) ? 'checked' : 'value';\n  var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);\n  var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail\n  // and don't track value will cause over reporting of changes,\n  // but it's better then a hard failure\n  // (needed for certain tests that spyOn input values and Safari)\n\n  if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {\n    return;\n  }\n\n  var get = descriptor.get,\n      set = descriptor.set;\n  Object.defineProperty(node, valueField, {\n    configurable: true,\n    get: function () {\n      return get.call(this);\n    },\n    set: function (value) {\n      currentValue = '' + value;\n      set.call(this, value);\n    }\n  }); // We could've passed this the first time\n  // but it triggers a bug in IE11 and Edge 14/15.\n  // Calling defineProperty() again should be equivalent.\n  // https://github.com/facebook/react/issues/11768\n\n  Object.defineProperty(node, valueField, {\n    enumerable: descriptor.enumerable\n  });\n  var tracker = {\n    getValue: function () {\n      return currentValue;\n    },\n    setValue: function (value) {\n      currentValue = '' + value;\n    },\n    stopTracking: function () {\n      detachTracker(node);\n      delete node[valueField];\n    }\n  };\n  return tracker;\n}\n\nfunction track(node) {\n  if (getTracker(node)) {\n    return;\n  } // TODO: Once it's just Fiber we can move this to node._wrapperState\n\n\n  node._valueTracker = trackValueOnNode(node);\n}\nfunction updateValueIfChanged(node) {\n  if (!node) {\n    return false;\n  }\n\n  var tracker = getTracker(node); // if there is no tracker at this point it's unlikely\n  // that trying again will succeed\n\n  if (!tracker) {\n    return true;\n  }\n\n  var lastValue = tracker.getValue();\n  var nextValue = getValueFromNode(node);\n\n  if (nextValue !== lastValue) {\n    tracker.setValue(nextValue);\n    return true;\n  }\n\n  return false;\n}\n\nvar didWarnValueDefaultValue = false;\nvar didWarnCheckedDefaultChecked = false;\nvar didWarnControlledToUncontrolled = false;\nvar didWarnUncontrolledToControlled = false;\n\nfunction isControlled(props) {\n  var usesChecked = props.type === 'checkbox' || props.type === 'radio';\n  return usesChecked ? props.checked != null : props.value != null;\n}\n/**\n * Implements an <input> host component that allows setting these optional\n * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n *\n * If `checked` or `value` are not supplied (or null/undefined), user actions\n * that affect the checked state or value will trigger updates to the element.\n *\n * If they are supplied (and not null/undefined), the rendered element will not\n * trigger updates to the element. Instead, the props must change in order for\n * the rendered element to be updated.\n *\n * The rendered element will be initialized as unchecked (or `defaultChecked`)\n * with an empty value (or `defaultValue`).\n *\n * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n */\n\n\nfunction getHostProps(element, props) {\n  var node = element;\n  var checked = props.checked;\n\n  var hostProps = _assign({}, props, {\n    defaultChecked: undefined,\n    defaultValue: undefined,\n    value: undefined,\n    checked: checked != null ? checked : node._wrapperState.initialChecked\n  });\n\n  return hostProps;\n}\nfunction initWrapperState(element, props) {\n  {\n    ReactControlledValuePropTypes.checkPropTypes('input', props);\n\n    if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {\n      error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n      didWarnCheckedDefaultChecked = true;\n    }\n\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {\n      error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n      didWarnValueDefaultValue = true;\n    }\n  }\n\n  var node = element;\n  var defaultValue = props.defaultValue == null ? '' : props.defaultValue;\n  node._wrapperState = {\n    initialChecked: props.checked != null ? props.checked : props.defaultChecked,\n    initialValue: getToStringValue(props.value != null ? props.value : defaultValue),\n    controlled: isControlled(props)\n  };\n}\nfunction updateChecked(element, props) {\n  var node = element;\n  var checked = props.checked;\n\n  if (checked != null) {\n    setValueForProperty(node, 'checked', checked, false);\n  }\n}\nfunction updateWrapper(element, props) {\n  var node = element;\n\n  {\n    var controlled = isControlled(props);\n\n    if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {\n      error('A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);\n\n      didWarnUncontrolledToControlled = true;\n    }\n\n    if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {\n      error('A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);\n\n      didWarnControlledToUncontrolled = true;\n    }\n  }\n\n  updateChecked(element, props);\n  var value = getToStringValue(props.value);\n  var type = props.type;\n\n  if (value != null) {\n    if (type === 'number') {\n      if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.\n      // eslint-disable-next-line\n      node.value != value) {\n        node.value = toString(value);\n      }\n    } else if (node.value !== toString(value)) {\n      node.value = toString(value);\n    }\n  } else if (type === 'submit' || type === 'reset') {\n    // Submit/reset inputs need the attribute removed completely to avoid\n    // blank-text buttons.\n    node.removeAttribute('value');\n    return;\n  }\n\n  {\n    // When syncing the value attribute, the value comes from a cascade of\n    // properties:\n    //  1. The value React property\n    //  2. The defaultValue React property\n    //  3. Otherwise there should be no change\n    if (props.hasOwnProperty('value')) {\n      setDefaultValue(node, props.type, value);\n    } else if (props.hasOwnProperty('defaultValue')) {\n      setDefaultValue(node, props.type, getToStringValue(props.defaultValue));\n    }\n  }\n\n  {\n    // When syncing the checked attribute, it only changes when it needs\n    // to be removed, such as transitioning from a checkbox into a text input\n    if (props.checked == null && props.defaultChecked != null) {\n      node.defaultChecked = !!props.defaultChecked;\n    }\n  }\n}\nfunction postMountWrapper(element, props, isHydrating) {\n  var node = element; // Do not assign value if it is already set. This prevents user text input\n  // from being lost during SSR hydration.\n\n  if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {\n    var type = props.type;\n    var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the\n    // default value provided by the browser. See: #12872\n\n    if (isButton && (props.value === undefined || props.value === null)) {\n      return;\n    }\n\n    var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input\n    // from being lost during SSR hydration.\n\n    if (!isHydrating) {\n      {\n        // When syncing the value attribute, the value property should use\n        // the wrapperState._initialValue property. This uses:\n        //\n        //   1. The value React property when present\n        //   2. The defaultValue React property when present\n        //   3. An empty string\n        if (initialValue !== node.value) {\n          node.value = initialValue;\n        }\n      }\n    }\n\n    {\n      // Otherwise, the value attribute is synchronized to the property,\n      // so we assign defaultValue to the same thing as the value property\n      // assignment step above.\n      node.defaultValue = initialValue;\n    }\n  } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug\n  // this is needed to work around a chrome bug where setting defaultChecked\n  // will sometimes influence the value of checked (even after detachment).\n  // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416\n  // We need to temporarily unset name to avoid disrupting radio button groups.\n\n\n  var name = node.name;\n\n  if (name !== '') {\n    node.name = '';\n  }\n\n  {\n    // When syncing the checked attribute, both the checked property and\n    // attribute are assigned at the same time using defaultChecked. This uses:\n    //\n    //   1. The checked React property when present\n    //   2. The defaultChecked React property when present\n    //   3. Otherwise, false\n    node.defaultChecked = !node.defaultChecked;\n    node.defaultChecked = !!node._wrapperState.initialChecked;\n  }\n\n  if (name !== '') {\n    node.name = name;\n  }\n}\nfunction restoreControlledState(element, props) {\n  var node = element;\n  updateWrapper(node, props);\n  updateNamedCousins(node, props);\n}\n\nfunction updateNamedCousins(rootNode, props) {\n  var name = props.name;\n\n  if (props.type === 'radio' && name != null) {\n    var queryRoot = rootNode;\n\n    while (queryRoot.parentNode) {\n      queryRoot = queryRoot.parentNode;\n    } // If `rootNode.form` was non-null, then we could try `form.elements`,\n    // but that sometimes behaves strangely in IE8. We could also try using\n    // `form.getElementsByName`, but that will only return direct children\n    // and won't include inputs that use the HTML5 `form=` attribute. Since\n    // the input might not even be in a form. It might not even be in the\n    // document. Let's just use the local `querySelectorAll` to ensure we don't\n    // miss anything.\n\n\n    var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n    for (var i = 0; i < group.length; i++) {\n      var otherNode = group[i];\n\n      if (otherNode === rootNode || otherNode.form !== rootNode.form) {\n        continue;\n      } // This will throw if radio buttons rendered by different copies of React\n      // and the same name are rendered into the same form (same as #1939).\n      // That's probably okay; we don't support it just as we don't support\n      // mixing React radio buttons with non-React ones.\n\n\n      var otherProps = getFiberCurrentPropsFromNode$1(otherNode);\n\n      if (!otherProps) {\n        {\n          throw Error( \"ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.\" );\n        }\n      } // We need update the tracked value on the named cousin since the value\n      // was changed but the input saw no event or value set\n\n\n      updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that\n      // was previously checked to update will cause it to be come re-checked\n      // as appropriate.\n\n      updateWrapper(otherNode, otherProps);\n    }\n  }\n} // In Chrome, assigning defaultValue to certain input types triggers input validation.\n// For number inputs, the display value loses trailing decimal points. For email inputs,\n// Chrome raises \"The specified value <x> is not a valid email address\".\n//\n// Here we check to see if the defaultValue has actually changed, avoiding these problems\n// when the user is inputting text\n//\n// https://github.com/facebook/react/issues/7253\n\n\nfunction setDefaultValue(node, type, value) {\n  if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js\n  type !== 'number' || node.ownerDocument.activeElement !== node) {\n    if (value == null) {\n      node.defaultValue = toString(node._wrapperState.initialValue);\n    } else if (node.defaultValue !== toString(value)) {\n      node.defaultValue = toString(value);\n    }\n  }\n}\n\nvar didWarnSelectedSetOnOption = false;\nvar didWarnInvalidChild = false;\n\nfunction flattenChildren(children) {\n  var content = ''; // Flatten children. We'll warn if they are invalid\n  // during validateProps() which runs for hydration too.\n  // Note that this would throw on non-element objects.\n  // Elements are stringified (which is normally irrelevant\n  // but matters for <fbt>).\n\n  React.Children.forEach(children, function (child) {\n    if (child == null) {\n      return;\n    }\n\n    content += child; // Note: we don't warn about invalid children here.\n    // Instead, this is done separately below so that\n    // it happens during the hydration codepath too.\n  });\n  return content;\n}\n/**\n * Implements an <option> host component that warns when `selected` is set.\n */\n\n\nfunction validateProps(element, props) {\n  {\n    // This mirrors the codepath above, but runs for hydration too.\n    // Warn about invalid children here so that client and hydration are consistent.\n    // TODO: this seems like it could cause a DEV-only throw for hydration\n    // if children contains a non-element object. We should try to avoid that.\n    if (typeof props.children === 'object' && props.children !== null) {\n      React.Children.forEach(props.children, function (child) {\n        if (child == null) {\n          return;\n        }\n\n        if (typeof child === 'string' || typeof child === 'number') {\n          return;\n        }\n\n        if (typeof child.type !== 'string') {\n          return;\n        }\n\n        if (!didWarnInvalidChild) {\n          didWarnInvalidChild = true;\n\n          error('Only strings and numbers are supported as <option> children.');\n        }\n      });\n    } // TODO: Remove support for `selected` in <option>.\n\n\n    if (props.selected != null && !didWarnSelectedSetOnOption) {\n      error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');\n\n      didWarnSelectedSetOnOption = true;\n    }\n  }\n}\nfunction postMountWrapper$1(element, props) {\n  // value=\"\" should make a value attribute (#6219)\n  if (props.value != null) {\n    element.setAttribute('value', toString(getToStringValue(props.value)));\n  }\n}\nfunction getHostProps$1(element, props) {\n  var hostProps = _assign({\n    children: undefined\n  }, props);\n\n  var content = flattenChildren(props.children);\n\n  if (content) {\n    hostProps.children = content;\n  }\n\n  return hostProps;\n}\n\nvar didWarnValueDefaultValue$1;\n\n{\n  didWarnValueDefaultValue$1 = false;\n}\n\nfunction getDeclarationErrorAddendum() {\n  var ownerName = getCurrentFiberOwnerNameInDevOrNull();\n\n  if (ownerName) {\n    return '\\n\\nCheck the render method of `' + ownerName + '`.';\n  }\n\n  return '';\n}\n\nvar valuePropNames = ['value', 'defaultValue'];\n/**\n * Validation function for `value` and `defaultValue`.\n */\n\nfunction checkSelectPropTypes(props) {\n  {\n    ReactControlledValuePropTypes.checkPropTypes('select', props);\n\n    for (var i = 0; i < valuePropNames.length; i++) {\n      var propName = valuePropNames[i];\n\n      if (props[propName] == null) {\n        continue;\n      }\n\n      var isArray = Array.isArray(props[propName]);\n\n      if (props.multiple && !isArray) {\n        error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());\n      } else if (!props.multiple && isArray) {\n        error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());\n      }\n    }\n  }\n}\n\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n  var options = node.options;\n\n  if (multiple) {\n    var selectedValues = propValue;\n    var selectedValue = {};\n\n    for (var i = 0; i < selectedValues.length; i++) {\n      // Prefix to avoid chaos with special keys.\n      selectedValue['$' + selectedValues[i]] = true;\n    }\n\n    for (var _i = 0; _i < options.length; _i++) {\n      var selected = selectedValue.hasOwnProperty('$' + options[_i].value);\n\n      if (options[_i].selected !== selected) {\n        options[_i].selected = selected;\n      }\n\n      if (selected && setDefaultSelected) {\n        options[_i].defaultSelected = true;\n      }\n    }\n  } else {\n    // Do not set `select.value` as exact behavior isn't consistent across all\n    // browsers for all cases.\n    var _selectedValue = toString(getToStringValue(propValue));\n\n    var defaultSelected = null;\n\n    for (var _i2 = 0; _i2 < options.length; _i2++) {\n      if (options[_i2].value === _selectedValue) {\n        options[_i2].selected = true;\n\n        if (setDefaultSelected) {\n          options[_i2].defaultSelected = true;\n        }\n\n        return;\n      }\n\n      if (defaultSelected === null && !options[_i2].disabled) {\n        defaultSelected = options[_i2];\n      }\n    }\n\n    if (defaultSelected !== null) {\n      defaultSelected.selected = true;\n    }\n  }\n}\n/**\n * Implements a <select> host component that allows optionally setting the\n * props `value` and `defaultValue`. If `multiple` is false, the prop must be a\n * stringable. If `multiple` is true, the prop must be an array of stringables.\n *\n * If `value` is not supplied (or null/undefined), user actions that change the\n * selected option will trigger updates to the rendered options.\n *\n * If it is supplied (and not null/undefined), the rendered options will not\n * update in response to user actions. Instead, the `value` prop must change in\n * order for the rendered options to update.\n *\n * If `defaultValue` is provided, any options with the supplied values will be\n * selected.\n */\n\n\nfunction getHostProps$2(element, props) {\n  return _assign({}, props, {\n    value: undefined\n  });\n}\nfunction initWrapperState$1(element, props) {\n  var node = element;\n\n  {\n    checkSelectPropTypes(props);\n  }\n\n  node._wrapperState = {\n    wasMultiple: !!props.multiple\n  };\n\n  {\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {\n      error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');\n\n      didWarnValueDefaultValue$1 = true;\n    }\n  }\n}\nfunction postMountWrapper$2(element, props) {\n  var node = element;\n  node.multiple = !!props.multiple;\n  var value = props.value;\n\n  if (value != null) {\n    updateOptions(node, !!props.multiple, value, false);\n  } else if (props.defaultValue != null) {\n    updateOptions(node, !!props.multiple, props.defaultValue, true);\n  }\n}\nfunction postUpdateWrapper(element, props) {\n  var node = element;\n  var wasMultiple = node._wrapperState.wasMultiple;\n  node._wrapperState.wasMultiple = !!props.multiple;\n  var value = props.value;\n\n  if (value != null) {\n    updateOptions(node, !!props.multiple, value, false);\n  } else if (wasMultiple !== !!props.multiple) {\n    // For simplicity, reapply `defaultValue` if `multiple` is toggled.\n    if (props.defaultValue != null) {\n      updateOptions(node, !!props.multiple, props.defaultValue, true);\n    } else {\n      // Revert the select back to its default unselected state.\n      updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);\n    }\n  }\n}\nfunction restoreControlledState$1(element, props) {\n  var node = element;\n  var value = props.value;\n\n  if (value != null) {\n    updateOptions(node, !!props.multiple, value, false);\n  }\n}\n\nvar didWarnValDefaultVal = false;\n\n/**\n * Implements a <textarea> host component that allows setting `value`, and\n * `defaultValue`. This differs from the traditional DOM API because value is\n * usually set as PCDATA children.\n *\n * If `value` is not supplied (or null/undefined), user actions that affect the\n * value will trigger updates to the element.\n *\n * If `value` is supplied (and not null/undefined), the rendered element will\n * not trigger updates to the element. Instead, the `value` prop must change in\n * order for the rendered element to be updated.\n *\n * The rendered element will be initialized with an empty value, the prop\n * `defaultValue` if specified, or the children content (deprecated).\n */\nfunction getHostProps$3(element, props) {\n  var node = element;\n\n  if (!(props.dangerouslySetInnerHTML == null)) {\n    {\n      throw Error( \"`dangerouslySetInnerHTML` does not make sense on <textarea>.\" );\n    }\n  } // Always set children to the same thing. In IE9, the selection range will\n  // get reset if `textContent` is mutated.  We could add a check in setTextContent\n  // to only set the value if/when the value differs from the node value (which would\n  // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this\n  // solution. The value can be a boolean or object so that's why it's forced\n  // to be a string.\n\n\n  var hostProps = _assign({}, props, {\n    value: undefined,\n    defaultValue: undefined,\n    children: toString(node._wrapperState.initialValue)\n  });\n\n  return hostProps;\n}\nfunction initWrapperState$2(element, props) {\n  var node = element;\n\n  {\n    ReactControlledValuePropTypes.checkPropTypes('textarea', props);\n\n    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {\n      error('%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component');\n\n      didWarnValDefaultVal = true;\n    }\n  }\n\n  var initialValue = props.value; // Only bother fetching default value if we're going to use it\n\n  if (initialValue == null) {\n    var children = props.children,\n        defaultValue = props.defaultValue;\n\n    if (children != null) {\n      {\n        error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');\n      }\n\n      {\n        if (!(defaultValue == null)) {\n          {\n            throw Error( \"If you supply `defaultValue` on a <textarea>, do not pass children.\" );\n          }\n        }\n\n        if (Array.isArray(children)) {\n          if (!(children.length <= 1)) {\n            {\n              throw Error( \"<textarea> can only have at most one child.\" );\n            }\n          }\n\n          children = children[0];\n        }\n\n        defaultValue = children;\n      }\n    }\n\n    if (defaultValue == null) {\n      defaultValue = '';\n    }\n\n    initialValue = defaultValue;\n  }\n\n  node._wrapperState = {\n    initialValue: getToStringValue(initialValue)\n  };\n}\nfunction updateWrapper$1(element, props) {\n  var node = element;\n  var value = getToStringValue(props.value);\n  var defaultValue = getToStringValue(props.defaultValue);\n\n  if (value != null) {\n    // Cast `value` to a string to ensure the value is set correctly. While\n    // browsers typically do this as necessary, jsdom doesn't.\n    var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed\n\n    if (newValue !== node.value) {\n      node.value = newValue;\n    }\n\n    if (props.defaultValue == null && node.defaultValue !== newValue) {\n      node.defaultValue = newValue;\n    }\n  }\n\n  if (defaultValue != null) {\n    node.defaultValue = toString(defaultValue);\n  }\n}\nfunction postMountWrapper$3(element, props) {\n  var node = element; // This is in postMount because we need access to the DOM node, which is not\n  // available until after the component has mounted.\n\n  var textContent = node.textContent; // Only set node.value if textContent is equal to the expected\n  // initial value. In IE10/IE11 there is a bug where the placeholder attribute\n  // will populate textContent as well.\n  // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/\n\n  if (textContent === node._wrapperState.initialValue) {\n    if (textContent !== '' && textContent !== null) {\n      node.value = textContent;\n    }\n  }\n}\nfunction restoreControlledState$2(element, props) {\n  // DOM component is still mounted; update\n  updateWrapper$1(element, props);\n}\n\nvar HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nvar MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\nvar SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nvar Namespaces = {\n  html: HTML_NAMESPACE,\n  mathml: MATH_NAMESPACE,\n  svg: SVG_NAMESPACE\n}; // Assumes there is no parent namespace.\n\nfunction getIntrinsicNamespace(type) {\n  switch (type) {\n    case 'svg':\n      return SVG_NAMESPACE;\n\n    case 'math':\n      return MATH_NAMESPACE;\n\n    default:\n      return HTML_NAMESPACE;\n  }\n}\nfunction getChildNamespace(parentNamespace, type) {\n  if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {\n    // No (or default) parent namespace: potential entry point.\n    return getIntrinsicNamespace(type);\n  }\n\n  if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {\n    // We're leaving SVG.\n    return HTML_NAMESPACE;\n  } // By default, pass namespace below.\n\n\n  return parentNamespace;\n}\n\n/* globals MSApp */\n\n/**\n * Create a function which has 'unsafe' privileges (required by windows8 apps)\n */\nvar createMicrosoftUnsafeLocalFunction = function (func) {\n  if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {\n    return function (arg0, arg1, arg2, arg3) {\n      MSApp.execUnsafeLocalFunction(function () {\n        return func(arg0, arg1, arg2, arg3);\n      });\n    };\n  } else {\n    return func;\n  }\n};\n\nvar reusableSVGContainer;\n/**\n * Set the innerHTML property of a node\n *\n * @param {DOMElement} node\n * @param {string} html\n * @internal\n */\n\nvar setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {\n  if (node.namespaceURI === Namespaces.svg) {\n\n    if (!('innerHTML' in node)) {\n      // IE does not have innerHTML for SVG nodes, so instead we inject the\n      // new markup in a temp node and then move the child nodes across into\n      // the target node\n      reusableSVGContainer = reusableSVGContainer || document.createElement('div');\n      reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>';\n      var svgNode = reusableSVGContainer.firstChild;\n\n      while (node.firstChild) {\n        node.removeChild(node.firstChild);\n      }\n\n      while (svgNode.firstChild) {\n        node.appendChild(svgNode.firstChild);\n      }\n\n      return;\n    }\n  }\n\n  node.innerHTML = html;\n});\n\n/**\n * HTML nodeType values that represent the type of the node\n */\nvar ELEMENT_NODE = 1;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\nvar DOCUMENT_NODE = 9;\nvar DOCUMENT_FRAGMENT_NODE = 11;\n\n/**\n * Set the textContent property of a node. For text updates, it's faster\n * to set the `nodeValue` of the Text node directly instead of using\n * `.textContent` which will remove the existing node and create a new one.\n *\n * @param {DOMElement} node\n * @param {string} text\n * @internal\n */\n\nvar setTextContent = function (node, text) {\n  if (text) {\n    var firstChild = node.firstChild;\n\n    if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {\n      firstChild.nodeValue = text;\n      return;\n    }\n  }\n\n  node.textContent = text;\n};\n\n// Do not use the below two methods directly!\n// Instead use constants exported from DOMTopLevelEventTypes in ReactDOM.\n// (It is the only module that is allowed to access these methods.)\nfunction unsafeCastStringToDOMTopLevelType(topLevelType) {\n  return topLevelType;\n}\nfunction unsafeCastDOMTopLevelTypeToString(topLevelType) {\n  return topLevelType;\n}\n\n/**\n * Generate a mapping of standard vendor prefixes using the defined style property and event name.\n *\n * @param {string} styleProp\n * @param {string} eventName\n * @returns {object}\n */\n\nfunction makePrefixMap(styleProp, eventName) {\n  var prefixes = {};\n  prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n  prefixes['Webkit' + styleProp] = 'webkit' + eventName;\n  prefixes['Moz' + styleProp] = 'moz' + eventName;\n  return prefixes;\n}\n/**\n * A list of event names to a configurable list of vendor prefixes.\n */\n\n\nvar vendorPrefixes = {\n  animationend: makePrefixMap('Animation', 'AnimationEnd'),\n  animationiteration: makePrefixMap('Animation', 'AnimationIteration'),\n  animationstart: makePrefixMap('Animation', 'AnimationStart'),\n  transitionend: makePrefixMap('Transition', 'TransitionEnd')\n};\n/**\n * Event names that have already been detected and prefixed (if applicable).\n */\n\nvar prefixedEventNames = {};\n/**\n * Element to check for prefixes on.\n */\n\nvar style = {};\n/**\n * Bootstrap if a DOM exists.\n */\n\nif (canUseDOM) {\n  style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x,\n  // the un-prefixed \"animation\" and \"transition\" properties are defined on the\n  // style object but the events that fire will still be prefixed, so we need\n  // to check if the un-prefixed events are usable, and if not remove them from the map.\n\n  if (!('AnimationEvent' in window)) {\n    delete vendorPrefixes.animationend.animation;\n    delete vendorPrefixes.animationiteration.animation;\n    delete vendorPrefixes.animationstart.animation;\n  } // Same as above\n\n\n  if (!('TransitionEvent' in window)) {\n    delete vendorPrefixes.transitionend.transition;\n  }\n}\n/**\n * Attempts to determine the correct vendor prefixed event name.\n *\n * @param {string} eventName\n * @returns {string}\n */\n\n\nfunction getVendorPrefixedEventName(eventName) {\n  if (prefixedEventNames[eventName]) {\n    return prefixedEventNames[eventName];\n  } else if (!vendorPrefixes[eventName]) {\n    return eventName;\n  }\n\n  var prefixMap = vendorPrefixes[eventName];\n\n  for (var styleProp in prefixMap) {\n    if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {\n      return prefixedEventNames[eventName] = prefixMap[styleProp];\n    }\n  }\n\n  return eventName;\n}\n\n/**\n * To identify top level events in ReactDOM, we use constants defined by this\n * module. This is the only module that uses the unsafe* methods to express\n * that the constants actually correspond to the browser event names. This lets\n * us save some bundle size by avoiding a top level type -> event name map.\n * The rest of ReactDOM code should import top level types from this file.\n */\n\nvar TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort');\nvar TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend'));\nvar TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration'));\nvar TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart'));\nvar TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur');\nvar TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay');\nvar TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough');\nvar TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel');\nvar TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change');\nvar TOP_CLICK = unsafeCastStringToDOMTopLevelType('click');\nvar TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close');\nvar TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend');\nvar TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart');\nvar TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate');\nvar TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu');\nvar TOP_COPY = unsafeCastStringToDOMTopLevelType('copy');\nvar TOP_CUT = unsafeCastStringToDOMTopLevelType('cut');\nvar TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick');\nvar TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick');\nvar TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag');\nvar TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend');\nvar TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter');\nvar TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit');\nvar TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave');\nvar TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover');\nvar TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart');\nvar TOP_DROP = unsafeCastStringToDOMTopLevelType('drop');\nvar TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange');\nvar TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied');\nvar TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');\nvar TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');\nvar TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');\nvar TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');\nvar TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture');\nvar TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');\nvar TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');\nvar TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');\nvar TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress');\nvar TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup');\nvar TOP_LOAD = unsafeCastStringToDOMTopLevelType('load');\nvar TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart');\nvar TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');\nvar TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata');\nvar TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture');\nvar TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');\nvar TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');\nvar TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');\nvar TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover');\nvar TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup');\nvar TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');\nvar TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');\nvar TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');\nvar TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');\nvar TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel');\nvar TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown');\nvar TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove');\nvar TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');\nvar TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover');\nvar TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');\nvar TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');\nvar TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');\nvar TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');\nvar TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll');\nvar TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked');\nvar TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking');\nvar TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange');\nvar TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled');\nvar TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit');\nvar TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend');\nvar TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput');\nvar TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate');\nvar TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle');\nvar TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel');\nvar TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend');\nvar TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove');\nvar TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart');\nvar TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend'));\nvar TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange');\nvar TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting');\nvar TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); // List of events that need to be individually attached to media elements.\n// Note that events in this list will *not* be listened to at the top level\n// unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`.\n\nvar mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING];\nfunction getRawEventName(topLevelType) {\n  return unsafeCastDOMTopLevelTypeToString(topLevelType);\n}\n\nvar PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; // prettier-ignore\n\nvar elementListenerMap = new PossiblyWeakMap();\nfunction getListenerMapForElement(element) {\n  var listenerMap = elementListenerMap.get(element);\n\n  if (listenerMap === undefined) {\n    listenerMap = new Map();\n    elementListenerMap.set(element, listenerMap);\n  }\n\n  return listenerMap;\n}\n\n/**\n * `ReactInstanceMap` maintains a mapping from a public facing stateful\n * instance (key) and the internal representation (value). This allows public\n * methods to accept the user facing instance as an argument and map them back\n * to internal methods.\n *\n * Note that this module is currently shared and assumed to be stateless.\n * If this becomes an actual Map, that will break.\n */\nfunction get(key) {\n  return key._reactInternalFiber;\n}\nfunction has(key) {\n  return key._reactInternalFiber !== undefined;\n}\nfunction set(key, value) {\n  key._reactInternalFiber = value;\n}\n\n// Don't change these two values. They're used by React Dev Tools.\nvar NoEffect =\n/*              */\n0;\nvar PerformedWork =\n/*         */\n1; // You can change the rest (and add more).\n\nvar Placement =\n/*             */\n2;\nvar Update =\n/*                */\n4;\nvar PlacementAndUpdate =\n/*    */\n6;\nvar Deletion =\n/*              */\n8;\nvar ContentReset =\n/*          */\n16;\nvar Callback =\n/*              */\n32;\nvar DidCapture =\n/*            */\n64;\nvar Ref =\n/*                   */\n128;\nvar Snapshot =\n/*              */\n256;\nvar Passive =\n/*               */\n512;\nvar Hydrating =\n/*             */\n1024;\nvar HydratingAndUpdate =\n/*    */\n1028; // Passive & Update & Callback & Ref & Snapshot\n\nvar LifecycleEffectMask =\n/*   */\n932; // Union of all host effects\n\nvar HostEffectMask =\n/*        */\n2047;\nvar Incomplete =\n/*            */\n2048;\nvar ShouldCapture =\n/*         */\n4096;\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nfunction getNearestMountedFiber(fiber) {\n  var node = fiber;\n  var nearestMounted = fiber;\n\n  if (!fiber.alternate) {\n    // If there is no alternate, this might be a new tree that isn't inserted\n    // yet. If it is, then it will have a pending insertion effect on it.\n    var nextNode = node;\n\n    do {\n      node = nextNode;\n\n      if ((node.effectTag & (Placement | Hydrating)) !== NoEffect) {\n        // This is an insertion or in-progress hydration. The nearest possible\n        // mounted fiber is the parent but we need to continue to figure out\n        // if that one is still mounted.\n        nearestMounted = node.return;\n      }\n\n      nextNode = node.return;\n    } while (nextNode);\n  } else {\n    while (node.return) {\n      node = node.return;\n    }\n  }\n\n  if (node.tag === HostRoot) {\n    // TODO: Check if this was a nested HostRoot when used with\n    // renderContainerIntoSubtree.\n    return nearestMounted;\n  } // If we didn't hit the root, that means that we're in an disconnected tree\n  // that has been unmounted.\n\n\n  return null;\n}\nfunction getSuspenseInstanceFromFiber(fiber) {\n  if (fiber.tag === SuspenseComponent) {\n    var suspenseState = fiber.memoizedState;\n\n    if (suspenseState === null) {\n      var current = fiber.alternate;\n\n      if (current !== null) {\n        suspenseState = current.memoizedState;\n      }\n    }\n\n    if (suspenseState !== null) {\n      return suspenseState.dehydrated;\n    }\n  }\n\n  return null;\n}\nfunction getContainerFromFiber(fiber) {\n  return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;\n}\nfunction isFiberMounted(fiber) {\n  return getNearestMountedFiber(fiber) === fiber;\n}\nfunction isMounted(component) {\n  {\n    var owner = ReactCurrentOwner.current;\n\n    if (owner !== null && owner.tag === ClassComponent) {\n      var ownerFiber = owner;\n      var instance = ownerFiber.stateNode;\n\n      if (!instance._warnedAboutRefsInRender) {\n        error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component');\n      }\n\n      instance._warnedAboutRefsInRender = true;\n    }\n  }\n\n  var fiber = get(component);\n\n  if (!fiber) {\n    return false;\n  }\n\n  return getNearestMountedFiber(fiber) === fiber;\n}\n\nfunction assertIsMounted(fiber) {\n  if (!(getNearestMountedFiber(fiber) === fiber)) {\n    {\n      throw Error( \"Unable to find node on an unmounted component.\" );\n    }\n  }\n}\n\nfunction findCurrentFiberUsingSlowPath(fiber) {\n  var alternate = fiber.alternate;\n\n  if (!alternate) {\n    // If there is no alternate, then we only need to check if it is mounted.\n    var nearestMounted = getNearestMountedFiber(fiber);\n\n    if (!(nearestMounted !== null)) {\n      {\n        throw Error( \"Unable to find node on an unmounted component.\" );\n      }\n    }\n\n    if (nearestMounted !== fiber) {\n      return null;\n    }\n\n    return fiber;\n  } // If we have two possible branches, we'll walk backwards up to the root\n  // to see what path the root points to. On the way we may hit one of the\n  // special cases and we'll deal with them.\n\n\n  var a = fiber;\n  var b = alternate;\n\n  while (true) {\n    var parentA = a.return;\n\n    if (parentA === null) {\n      // We're at the root.\n      break;\n    }\n\n    var parentB = parentA.alternate;\n\n    if (parentB === null) {\n      // There is no alternate. This is an unusual case. Currently, it only\n      // happens when a Suspense component is hidden. An extra fragment fiber\n      // is inserted in between the Suspense fiber and its children. Skip\n      // over this extra fragment fiber and proceed to the next parent.\n      var nextParent = parentA.return;\n\n      if (nextParent !== null) {\n        a = b = nextParent;\n        continue;\n      } // If there's no parent, we're at the root.\n\n\n      break;\n    } // If both copies of the parent fiber point to the same child, we can\n    // assume that the child is current. This happens when we bailout on low\n    // priority: the bailed out fiber's child reuses the current child.\n\n\n    if (parentA.child === parentB.child) {\n      var child = parentA.child;\n\n      while (child) {\n        if (child === a) {\n          // We've determined that A is the current branch.\n          assertIsMounted(parentA);\n          return fiber;\n        }\n\n        if (child === b) {\n          // We've determined that B is the current branch.\n          assertIsMounted(parentA);\n          return alternate;\n        }\n\n        child = child.sibling;\n      } // We should never have an alternate for any mounting node. So the only\n      // way this could possibly happen is if this was unmounted, if at all.\n\n\n      {\n        {\n          throw Error( \"Unable to find node on an unmounted component.\" );\n        }\n      }\n    }\n\n    if (a.return !== b.return) {\n      // The return pointer of A and the return pointer of B point to different\n      // fibers. We assume that return pointers never criss-cross, so A must\n      // belong to the child set of A.return, and B must belong to the child\n      // set of B.return.\n      a = parentA;\n      b = parentB;\n    } else {\n      // The return pointers point to the same fiber. We'll have to use the\n      // default, slow path: scan the child sets of each parent alternate to see\n      // which child belongs to which set.\n      //\n      // Search parent A's child set\n      var didFindChild = false;\n      var _child = parentA.child;\n\n      while (_child) {\n        if (_child === a) {\n          didFindChild = true;\n          a = parentA;\n          b = parentB;\n          break;\n        }\n\n        if (_child === b) {\n          didFindChild = true;\n          b = parentA;\n          a = parentB;\n          break;\n        }\n\n        _child = _child.sibling;\n      }\n\n      if (!didFindChild) {\n        // Search parent B's child set\n        _child = parentB.child;\n\n        while (_child) {\n          if (_child === a) {\n            didFindChild = true;\n            a = parentB;\n            b = parentA;\n            break;\n          }\n\n          if (_child === b) {\n            didFindChild = true;\n            b = parentB;\n            a = parentA;\n            break;\n          }\n\n          _child = _child.sibling;\n        }\n\n        if (!didFindChild) {\n          {\n            throw Error( \"Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.\" );\n          }\n        }\n      }\n    }\n\n    if (!(a.alternate === b)) {\n      {\n        throw Error( \"Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  } // If the root is not a host container, we're in a disconnected tree. I.e.\n  // unmounted.\n\n\n  if (!(a.tag === HostRoot)) {\n    {\n      throw Error( \"Unable to find node on an unmounted component.\" );\n    }\n  }\n\n  if (a.stateNode.current === a) {\n    // We've determined that A is the current branch.\n    return fiber;\n  } // Otherwise B has to be current branch.\n\n\n  return alternate;\n}\nfunction findCurrentHostFiber(parent) {\n  var currentParent = findCurrentFiberUsingSlowPath(parent);\n\n  if (!currentParent) {\n    return null;\n  } // Next we'll drill down this component to find the first HostComponent/Text.\n\n\n  var node = currentParent;\n\n  while (true) {\n    if (node.tag === HostComponent || node.tag === HostText) {\n      return node;\n    } else if (node.child) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === currentParent) {\n      return null;\n    }\n\n    while (!node.sibling) {\n      if (!node.return || node.return === currentParent) {\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  } // Flow needs the return null here, but ESLint complains about it.\n  // eslint-disable-next-line no-unreachable\n\n\n  return null;\n}\nfunction findCurrentHostFiberWithNoPortals(parent) {\n  var currentParent = findCurrentFiberUsingSlowPath(parent);\n\n  if (!currentParent) {\n    return null;\n  } // Next we'll drill down this component to find the first HostComponent/Text.\n\n\n  var node = currentParent;\n\n  while (true) {\n    if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI ) {\n      return node;\n    } else if (node.child && node.tag !== HostPortal) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === currentParent) {\n      return null;\n    }\n\n    while (!node.sibling) {\n      if (!node.return || node.return === currentParent) {\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  } // Flow needs the return null here, but ESLint complains about it.\n  // eslint-disable-next-line no-unreachable\n\n\n  return null;\n}\n\n/**\n * Accumulates items that must not be null or undefined into the first one. This\n * is used to conserve memory by avoiding array allocations, and thus sacrifices\n * API cleanness. Since `current` can be null before being passed in and not\n * null after this function, make sure to assign it back to `current`:\n *\n * `a = accumulateInto(a, b);`\n *\n * This API should be sparingly used. Try `accumulate` for something cleaner.\n *\n * @return {*|array<*>} An accumulation of items.\n */\n\nfunction accumulateInto(current, next) {\n  if (!(next != null)) {\n    {\n      throw Error( \"accumulateInto(...): Accumulated items must not be null or undefined.\" );\n    }\n  }\n\n  if (current == null) {\n    return next;\n  } // Both are not empty. Warning: Never call x.concat(y) when you are not\n  // certain that x is an Array (x could be a string with concat method).\n\n\n  if (Array.isArray(current)) {\n    if (Array.isArray(next)) {\n      current.push.apply(current, next);\n      return current;\n    }\n\n    current.push(next);\n    return current;\n  }\n\n  if (Array.isArray(next)) {\n    // A bit too dangerous to mutate `next`.\n    return [current].concat(next);\n  }\n\n  return [current, next];\n}\n\n/**\n * @param {array} arr an \"accumulation\" of items which is either an Array or\n * a single item. Useful when paired with the `accumulate` module. This is a\n * simple utility that allows us to reason about a collection of items, but\n * handling the case when there is exactly one item (and we do not need to\n * allocate an array).\n * @param {function} cb Callback invoked with each element or a collection.\n * @param {?} [scope] Scope used as `this` in a callback.\n */\nfunction forEachAccumulated(arr, cb, scope) {\n  if (Array.isArray(arr)) {\n    arr.forEach(cb, scope);\n  } else if (arr) {\n    cb.call(scope, arr);\n  }\n}\n\n/**\n * Internal queue of events that have accumulated their dispatches and are\n * waiting to have their dispatches executed.\n */\n\nvar eventQueue = null;\n/**\n * Dispatches an event and releases it back into the pool, unless persistent.\n *\n * @param {?object} event Synthetic event to be dispatched.\n * @private\n */\n\nvar executeDispatchesAndRelease = function (event) {\n  if (event) {\n    executeDispatchesInOrder(event);\n\n    if (!event.isPersistent()) {\n      event.constructor.release(event);\n    }\n  }\n};\n\nvar executeDispatchesAndReleaseTopLevel = function (e) {\n  return executeDispatchesAndRelease(e);\n};\n\nfunction runEventsInBatch(events) {\n  if (events !== null) {\n    eventQueue = accumulateInto(eventQueue, events);\n  } // Set `eventQueue` to null before processing it so that we can tell if more\n  // events get enqueued while processing.\n\n\n  var processingEventQueue = eventQueue;\n  eventQueue = null;\n\n  if (!processingEventQueue) {\n    return;\n  }\n\n  forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);\n\n  if (!!eventQueue) {\n    {\n      throw Error( \"processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.\" );\n    }\n  } // This would be a good time to rethrow if any of the event handlers threw.\n\n\n  rethrowCaughtError();\n}\n\n/**\n * Gets the target node from a native browser event by accounting for\n * inconsistencies in browser DOM APIs.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {DOMEventTarget} Target node.\n */\n\nfunction getEventTarget(nativeEvent) {\n  // Fallback to nativeEvent.srcElement for IE9\n  // https://github.com/facebook/react/issues/12506\n  var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963\n\n  if (target.correspondingUseElement) {\n    target = target.correspondingUseElement;\n  } // Safari may fire events on text nodes (Node.TEXT_NODE is 3).\n  // @see http://www.quirksmode.org/js/events_properties.html\n\n\n  return target.nodeType === TEXT_NODE ? target.parentNode : target;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\n\nfunction isEventSupported(eventNameSuffix) {\n  if (!canUseDOM) {\n    return false;\n  }\n\n  var eventName = 'on' + eventNameSuffix;\n  var isSupported = eventName in document;\n\n  if (!isSupported) {\n    var element = document.createElement('div');\n    element.setAttribute(eventName, 'return;');\n    isSupported = typeof element[eventName] === 'function';\n  }\n\n  return isSupported;\n}\n\n/**\n * Summary of `DOMEventPluginSystem` event handling:\n *\n *  - Top-level delegation is used to trap most native browser events. This\n *    may only occur in the main thread and is the responsibility of\n *    ReactDOMEventListener, which is injected and can therefore support\n *    pluggable event sources. This is the only work that occurs in the main\n *    thread.\n *\n *  - We normalize and de-duplicate events to account for browser quirks. This\n *    may be done in the worker thread.\n *\n *  - Forward these native events (with the associated top-level type used to\n *    trap it) to `EventPluginRegistry`, which in turn will ask plugins if they want\n *    to extract any synthetic events.\n *\n *  - The `EventPluginRegistry` will then process each event by annotating them with\n *    \"dispatches\", a sequence of listeners and IDs that care about that event.\n *\n *  - The `EventPluginRegistry` then dispatches the events.\n *\n * Overview of React and the event system:\n *\n * +------------+    .\n * |    DOM     |    .\n * +------------+    .\n *       |           .\n *       v           .\n * +------------+    .\n * | ReactEvent |    .\n * |  Listener  |    .\n * +------------+    .                         +-----------+\n *       |           .               +--------+|SimpleEvent|\n *       |           .               |         |Plugin     |\n * +-----|------+    .               v         +-----------+\n * |     |      |    .    +--------------+                    +------------+\n * |     +-----------.--->|PluginRegistry|                    |    Event   |\n * |            |    .    |              |     +-----------+  | Propagators|\n * | ReactEvent |    .    |              |     |TapEvent   |  |------------|\n * |  Emitter   |    .    |              |<---+|Plugin     |  |other plugin|\n * |            |    .    |              |     +-----------+  |  utilities |\n * |     +-----------.--->|              |                    +------------+\n * |     |      |    .    +--------------+\n * +-----|------+    .                ^        +-----------+\n *       |           .                |        |Enter/Leave|\n *       +           .                +-------+|Plugin     |\n * +-------------+   .                         +-----------+\n * | application |   .\n * |-------------|   .\n * |             |   .\n * |             |   .\n * +-------------+   .\n *                   .\n *    React Core     .  General Purpose Event Plugin System\n */\n\nvar CALLBACK_BOOKKEEPING_POOL_SIZE = 10;\nvar callbackBookkeepingPool = [];\n\nfunction releaseTopLevelCallbackBookKeeping(instance) {\n  instance.topLevelType = null;\n  instance.nativeEvent = null;\n  instance.targetInst = null;\n  instance.ancestors.length = 0;\n\n  if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) {\n    callbackBookkeepingPool.push(instance);\n  }\n} // Used to store ancestor hierarchy in top level callback\n\n\nfunction getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags) {\n  if (callbackBookkeepingPool.length) {\n    var instance = callbackBookkeepingPool.pop();\n    instance.topLevelType = topLevelType;\n    instance.eventSystemFlags = eventSystemFlags;\n    instance.nativeEvent = nativeEvent;\n    instance.targetInst = targetInst;\n    return instance;\n  }\n\n  return {\n    topLevelType: topLevelType,\n    eventSystemFlags: eventSystemFlags,\n    nativeEvent: nativeEvent,\n    targetInst: targetInst,\n    ancestors: []\n  };\n}\n/**\n * Find the deepest React component completely containing the root of the\n * passed-in instance (for use when entire React trees are nested within each\n * other). If React trees are not nested, returns null.\n */\n\n\nfunction findRootContainerNode(inst) {\n  if (inst.tag === HostRoot) {\n    return inst.stateNode.containerInfo;\n  } // TODO: It may be a good idea to cache this to prevent unnecessary DOM\n  // traversal, but caching is difficult to do correctly without using a\n  // mutation observer to listen for all DOM changes.\n\n\n  while (inst.return) {\n    inst = inst.return;\n  }\n\n  if (inst.tag !== HostRoot) {\n    // This can happen if we're in a detached tree.\n    return null;\n  }\n\n  return inst.stateNode.containerInfo;\n}\n/**\n * Allows registered plugins an opportunity to extract events from top-level\n * native browser events.\n *\n * @return {*} An accumulation of synthetic events.\n * @internal\n */\n\n\nfunction extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n  var events = null;\n\n  for (var i = 0; i < plugins.length; i++) {\n    // Not every plugin in the ordering may be loaded at runtime.\n    var possiblePlugin = plugins[i];\n\n    if (possiblePlugin) {\n      var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);\n\n      if (extractedEvents) {\n        events = accumulateInto(events, extractedEvents);\n      }\n    }\n  }\n\n  return events;\n}\n\nfunction runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n  var events = extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);\n  runEventsInBatch(events);\n}\n\nfunction handleTopLevel(bookKeeping) {\n  var targetInst = bookKeeping.targetInst; // Loop through the hierarchy, in case there's any nested components.\n  // It's important that we build the array of ancestors before calling any\n  // event handlers, because event handlers can modify the DOM, leading to\n  // inconsistencies with ReactMount's node cache. See #1105.\n\n  var ancestor = targetInst;\n\n  do {\n    if (!ancestor) {\n      var ancestors = bookKeeping.ancestors;\n      ancestors.push(ancestor);\n      break;\n    }\n\n    var root = findRootContainerNode(ancestor);\n\n    if (!root) {\n      break;\n    }\n\n    var tag = ancestor.tag;\n\n    if (tag === HostComponent || tag === HostText) {\n      bookKeeping.ancestors.push(ancestor);\n    }\n\n    ancestor = getClosestInstanceFromNode(root);\n  } while (ancestor);\n\n  for (var i = 0; i < bookKeeping.ancestors.length; i++) {\n    targetInst = bookKeeping.ancestors[i];\n    var eventTarget = getEventTarget(bookKeeping.nativeEvent);\n    var topLevelType = bookKeeping.topLevelType;\n    var nativeEvent = bookKeeping.nativeEvent;\n    var eventSystemFlags = bookKeeping.eventSystemFlags; // If this is the first ancestor, we mark it on the system flags\n\n    if (i === 0) {\n      eventSystemFlags |= IS_FIRST_ANCESTOR;\n    }\n\n    runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, eventTarget, eventSystemFlags);\n  }\n}\n\nfunction dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst) {\n  var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags);\n\n  try {\n    // Event queue being processed in the same cycle allows\n    // `preventDefault`.\n    batchedEventUpdates(handleTopLevel, bookKeeping);\n  } finally {\n    releaseTopLevelCallbackBookKeeping(bookKeeping);\n  }\n}\n/**\n * We listen for bubbled touch events on the document object.\n *\n * Firefox v8.01 (and possibly others) exhibited strange behavior when\n * mounting `onmousemove` events at some node that was not the document\n * element. The symptoms were that if your mouse is not moving over something\n * contained within that mount point (for example on the background) the\n * top-level listeners for `onmousemove` won't be called. However, if you\n * register the `mousemove` on the document object, then it will of course\n * catch all `mousemove`s. This along with iOS quirks, justifies restricting\n * top-level listeners to the document object only, at least for these\n * movement types of events and possibly all events.\n *\n * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n *\n * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but\n * they bubble to document.\n *\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @param {object} mountAt Container where to mount the listener\n */\n\nfunction legacyListenToEvent(registrationName, mountAt) {\n  var listenerMap = getListenerMapForElement(mountAt);\n  var dependencies = registrationNameDependencies[registrationName];\n\n  for (var i = 0; i < dependencies.length; i++) {\n    var dependency = dependencies[i];\n    legacyListenToTopLevelEvent(dependency, mountAt, listenerMap);\n  }\n}\nfunction legacyListenToTopLevelEvent(topLevelType, mountAt, listenerMap) {\n  if (!listenerMap.has(topLevelType)) {\n    switch (topLevelType) {\n      case TOP_SCROLL:\n        trapCapturedEvent(TOP_SCROLL, mountAt);\n        break;\n\n      case TOP_FOCUS:\n      case TOP_BLUR:\n        trapCapturedEvent(TOP_FOCUS, mountAt);\n        trapCapturedEvent(TOP_BLUR, mountAt); // We set the flag for a single dependency later in this function,\n        // but this ensures we mark both as attached rather than just one.\n\n        listenerMap.set(TOP_BLUR, null);\n        listenerMap.set(TOP_FOCUS, null);\n        break;\n\n      case TOP_CANCEL:\n      case TOP_CLOSE:\n        if (isEventSupported(getRawEventName(topLevelType))) {\n          trapCapturedEvent(topLevelType, mountAt);\n        }\n\n        break;\n\n      case TOP_INVALID:\n      case TOP_SUBMIT:\n      case TOP_RESET:\n        // We listen to them on the target DOM elements.\n        // Some of them bubble so we don't want them to fire twice.\n        break;\n\n      default:\n        // By default, listen on the top level to all non-media events.\n        // Media events don't bubble so adding the listener wouldn't do anything.\n        var isMediaEvent = mediaEventTypes.indexOf(topLevelType) !== -1;\n\n        if (!isMediaEvent) {\n          trapBubbledEvent(topLevelType, mountAt);\n        }\n\n        break;\n    }\n\n    listenerMap.set(topLevelType, null);\n  }\n}\nfunction isListeningToAllDependencies(registrationName, mountAt) {\n  var listenerMap = getListenerMapForElement(mountAt);\n  var dependencies = registrationNameDependencies[registrationName];\n\n  for (var i = 0; i < dependencies.length; i++) {\n    var dependency = dependencies[i];\n\n    if (!listenerMap.has(dependency)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nvar attemptUserBlockingHydration;\nfunction setAttemptUserBlockingHydration(fn) {\n  attemptUserBlockingHydration = fn;\n}\nvar attemptContinuousHydration;\nfunction setAttemptContinuousHydration(fn) {\n  attemptContinuousHydration = fn;\n}\nvar attemptHydrationAtCurrentPriority;\nfunction setAttemptHydrationAtCurrentPriority(fn) {\n  attemptHydrationAtCurrentPriority = fn;\n} // TODO: Upgrade this definition once we're on a newer version of Flow that\nvar hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed.\n\nvar queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout.\n// if the last target was dehydrated.\n\nvar queuedFocus = null;\nvar queuedDrag = null;\nvar queuedMouse = null; // For pointer events there can be one latest event per pointerId.\n\nvar queuedPointers = new Map();\nvar queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too.\n\nvar queuedExplicitHydrationTargets = [];\nfunction hasQueuedDiscreteEvents() {\n  return queuedDiscreteEvents.length > 0;\n}\nvar discreteReplayableEvents = [TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_TOUCH_CANCEL, TOP_TOUCH_END, TOP_TOUCH_START, TOP_AUX_CLICK, TOP_DOUBLE_CLICK, TOP_POINTER_CANCEL, TOP_POINTER_DOWN, TOP_POINTER_UP, TOP_DRAG_END, TOP_DRAG_START, TOP_DROP, TOP_COMPOSITION_END, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_INPUT, TOP_TEXT_INPUT, TOP_CLOSE, TOP_CANCEL, TOP_COPY, TOP_CUT, TOP_PASTE, TOP_CLICK, TOP_CHANGE, TOP_CONTEXT_MENU, TOP_RESET, TOP_SUBMIT];\nvar continuousReplayableEvents = [TOP_FOCUS, TOP_BLUR, TOP_DRAG_ENTER, TOP_DRAG_LEAVE, TOP_MOUSE_OVER, TOP_MOUSE_OUT, TOP_POINTER_OVER, TOP_POINTER_OUT, TOP_GOT_POINTER_CAPTURE, TOP_LOST_POINTER_CAPTURE];\nfunction isReplayableDiscreteEvent(eventType) {\n  return discreteReplayableEvents.indexOf(eventType) > -1;\n}\n\nfunction trapReplayableEventForDocument(topLevelType, document, listenerMap) {\n  legacyListenToTopLevelEvent(topLevelType, document, listenerMap);\n}\n\nfunction eagerlyTrapReplayableEvents(container, document) {\n  var listenerMapForDoc = getListenerMapForElement(document); // Discrete\n\n  discreteReplayableEvents.forEach(function (topLevelType) {\n    trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);\n  }); // Continuous\n\n  continuousReplayableEvents.forEach(function (topLevelType) {\n    trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);\n  });\n}\n\nfunction createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  return {\n    blockedOn: blockedOn,\n    topLevelType: topLevelType,\n    eventSystemFlags: eventSystemFlags | IS_REPLAYED,\n    nativeEvent: nativeEvent,\n    container: container\n  };\n}\n\nfunction queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n  queuedDiscreteEvents.push(queuedEvent);\n} // Resets the replaying for this type of continuous event to no event.\n\nfunction clearIfContinuousEvent(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case TOP_FOCUS:\n    case TOP_BLUR:\n      queuedFocus = null;\n      break;\n\n    case TOP_DRAG_ENTER:\n    case TOP_DRAG_LEAVE:\n      queuedDrag = null;\n      break;\n\n    case TOP_MOUSE_OVER:\n    case TOP_MOUSE_OUT:\n      queuedMouse = null;\n      break;\n\n    case TOP_POINTER_OVER:\n    case TOP_POINTER_OUT:\n      {\n        var pointerId = nativeEvent.pointerId;\n        queuedPointers.delete(pointerId);\n        break;\n      }\n\n    case TOP_GOT_POINTER_CAPTURE:\n    case TOP_LOST_POINTER_CAPTURE:\n      {\n        var _pointerId = nativeEvent.pointerId;\n        queuedPointerCaptures.delete(_pointerId);\n        break;\n      }\n  }\n}\n\nfunction accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {\n    var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n\n    if (blockedOn !== null) {\n      var _fiber2 = getInstanceFromNode$1(blockedOn);\n\n      if (_fiber2 !== null) {\n        // Attempt to increase the priority of this target.\n        attemptContinuousHydration(_fiber2);\n      }\n    }\n\n    return queuedEvent;\n  } // If we have already queued this exact event, then it's because\n  // the different event systems have different DOM event listeners.\n  // We can accumulate the flags and store a single event to be\n  // replayed.\n\n\n  existingQueuedEvent.eventSystemFlags |= eventSystemFlags;\n  return existingQueuedEvent;\n}\n\nfunction queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n  // These set relatedTarget to null because the replayed event will be treated as if we\n  // moved from outside the window (no target) onto the target once it hydrates.\n  // Instead of mutating we could clone the event.\n  switch (topLevelType) {\n    case TOP_FOCUS:\n      {\n        var focusEvent = nativeEvent;\n        queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, topLevelType, eventSystemFlags, container, focusEvent);\n        return true;\n      }\n\n    case TOP_DRAG_ENTER:\n      {\n        var dragEvent = nativeEvent;\n        queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, topLevelType, eventSystemFlags, container, dragEvent);\n        return true;\n      }\n\n    case TOP_MOUSE_OVER:\n      {\n        var mouseEvent = nativeEvent;\n        queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, topLevelType, eventSystemFlags, container, mouseEvent);\n        return true;\n      }\n\n    case TOP_POINTER_OVER:\n      {\n        var pointerEvent = nativeEvent;\n        var pointerId = pointerEvent.pointerId;\n        queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, topLevelType, eventSystemFlags, container, pointerEvent));\n        return true;\n      }\n\n    case TOP_GOT_POINTER_CAPTURE:\n      {\n        var _pointerEvent = nativeEvent;\n        var _pointerId2 = _pointerEvent.pointerId;\n        queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, topLevelType, eventSystemFlags, container, _pointerEvent));\n        return true;\n      }\n  }\n\n  return false;\n} // Check if this target is unblocked. Returns true if it's unblocked.\n\nfunction attemptExplicitHydrationTarget(queuedTarget) {\n  // TODO: This function shares a lot of logic with attemptToDispatchEvent.\n  // Try to unify them. It's a bit tricky since it would require two return\n  // values.\n  var targetInst = getClosestInstanceFromNode(queuedTarget.target);\n\n  if (targetInst !== null) {\n    var nearestMounted = getNearestMountedFiber(targetInst);\n\n    if (nearestMounted !== null) {\n      var tag = nearestMounted.tag;\n\n      if (tag === SuspenseComponent) {\n        var instance = getSuspenseInstanceFromFiber(nearestMounted);\n\n        if (instance !== null) {\n          // We're blocked on hydrating this boundary.\n          // Increase its priority.\n          queuedTarget.blockedOn = instance;\n          Scheduler.unstable_runWithPriority(queuedTarget.priority, function () {\n            attemptHydrationAtCurrentPriority(nearestMounted);\n          });\n          return;\n        }\n      } else if (tag === HostRoot) {\n        var root = nearestMounted.stateNode;\n\n        if (root.hydrate) {\n          queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of\n          // a root other than sync.\n\n          return;\n        }\n      }\n    }\n  }\n\n  queuedTarget.blockedOn = null;\n}\n\nfunction attemptReplayContinuousQueuedEvent(queuedEvent) {\n  if (queuedEvent.blockedOn !== null) {\n    return false;\n  }\n\n  var nextBlockedOn = attemptToDispatchEvent(queuedEvent.topLevelType, queuedEvent.eventSystemFlags, queuedEvent.container, queuedEvent.nativeEvent);\n\n  if (nextBlockedOn !== null) {\n    // We're still blocked. Try again later.\n    var _fiber3 = getInstanceFromNode$1(nextBlockedOn);\n\n    if (_fiber3 !== null) {\n      attemptContinuousHydration(_fiber3);\n    }\n\n    queuedEvent.blockedOn = nextBlockedOn;\n    return false;\n  }\n\n  return true;\n}\n\nfunction attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {\n  if (attemptReplayContinuousQueuedEvent(queuedEvent)) {\n    map.delete(key);\n  }\n}\n\nfunction replayUnblockedEvents() {\n  hasScheduledReplayAttempt = false; // First replay discrete events.\n\n  while (queuedDiscreteEvents.length > 0) {\n    var nextDiscreteEvent = queuedDiscreteEvents[0];\n\n    if (nextDiscreteEvent.blockedOn !== null) {\n      // We're still blocked.\n      // Increase the priority of this boundary to unblock\n      // the next discrete event.\n      var _fiber4 = getInstanceFromNode$1(nextDiscreteEvent.blockedOn);\n\n      if (_fiber4 !== null) {\n        attemptUserBlockingHydration(_fiber4);\n      }\n\n      break;\n    }\n\n    var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.topLevelType, nextDiscreteEvent.eventSystemFlags, nextDiscreteEvent.container, nextDiscreteEvent.nativeEvent);\n\n    if (nextBlockedOn !== null) {\n      // We're still blocked. Try again later.\n      nextDiscreteEvent.blockedOn = nextBlockedOn;\n    } else {\n      // We've successfully replayed the first event. Let's try the next one.\n      queuedDiscreteEvents.shift();\n    }\n  } // Next replay any continuous events.\n\n\n  if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {\n    queuedFocus = null;\n  }\n\n  if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {\n    queuedDrag = null;\n  }\n\n  if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {\n    queuedMouse = null;\n  }\n\n  queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);\n  queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);\n}\n\nfunction scheduleCallbackIfUnblocked(queuedEvent, unblocked) {\n  if (queuedEvent.blockedOn === unblocked) {\n    queuedEvent.blockedOn = null;\n\n    if (!hasScheduledReplayAttempt) {\n      hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are\n      // now unblocked. This first might not actually be unblocked yet.\n      // We could check it early to avoid scheduling an unnecessary callback.\n\n      Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, replayUnblockedEvents);\n    }\n  }\n}\n\nfunction retryIfBlockedOn(unblocked) {\n  // Mark anything that was blocked on this as no longer blocked\n  // and eligible for a replay.\n  if (queuedDiscreteEvents.length > 0) {\n    scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's\n    // worth it because we expect very few discrete events to queue up and once\n    // we are actually fully unblocked it will be fast to replay them.\n\n    for (var i = 1; i < queuedDiscreteEvents.length; i++) {\n      var queuedEvent = queuedDiscreteEvents[i];\n\n      if (queuedEvent.blockedOn === unblocked) {\n        queuedEvent.blockedOn = null;\n      }\n    }\n  }\n\n  if (queuedFocus !== null) {\n    scheduleCallbackIfUnblocked(queuedFocus, unblocked);\n  }\n\n  if (queuedDrag !== null) {\n    scheduleCallbackIfUnblocked(queuedDrag, unblocked);\n  }\n\n  if (queuedMouse !== null) {\n    scheduleCallbackIfUnblocked(queuedMouse, unblocked);\n  }\n\n  var unblock = function (queuedEvent) {\n    return scheduleCallbackIfUnblocked(queuedEvent, unblocked);\n  };\n\n  queuedPointers.forEach(unblock);\n  queuedPointerCaptures.forEach(unblock);\n\n  for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {\n    var queuedTarget = queuedExplicitHydrationTargets[_i];\n\n    if (queuedTarget.blockedOn === unblocked) {\n      queuedTarget.blockedOn = null;\n    }\n  }\n\n  while (queuedExplicitHydrationTargets.length > 0) {\n    var nextExplicitTarget = queuedExplicitHydrationTargets[0];\n\n    if (nextExplicitTarget.blockedOn !== null) {\n      // We're still blocked.\n      break;\n    } else {\n      attemptExplicitHydrationTarget(nextExplicitTarget);\n\n      if (nextExplicitTarget.blockedOn === null) {\n        // We're unblocked.\n        queuedExplicitHydrationTargets.shift();\n      }\n    }\n  }\n}\n\nfunction addEventBubbleListener(element, eventType, listener) {\n  element.addEventListener(eventType, listener, false);\n}\nfunction addEventCaptureListener(element, eventType, listener) {\n  element.addEventListener(eventType, listener, true);\n}\n\n// do it in two places, which duplicates logic\n// and increases the bundle size, we do it all\n// here once. If we remove or refactor the\n// SimpleEventPlugin, we should also remove or\n// update the below line.\n\nvar simpleEventPluginEventTypes = {};\nvar topLevelEventsToDispatchConfig = new Map();\nvar eventPriorities = new Map(); // We store most of the events in this module in pairs of two strings so we can re-use\n// the code required to apply the same logic for event prioritization and that of the\n// SimpleEventPlugin. This complicates things slightly, but the aim is to reduce code\n// duplication (for which there would be quite a bit). For the events that are not needed\n// for the SimpleEventPlugin (otherDiscreteEvents) we process them separately as an\n// array of top level events.\n// Lastly, we ignore prettier so we can keep the formatting sane.\n// prettier-ignore\n\nvar discreteEventPairsForSimpleEventPlugin = [TOP_BLUR, 'blur', TOP_CANCEL, 'cancel', TOP_CLICK, 'click', TOP_CLOSE, 'close', TOP_CONTEXT_MENU, 'contextMenu', TOP_COPY, 'copy', TOP_CUT, 'cut', TOP_AUX_CLICK, 'auxClick', TOP_DOUBLE_CLICK, 'doubleClick', TOP_DRAG_END, 'dragEnd', TOP_DRAG_START, 'dragStart', TOP_DROP, 'drop', TOP_FOCUS, 'focus', TOP_INPUT, 'input', TOP_INVALID, 'invalid', TOP_KEY_DOWN, 'keyDown', TOP_KEY_PRESS, 'keyPress', TOP_KEY_UP, 'keyUp', TOP_MOUSE_DOWN, 'mouseDown', TOP_MOUSE_UP, 'mouseUp', TOP_PASTE, 'paste', TOP_PAUSE, 'pause', TOP_PLAY, 'play', TOP_POINTER_CANCEL, 'pointerCancel', TOP_POINTER_DOWN, 'pointerDown', TOP_POINTER_UP, 'pointerUp', TOP_RATE_CHANGE, 'rateChange', TOP_RESET, 'reset', TOP_SEEKED, 'seeked', TOP_SUBMIT, 'submit', TOP_TOUCH_CANCEL, 'touchCancel', TOP_TOUCH_END, 'touchEnd', TOP_TOUCH_START, 'touchStart', TOP_VOLUME_CHANGE, 'volumeChange'];\nvar otherDiscreteEvents = [TOP_CHANGE, TOP_SELECTION_CHANGE, TOP_TEXT_INPUT, TOP_COMPOSITION_START, TOP_COMPOSITION_END, TOP_COMPOSITION_UPDATE]; // prettier-ignore\n\nvar userBlockingPairsForSimpleEventPlugin = [TOP_DRAG, 'drag', TOP_DRAG_ENTER, 'dragEnter', TOP_DRAG_EXIT, 'dragExit', TOP_DRAG_LEAVE, 'dragLeave', TOP_DRAG_OVER, 'dragOver', TOP_MOUSE_MOVE, 'mouseMove', TOP_MOUSE_OUT, 'mouseOut', TOP_MOUSE_OVER, 'mouseOver', TOP_POINTER_MOVE, 'pointerMove', TOP_POINTER_OUT, 'pointerOut', TOP_POINTER_OVER, 'pointerOver', TOP_SCROLL, 'scroll', TOP_TOGGLE, 'toggle', TOP_TOUCH_MOVE, 'touchMove', TOP_WHEEL, 'wheel']; // prettier-ignore\n\nvar continuousPairsForSimpleEventPlugin = [TOP_ABORT, 'abort', TOP_ANIMATION_END, 'animationEnd', TOP_ANIMATION_ITERATION, 'animationIteration', TOP_ANIMATION_START, 'animationStart', TOP_CAN_PLAY, 'canPlay', TOP_CAN_PLAY_THROUGH, 'canPlayThrough', TOP_DURATION_CHANGE, 'durationChange', TOP_EMPTIED, 'emptied', TOP_ENCRYPTED, 'encrypted', TOP_ENDED, 'ended', TOP_ERROR, 'error', TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture', TOP_LOAD, 'load', TOP_LOADED_DATA, 'loadedData', TOP_LOADED_METADATA, 'loadedMetadata', TOP_LOAD_START, 'loadStart', TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture', TOP_PLAYING, 'playing', TOP_PROGRESS, 'progress', TOP_SEEKING, 'seeking', TOP_STALLED, 'stalled', TOP_SUSPEND, 'suspend', TOP_TIME_UPDATE, 'timeUpdate', TOP_TRANSITION_END, 'transitionEnd', TOP_WAITING, 'waiting'];\n/**\n * Turns\n * ['abort', ...]\n * into\n * eventTypes = {\n *   'abort': {\n *     phasedRegistrationNames: {\n *       bubbled: 'onAbort',\n *       captured: 'onAbortCapture',\n *     },\n *     dependencies: [TOP_ABORT],\n *   },\n *   ...\n * };\n * topLevelEventsToDispatchConfig = new Map([\n *   [TOP_ABORT, { sameConfig }],\n * ]);\n */\n\nfunction processSimpleEventPluginPairsByPriority(eventTypes, priority) {\n  // As the event types are in pairs of two, we need to iterate\n  // through in twos. The events are in pairs of two to save code\n  // and improve init perf of processing this array, as it will\n  // result in far fewer object allocations and property accesses\n  // if we only use three arrays to process all the categories of\n  // instead of tuples.\n  for (var i = 0; i < eventTypes.length; i += 2) {\n    var topEvent = eventTypes[i];\n    var event = eventTypes[i + 1];\n    var capitalizedEvent = event[0].toUpperCase() + event.slice(1);\n    var onEvent = 'on' + capitalizedEvent;\n    var config = {\n      phasedRegistrationNames: {\n        bubbled: onEvent,\n        captured: onEvent + 'Capture'\n      },\n      dependencies: [topEvent],\n      eventPriority: priority\n    };\n    eventPriorities.set(topEvent, priority);\n    topLevelEventsToDispatchConfig.set(topEvent, config);\n    simpleEventPluginEventTypes[event] = config;\n  }\n}\n\nfunction processTopEventPairsByPriority(eventTypes, priority) {\n  for (var i = 0; i < eventTypes.length; i++) {\n    eventPriorities.set(eventTypes[i], priority);\n  }\n} // SimpleEventPlugin\n\n\nprocessSimpleEventPluginPairsByPriority(discreteEventPairsForSimpleEventPlugin, DiscreteEvent);\nprocessSimpleEventPluginPairsByPriority(userBlockingPairsForSimpleEventPlugin, UserBlockingEvent);\nprocessSimpleEventPluginPairsByPriority(continuousPairsForSimpleEventPlugin, ContinuousEvent); // Not used by SimpleEventPlugin\n\nprocessTopEventPairsByPriority(otherDiscreteEvents, DiscreteEvent);\nfunction getEventPriorityForPluginSystem(topLevelType) {\n  var priority = eventPriorities.get(topLevelType); // Default to a ContinuousEvent. Note: we might\n  // want to warn if we can't detect the priority\n  // for the event.\n\n  return priority === undefined ? ContinuousEvent : priority;\n}\n\n// Intentionally not named imports because Rollup would use dynamic dispatch for\nvar UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n    runWithPriority = Scheduler.unstable_runWithPriority; // TODO: can we stop exporting these?\n\nvar _enabled = true;\nfunction setEnabled(enabled) {\n  _enabled = !!enabled;\n}\nfunction isEnabled() {\n  return _enabled;\n}\nfunction trapBubbledEvent(topLevelType, element) {\n  trapEventForPluginEventSystem(element, topLevelType, false);\n}\nfunction trapCapturedEvent(topLevelType, element) {\n  trapEventForPluginEventSystem(element, topLevelType, true);\n}\n\nfunction trapEventForPluginEventSystem(container, topLevelType, capture) {\n  var listener;\n\n  switch (getEventPriorityForPluginSystem(topLevelType)) {\n    case DiscreteEvent:\n      listener = dispatchDiscreteEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n      break;\n\n    case UserBlockingEvent:\n      listener = dispatchUserBlockingUpdate.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n      break;\n\n    case ContinuousEvent:\n    default:\n      listener = dispatchEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n      break;\n  }\n\n  var rawEventName = getRawEventName(topLevelType);\n\n  if (capture) {\n    addEventCaptureListener(container, rawEventName, listener);\n  } else {\n    addEventBubbleListener(container, rawEventName, listener);\n  }\n}\n\nfunction dispatchDiscreteEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n  flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp);\n  discreteUpdates(dispatchEvent, topLevelType, eventSystemFlags, container, nativeEvent);\n}\n\nfunction dispatchUserBlockingUpdate(topLevelType, eventSystemFlags, container, nativeEvent) {\n  runWithPriority(UserBlockingPriority, dispatchEvent.bind(null, topLevelType, eventSystemFlags, container, nativeEvent));\n}\n\nfunction dispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n  if (!_enabled) {\n    return;\n  }\n\n  if (hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(topLevelType)) {\n    // If we already have a queue of discrete events, and this is another discrete\n    // event, then we can't dispatch it regardless of its target, since they\n    // need to dispatch in order.\n    queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know.\n    topLevelType, eventSystemFlags, container, nativeEvent);\n    return;\n  }\n\n  var blockedOn = attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent);\n\n  if (blockedOn === null) {\n    // We successfully dispatched this event.\n    clearIfContinuousEvent(topLevelType, nativeEvent);\n    return;\n  }\n\n  if (isReplayableDiscreteEvent(topLevelType)) {\n    // This this to be replayed later once the target is available.\n    queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n    return;\n  }\n\n  if (queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent)) {\n    return;\n  } // We need to clear only if we didn't queue because\n  // queueing is accummulative.\n\n\n  clearIfContinuousEvent(topLevelType, nativeEvent); // This is not replayable so we'll invoke it but without a target,\n  // in case the event system needs to trace it.\n\n  {\n    dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null);\n  }\n} // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked.\n\nfunction attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n  // TODO: Warn if _enabled is false.\n  var nativeEventTarget = getEventTarget(nativeEvent);\n  var targetInst = getClosestInstanceFromNode(nativeEventTarget);\n\n  if (targetInst !== null) {\n    var nearestMounted = getNearestMountedFiber(targetInst);\n\n    if (nearestMounted === null) {\n      // This tree has been unmounted already. Dispatch without a target.\n      targetInst = null;\n    } else {\n      var tag = nearestMounted.tag;\n\n      if (tag === SuspenseComponent) {\n        var instance = getSuspenseInstanceFromFiber(nearestMounted);\n\n        if (instance !== null) {\n          // Queue the event to be replayed later. Abort dispatching since we\n          // don't want this event dispatched twice through the event system.\n          // TODO: If this is the first discrete event in the queue. Schedule an increased\n          // priority for this boundary.\n          return instance;\n        } // This shouldn't happen, something went wrong but to avoid blocking\n        // the whole system, dispatch the event without a target.\n        // TODO: Warn.\n\n\n        targetInst = null;\n      } else if (tag === HostRoot) {\n        var root = nearestMounted.stateNode;\n\n        if (root.hydrate) {\n          // If this happens during a replay something went wrong and it might block\n          // the whole system.\n          return getContainerFromFiber(nearestMounted);\n        }\n\n        targetInst = null;\n      } else if (nearestMounted !== targetInst) {\n        // If we get an event (ex: img onload) before committing that\n        // component's mount, ignore it for now (that is, treat it as if it was an\n        // event on a non-React tree). We might also consider queueing events and\n        // dispatching them after the mount.\n        targetInst = null;\n      }\n    }\n  }\n\n  {\n    dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst);\n  } // We're not blocked on anything.\n\n\n  return null;\n}\n\n// List derived from Gecko source code:\n// https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js\nvar shorthandToLonghand = {\n  animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],\n  background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],\n  backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],\n  border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],\n  borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],\n  borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],\n  borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],\n  borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],\n  borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],\n  borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],\n  borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],\n  borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],\n  borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],\n  borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],\n  borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],\n  borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],\n  borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],\n  columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],\n  columns: ['columnCount', 'columnWidth'],\n  flex: ['flexBasis', 'flexGrow', 'flexShrink'],\n  flexFlow: ['flexDirection', 'flexWrap'],\n  font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],\n  fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],\n  gap: ['columnGap', 'rowGap'],\n  grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],\n  gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],\n  gridColumn: ['gridColumnEnd', 'gridColumnStart'],\n  gridColumnGap: ['columnGap'],\n  gridGap: ['columnGap', 'rowGap'],\n  gridRow: ['gridRowEnd', 'gridRowStart'],\n  gridRowGap: ['rowGap'],\n  gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],\n  listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],\n  margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],\n  marker: ['markerEnd', 'markerMid', 'markerStart'],\n  mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],\n  maskPosition: ['maskPositionX', 'maskPositionY'],\n  outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],\n  overflow: ['overflowX', 'overflowY'],\n  padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],\n  placeContent: ['alignContent', 'justifyContent'],\n  placeItems: ['alignItems', 'justifyItems'],\n  placeSelf: ['alignSelf', 'justifySelf'],\n  textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],\n  textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],\n  transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],\n  wordWrap: ['overflowWrap']\n};\n\n/**\n * CSS properties which accept numbers but are not in units of \"px\".\n */\nvar isUnitlessNumber = {\n  animationIterationCount: true,\n  borderImageOutset: true,\n  borderImageSlice: true,\n  borderImageWidth: true,\n  boxFlex: true,\n  boxFlexGroup: true,\n  boxOrdinalGroup: true,\n  columnCount: true,\n  columns: true,\n  flex: true,\n  flexGrow: true,\n  flexPositive: true,\n  flexShrink: true,\n  flexNegative: true,\n  flexOrder: true,\n  gridArea: true,\n  gridRow: true,\n  gridRowEnd: true,\n  gridRowSpan: true,\n  gridRowStart: true,\n  gridColumn: true,\n  gridColumnEnd: true,\n  gridColumnSpan: true,\n  gridColumnStart: true,\n  fontWeight: true,\n  lineClamp: true,\n  lineHeight: true,\n  opacity: true,\n  order: true,\n  orphans: true,\n  tabSize: true,\n  widows: true,\n  zIndex: true,\n  zoom: true,\n  // SVG-related properties\n  fillOpacity: true,\n  floodOpacity: true,\n  stopOpacity: true,\n  strokeDasharray: true,\n  strokeDashoffset: true,\n  strokeMiterlimit: true,\n  strokeOpacity: true,\n  strokeWidth: true\n};\n/**\n * @param {string} prefix vendor-specific prefix, eg: Webkit\n * @param {string} key style name, eg: transitionDuration\n * @return {string} style name prefixed with `prefix`, properly camelCased, eg:\n * WebkitTransitionDuration\n */\n\nfunction prefixKey(prefix, key) {\n  return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n}\n/**\n * Support style names that may come passed in prefixed by adding permutations\n * of vendor prefixes.\n */\n\n\nvar prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an\n// infinite loop, because it iterates over the newly added props too.\n\nObject.keys(isUnitlessNumber).forEach(function (prop) {\n  prefixes.forEach(function (prefix) {\n    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n  });\n});\n\n/**\n * Convert a value into the proper css writable value. The style name `name`\n * should be logical (no hyphens), as specified\n * in `CSSProperty.isUnitlessNumber`.\n *\n * @param {string} name CSS property name such as `topMargin`.\n * @param {*} value CSS property value such as `10px`.\n * @return {string} Normalized style value with dimensions applied.\n */\n\nfunction dangerousStyleValue(name, value, isCustomProperty) {\n  // Note that we've removed escapeTextForBrowser() calls here since the\n  // whole string will be escaped when the attribute is injected into\n  // the markup. If you provide unsafe user data here they can inject\n  // arbitrary CSS which may be problematic (I couldn't repro this):\n  // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet\n  // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/\n  // This is not an XSS hole but instead a potential CSS injection issue\n  // which has lead to a greater discussion about how we're going to\n  // trust URLs moving forward. See #2115901\n  var isEmpty = value == null || typeof value === 'boolean' || value === '';\n\n  if (isEmpty) {\n    return '';\n  }\n\n  if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {\n    return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n  }\n\n  return ('' + value).trim();\n}\n\nvar uppercasePattern = /([A-Z])/g;\nvar msPattern = /^ms-/;\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n *   > hyphenateStyleName('backgroundColor')\n *   < \"background-color\"\n *   > hyphenateStyleName('MozTransition')\n *   < \"-moz-transition\"\n *   > hyphenateStyleName('msTransition')\n *   < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n */\n\nfunction hyphenateStyleName(name) {\n  return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');\n}\n\nvar warnValidStyle = function () {};\n\n{\n  // 'msTransform' is correct, but the other prefixes should be capitalized\n  var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;\n  var msPattern$1 = /^-ms-/;\n  var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon\n\n  var badStyleValueWithSemicolonPattern = /;\\s*$/;\n  var warnedStyleNames = {};\n  var warnedStyleValues = {};\n  var warnedForNaNValue = false;\n  var warnedForInfinityValue = false;\n\n  var camelize = function (string) {\n    return string.replace(hyphenPattern, function (_, character) {\n      return character.toUpperCase();\n    });\n  };\n\n  var warnHyphenatedStyleName = function (name) {\n    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n      return;\n    }\n\n    warnedStyleNames[name] = true;\n\n    error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests\n    // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix\n    // is converted to lowercase `ms`.\n    camelize(name.replace(msPattern$1, 'ms-')));\n  };\n\n  var warnBadVendoredStyleName = function (name) {\n    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n      return;\n    }\n\n    warnedStyleNames[name] = true;\n\n    error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));\n  };\n\n  var warnStyleValueWithSemicolon = function (name, value) {\n    if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {\n      return;\n    }\n\n    warnedStyleValues[value] = true;\n\n    error(\"Style property values shouldn't contain a semicolon. \" + 'Try \"%s: %s\" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));\n  };\n\n  var warnStyleValueIsNaN = function (name, value) {\n    if (warnedForNaNValue) {\n      return;\n    }\n\n    warnedForNaNValue = true;\n\n    error('`NaN` is an invalid value for the `%s` css style property.', name);\n  };\n\n  var warnStyleValueIsInfinity = function (name, value) {\n    if (warnedForInfinityValue) {\n      return;\n    }\n\n    warnedForInfinityValue = true;\n\n    error('`Infinity` is an invalid value for the `%s` css style property.', name);\n  };\n\n  warnValidStyle = function (name, value) {\n    if (name.indexOf('-') > -1) {\n      warnHyphenatedStyleName(name);\n    } else if (badVendoredStyleNamePattern.test(name)) {\n      warnBadVendoredStyleName(name);\n    } else if (badStyleValueWithSemicolonPattern.test(value)) {\n      warnStyleValueWithSemicolon(name, value);\n    }\n\n    if (typeof value === 'number') {\n      if (isNaN(value)) {\n        warnStyleValueIsNaN(name, value);\n      } else if (!isFinite(value)) {\n        warnStyleValueIsInfinity(name, value);\n      }\n    }\n  };\n}\n\nvar warnValidStyle$1 = warnValidStyle;\n\n/**\n * Operations for dealing with CSS properties.\n */\n\n/**\n * This creates a string that is expected to be equivalent to the style\n * attribute generated by server-side rendering. It by-passes warnings and\n * security checks so it's not safe to use this value for anything other than\n * comparison. It is only used in DEV for SSR validation.\n */\n\nfunction createDangerousStringForStyles(styles) {\n  {\n    var serialized = '';\n    var delimiter = '';\n\n    for (var styleName in styles) {\n      if (!styles.hasOwnProperty(styleName)) {\n        continue;\n      }\n\n      var styleValue = styles[styleName];\n\n      if (styleValue != null) {\n        var isCustomProperty = styleName.indexOf('--') === 0;\n        serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':';\n        serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);\n        delimiter = ';';\n      }\n    }\n\n    return serialized || null;\n  }\n}\n/**\n * Sets the value for multiple styles on a node.  If a value is specified as\n * '' (empty string), the corresponding style property will be unset.\n *\n * @param {DOMElement} node\n * @param {object} styles\n */\n\nfunction setValueForStyles(node, styles) {\n  var style = node.style;\n\n  for (var styleName in styles) {\n    if (!styles.hasOwnProperty(styleName)) {\n      continue;\n    }\n\n    var isCustomProperty = styleName.indexOf('--') === 0;\n\n    {\n      if (!isCustomProperty) {\n        warnValidStyle$1(styleName, styles[styleName]);\n      }\n    }\n\n    var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);\n\n    if (styleName === 'float') {\n      styleName = 'cssFloat';\n    }\n\n    if (isCustomProperty) {\n      style.setProperty(styleName, styleValue);\n    } else {\n      style[styleName] = styleValue;\n    }\n  }\n}\n\nfunction isValueEmpty(value) {\n  return value == null || typeof value === 'boolean' || value === '';\n}\n/**\n * Given {color: 'red', overflow: 'hidden'} returns {\n *   color: 'color',\n *   overflowX: 'overflow',\n *   overflowY: 'overflow',\n * }. This can be read as \"the overflowY property was set by the overflow\n * shorthand\". That is, the values are the property that each was derived from.\n */\n\n\nfunction expandShorthandMap(styles) {\n  var expanded = {};\n\n  for (var key in styles) {\n    var longhands = shorthandToLonghand[key] || [key];\n\n    for (var i = 0; i < longhands.length; i++) {\n      expanded[longhands[i]] = key;\n    }\n  }\n\n  return expanded;\n}\n/**\n * When mixing shorthand and longhand property names, we warn during updates if\n * we expect an incorrect result to occur. In particular, we warn for:\n *\n * Updating a shorthand property (longhand gets overwritten):\n *   {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}\n *   becomes .style.font = 'baz'\n * Removing a shorthand property (longhand gets lost too):\n *   {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}\n *   becomes .style.font = ''\n * Removing a longhand property (should revert to shorthand; doesn't):\n *   {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}\n *   becomes .style.fontVariant = ''\n */\n\n\nfunction validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {\n  {\n\n    if (!nextStyles) {\n      return;\n    }\n\n    var expandedUpdates = expandShorthandMap(styleUpdates);\n    var expandedStyles = expandShorthandMap(nextStyles);\n    var warnedAbout = {};\n\n    for (var key in expandedUpdates) {\n      var originalKey = expandedUpdates[key];\n      var correctOriginalKey = expandedStyles[key];\n\n      if (correctOriginalKey && originalKey !== correctOriginalKey) {\n        var warningKey = originalKey + ',' + correctOriginalKey;\n\n        if (warnedAbout[warningKey]) {\n          continue;\n        }\n\n        warnedAbout[warningKey] = true;\n\n        error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + \"avoid this, don't mix shorthand and non-shorthand properties \" + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey);\n      }\n    }\n  }\n}\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special-case tags.\nvar omittedCloseTags = {\n  area: true,\n  base: true,\n  br: true,\n  col: true,\n  embed: true,\n  hr: true,\n  img: true,\n  input: true,\n  keygen: true,\n  link: true,\n  meta: true,\n  param: true,\n  source: true,\n  track: true,\n  wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.\n\n};\n\n// `omittedCloseTags` except that `menuitem` should still have its closing tag.\n\nvar voidElementTags = _assign({\n  menuitem: true\n}, omittedCloseTags);\n\nvar HTML = '__html';\nvar ReactDebugCurrentFrame$3 = null;\n\n{\n  ReactDebugCurrentFrame$3 = ReactSharedInternals.ReactDebugCurrentFrame;\n}\n\nfunction assertValidProps(tag, props) {\n  if (!props) {\n    return;\n  } // Note the use of `==` which checks for null or undefined.\n\n\n  if (voidElementTags[tag]) {\n    if (!(props.children == null && props.dangerouslySetInnerHTML == null)) {\n      {\n        throw Error( tag + \" is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.\" + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );\n      }\n    }\n  }\n\n  if (props.dangerouslySetInnerHTML != null) {\n    if (!(props.children == null)) {\n      {\n        throw Error( \"Can only set one of `children` or `props.dangerouslySetInnerHTML`.\" );\n      }\n    }\n\n    if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) {\n      {\n        throw Error( \"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.\" );\n      }\n    }\n  }\n\n  {\n    if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {\n      error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.');\n    }\n  }\n\n  if (!(props.style == null || typeof props.style === 'object')) {\n    {\n      throw Error( \"The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.\" + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );\n    }\n  }\n}\n\nfunction isCustomComponent(tagName, props) {\n  if (tagName.indexOf('-') === -1) {\n    return typeof props.is === 'string';\n  }\n\n  switch (tagName) {\n    // These are reserved SVG and MathML elements.\n    // We don't mind this whitelist too much because we expect it to never grow.\n    // The alternative is to track the namespace in a few places which is convoluted.\n    // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts\n    case 'annotation-xml':\n    case 'color-profile':\n    case 'font-face':\n    case 'font-face-src':\n    case 'font-face-uri':\n    case 'font-face-format':\n    case 'font-face-name':\n    case 'missing-glyph':\n      return false;\n\n    default:\n      return true;\n  }\n}\n\n// When adding attributes to the HTML or SVG whitelist, be sure to\n// also add them to this module to ensure casing and incorrect name\n// warnings.\nvar possibleStandardNames = {\n  // HTML\n  accept: 'accept',\n  acceptcharset: 'acceptCharset',\n  'accept-charset': 'acceptCharset',\n  accesskey: 'accessKey',\n  action: 'action',\n  allowfullscreen: 'allowFullScreen',\n  alt: 'alt',\n  as: 'as',\n  async: 'async',\n  autocapitalize: 'autoCapitalize',\n  autocomplete: 'autoComplete',\n  autocorrect: 'autoCorrect',\n  autofocus: 'autoFocus',\n  autoplay: 'autoPlay',\n  autosave: 'autoSave',\n  capture: 'capture',\n  cellpadding: 'cellPadding',\n  cellspacing: 'cellSpacing',\n  challenge: 'challenge',\n  charset: 'charSet',\n  checked: 'checked',\n  children: 'children',\n  cite: 'cite',\n  class: 'className',\n  classid: 'classID',\n  classname: 'className',\n  cols: 'cols',\n  colspan: 'colSpan',\n  content: 'content',\n  contenteditable: 'contentEditable',\n  contextmenu: 'contextMenu',\n  controls: 'controls',\n  controlslist: 'controlsList',\n  coords: 'coords',\n  crossorigin: 'crossOrigin',\n  dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',\n  data: 'data',\n  datetime: 'dateTime',\n  default: 'default',\n  defaultchecked: 'defaultChecked',\n  defaultvalue: 'defaultValue',\n  defer: 'defer',\n  dir: 'dir',\n  disabled: 'disabled',\n  disablepictureinpicture: 'disablePictureInPicture',\n  download: 'download',\n  draggable: 'draggable',\n  enctype: 'encType',\n  for: 'htmlFor',\n  form: 'form',\n  formmethod: 'formMethod',\n  formaction: 'formAction',\n  formenctype: 'formEncType',\n  formnovalidate: 'formNoValidate',\n  formtarget: 'formTarget',\n  frameborder: 'frameBorder',\n  headers: 'headers',\n  height: 'height',\n  hidden: 'hidden',\n  high: 'high',\n  href: 'href',\n  hreflang: 'hrefLang',\n  htmlfor: 'htmlFor',\n  httpequiv: 'httpEquiv',\n  'http-equiv': 'httpEquiv',\n  icon: 'icon',\n  id: 'id',\n  innerhtml: 'innerHTML',\n  inputmode: 'inputMode',\n  integrity: 'integrity',\n  is: 'is',\n  itemid: 'itemID',\n  itemprop: 'itemProp',\n  itemref: 'itemRef',\n  itemscope: 'itemScope',\n  itemtype: 'itemType',\n  keyparams: 'keyParams',\n  keytype: 'keyType',\n  kind: 'kind',\n  label: 'label',\n  lang: 'lang',\n  list: 'list',\n  loop: 'loop',\n  low: 'low',\n  manifest: 'manifest',\n  marginwidth: 'marginWidth',\n  marginheight: 'marginHeight',\n  max: 'max',\n  maxlength: 'maxLength',\n  media: 'media',\n  mediagroup: 'mediaGroup',\n  method: 'method',\n  min: 'min',\n  minlength: 'minLength',\n  multiple: 'multiple',\n  muted: 'muted',\n  name: 'name',\n  nomodule: 'noModule',\n  nonce: 'nonce',\n  novalidate: 'noValidate',\n  open: 'open',\n  optimum: 'optimum',\n  pattern: 'pattern',\n  placeholder: 'placeholder',\n  playsinline: 'playsInline',\n  poster: 'poster',\n  preload: 'preload',\n  profile: 'profile',\n  radiogroup: 'radioGroup',\n  readonly: 'readOnly',\n  referrerpolicy: 'referrerPolicy',\n  rel: 'rel',\n  required: 'required',\n  reversed: 'reversed',\n  role: 'role',\n  rows: 'rows',\n  rowspan: 'rowSpan',\n  sandbox: 'sandbox',\n  scope: 'scope',\n  scoped: 'scoped',\n  scrolling: 'scrolling',\n  seamless: 'seamless',\n  selected: 'selected',\n  shape: 'shape',\n  size: 'size',\n  sizes: 'sizes',\n  span: 'span',\n  spellcheck: 'spellCheck',\n  src: 'src',\n  srcdoc: 'srcDoc',\n  srclang: 'srcLang',\n  srcset: 'srcSet',\n  start: 'start',\n  step: 'step',\n  style: 'style',\n  summary: 'summary',\n  tabindex: 'tabIndex',\n  target: 'target',\n  title: 'title',\n  type: 'type',\n  usemap: 'useMap',\n  value: 'value',\n  width: 'width',\n  wmode: 'wmode',\n  wrap: 'wrap',\n  // SVG\n  about: 'about',\n  accentheight: 'accentHeight',\n  'accent-height': 'accentHeight',\n  accumulate: 'accumulate',\n  additive: 'additive',\n  alignmentbaseline: 'alignmentBaseline',\n  'alignment-baseline': 'alignmentBaseline',\n  allowreorder: 'allowReorder',\n  alphabetic: 'alphabetic',\n  amplitude: 'amplitude',\n  arabicform: 'arabicForm',\n  'arabic-form': 'arabicForm',\n  ascent: 'ascent',\n  attributename: 'attributeName',\n  attributetype: 'attributeType',\n  autoreverse: 'autoReverse',\n  azimuth: 'azimuth',\n  basefrequency: 'baseFrequency',\n  baselineshift: 'baselineShift',\n  'baseline-shift': 'baselineShift',\n  baseprofile: 'baseProfile',\n  bbox: 'bbox',\n  begin: 'begin',\n  bias: 'bias',\n  by: 'by',\n  calcmode: 'calcMode',\n  capheight: 'capHeight',\n  'cap-height': 'capHeight',\n  clip: 'clip',\n  clippath: 'clipPath',\n  'clip-path': 'clipPath',\n  clippathunits: 'clipPathUnits',\n  cliprule: 'clipRule',\n  'clip-rule': 'clipRule',\n  color: 'color',\n  colorinterpolation: 'colorInterpolation',\n  'color-interpolation': 'colorInterpolation',\n  colorinterpolationfilters: 'colorInterpolationFilters',\n  'color-interpolation-filters': 'colorInterpolationFilters',\n  colorprofile: 'colorProfile',\n  'color-profile': 'colorProfile',\n  colorrendering: 'colorRendering',\n  'color-rendering': 'colorRendering',\n  contentscripttype: 'contentScriptType',\n  contentstyletype: 'contentStyleType',\n  cursor: 'cursor',\n  cx: 'cx',\n  cy: 'cy',\n  d: 'd',\n  datatype: 'datatype',\n  decelerate: 'decelerate',\n  descent: 'descent',\n  diffuseconstant: 'diffuseConstant',\n  direction: 'direction',\n  display: 'display',\n  divisor: 'divisor',\n  dominantbaseline: 'dominantBaseline',\n  'dominant-baseline': 'dominantBaseline',\n  dur: 'dur',\n  dx: 'dx',\n  dy: 'dy',\n  edgemode: 'edgeMode',\n  elevation: 'elevation',\n  enablebackground: 'enableBackground',\n  'enable-background': 'enableBackground',\n  end: 'end',\n  exponent: 'exponent',\n  externalresourcesrequired: 'externalResourcesRequired',\n  fill: 'fill',\n  fillopacity: 'fillOpacity',\n  'fill-opacity': 'fillOpacity',\n  fillrule: 'fillRule',\n  'fill-rule': 'fillRule',\n  filter: 'filter',\n  filterres: 'filterRes',\n  filterunits: 'filterUnits',\n  floodopacity: 'floodOpacity',\n  'flood-opacity': 'floodOpacity',\n  floodcolor: 'floodColor',\n  'flood-color': 'floodColor',\n  focusable: 'focusable',\n  fontfamily: 'fontFamily',\n  'font-family': 'fontFamily',\n  fontsize: 'fontSize',\n  'font-size': 'fontSize',\n  fontsizeadjust: 'fontSizeAdjust',\n  'font-size-adjust': 'fontSizeAdjust',\n  fontstretch: 'fontStretch',\n  'font-stretch': 'fontStretch',\n  fontstyle: 'fontStyle',\n  'font-style': 'fontStyle',\n  fontvariant: 'fontVariant',\n  'font-variant': 'fontVariant',\n  fontweight: 'fontWeight',\n  'font-weight': 'fontWeight',\n  format: 'format',\n  from: 'from',\n  fx: 'fx',\n  fy: 'fy',\n  g1: 'g1',\n  g2: 'g2',\n  glyphname: 'glyphName',\n  'glyph-name': 'glyphName',\n  glyphorientationhorizontal: 'glyphOrientationHorizontal',\n  'glyph-orientation-horizontal': 'glyphOrientationHorizontal',\n  glyphorientationvertical: 'glyphOrientationVertical',\n  'glyph-orientation-vertical': 'glyphOrientationVertical',\n  glyphref: 'glyphRef',\n  gradienttransform: 'gradientTransform',\n  gradientunits: 'gradientUnits',\n  hanging: 'hanging',\n  horizadvx: 'horizAdvX',\n  'horiz-adv-x': 'horizAdvX',\n  horizoriginx: 'horizOriginX',\n  'horiz-origin-x': 'horizOriginX',\n  ideographic: 'ideographic',\n  imagerendering: 'imageRendering',\n  'image-rendering': 'imageRendering',\n  in2: 'in2',\n  in: 'in',\n  inlist: 'inlist',\n  intercept: 'intercept',\n  k1: 'k1',\n  k2: 'k2',\n  k3: 'k3',\n  k4: 'k4',\n  k: 'k',\n  kernelmatrix: 'kernelMatrix',\n  kernelunitlength: 'kernelUnitLength',\n  kerning: 'kerning',\n  keypoints: 'keyPoints',\n  keysplines: 'keySplines',\n  keytimes: 'keyTimes',\n  lengthadjust: 'lengthAdjust',\n  letterspacing: 'letterSpacing',\n  'letter-spacing': 'letterSpacing',\n  lightingcolor: 'lightingColor',\n  'lighting-color': 'lightingColor',\n  limitingconeangle: 'limitingConeAngle',\n  local: 'local',\n  markerend: 'markerEnd',\n  'marker-end': 'markerEnd',\n  markerheight: 'markerHeight',\n  markermid: 'markerMid',\n  'marker-mid': 'markerMid',\n  markerstart: 'markerStart',\n  'marker-start': 'markerStart',\n  markerunits: 'markerUnits',\n  markerwidth: 'markerWidth',\n  mask: 'mask',\n  maskcontentunits: 'maskContentUnits',\n  maskunits: 'maskUnits',\n  mathematical: 'mathematical',\n  mode: 'mode',\n  numoctaves: 'numOctaves',\n  offset: 'offset',\n  opacity: 'opacity',\n  operator: 'operator',\n  order: 'order',\n  orient: 'orient',\n  orientation: 'orientation',\n  origin: 'origin',\n  overflow: 'overflow',\n  overlineposition: 'overlinePosition',\n  'overline-position': 'overlinePosition',\n  overlinethickness: 'overlineThickness',\n  'overline-thickness': 'overlineThickness',\n  paintorder: 'paintOrder',\n  'paint-order': 'paintOrder',\n  panose1: 'panose1',\n  'panose-1': 'panose1',\n  pathlength: 'pathLength',\n  patterncontentunits: 'patternContentUnits',\n  patterntransform: 'patternTransform',\n  patternunits: 'patternUnits',\n  pointerevents: 'pointerEvents',\n  'pointer-events': 'pointerEvents',\n  points: 'points',\n  pointsatx: 'pointsAtX',\n  pointsaty: 'pointsAtY',\n  pointsatz: 'pointsAtZ',\n  prefix: 'prefix',\n  preservealpha: 'preserveAlpha',\n  preserveaspectratio: 'preserveAspectRatio',\n  primitiveunits: 'primitiveUnits',\n  property: 'property',\n  r: 'r',\n  radius: 'radius',\n  refx: 'refX',\n  refy: 'refY',\n  renderingintent: 'renderingIntent',\n  'rendering-intent': 'renderingIntent',\n  repeatcount: 'repeatCount',\n  repeatdur: 'repeatDur',\n  requiredextensions: 'requiredExtensions',\n  requiredfeatures: 'requiredFeatures',\n  resource: 'resource',\n  restart: 'restart',\n  result: 'result',\n  results: 'results',\n  rotate: 'rotate',\n  rx: 'rx',\n  ry: 'ry',\n  scale: 'scale',\n  security: 'security',\n  seed: 'seed',\n  shaperendering: 'shapeRendering',\n  'shape-rendering': 'shapeRendering',\n  slope: 'slope',\n  spacing: 'spacing',\n  specularconstant: 'specularConstant',\n  specularexponent: 'specularExponent',\n  speed: 'speed',\n  spreadmethod: 'spreadMethod',\n  startoffset: 'startOffset',\n  stddeviation: 'stdDeviation',\n  stemh: 'stemh',\n  stemv: 'stemv',\n  stitchtiles: 'stitchTiles',\n  stopcolor: 'stopColor',\n  'stop-color': 'stopColor',\n  stopopacity: 'stopOpacity',\n  'stop-opacity': 'stopOpacity',\n  strikethroughposition: 'strikethroughPosition',\n  'strikethrough-position': 'strikethroughPosition',\n  strikethroughthickness: 'strikethroughThickness',\n  'strikethrough-thickness': 'strikethroughThickness',\n  string: 'string',\n  stroke: 'stroke',\n  strokedasharray: 'strokeDasharray',\n  'stroke-dasharray': 'strokeDasharray',\n  strokedashoffset: 'strokeDashoffset',\n  'stroke-dashoffset': 'strokeDashoffset',\n  strokelinecap: 'strokeLinecap',\n  'stroke-linecap': 'strokeLinecap',\n  strokelinejoin: 'strokeLinejoin',\n  'stroke-linejoin': 'strokeLinejoin',\n  strokemiterlimit: 'strokeMiterlimit',\n  'stroke-miterlimit': 'strokeMiterlimit',\n  strokewidth: 'strokeWidth',\n  'stroke-width': 'strokeWidth',\n  strokeopacity: 'strokeOpacity',\n  'stroke-opacity': 'strokeOpacity',\n  suppresscontenteditablewarning: 'suppressContentEditableWarning',\n  suppresshydrationwarning: 'suppressHydrationWarning',\n  surfacescale: 'surfaceScale',\n  systemlanguage: 'systemLanguage',\n  tablevalues: 'tableValues',\n  targetx: 'targetX',\n  targety: 'targetY',\n  textanchor: 'textAnchor',\n  'text-anchor': 'textAnchor',\n  textdecoration: 'textDecoration',\n  'text-decoration': 'textDecoration',\n  textlength: 'textLength',\n  textrendering: 'textRendering',\n  'text-rendering': 'textRendering',\n  to: 'to',\n  transform: 'transform',\n  typeof: 'typeof',\n  u1: 'u1',\n  u2: 'u2',\n  underlineposition: 'underlinePosition',\n  'underline-position': 'underlinePosition',\n  underlinethickness: 'underlineThickness',\n  'underline-thickness': 'underlineThickness',\n  unicode: 'unicode',\n  unicodebidi: 'unicodeBidi',\n  'unicode-bidi': 'unicodeBidi',\n  unicoderange: 'unicodeRange',\n  'unicode-range': 'unicodeRange',\n  unitsperem: 'unitsPerEm',\n  'units-per-em': 'unitsPerEm',\n  unselectable: 'unselectable',\n  valphabetic: 'vAlphabetic',\n  'v-alphabetic': 'vAlphabetic',\n  values: 'values',\n  vectoreffect: 'vectorEffect',\n  'vector-effect': 'vectorEffect',\n  version: 'version',\n  vertadvy: 'vertAdvY',\n  'vert-adv-y': 'vertAdvY',\n  vertoriginx: 'vertOriginX',\n  'vert-origin-x': 'vertOriginX',\n  vertoriginy: 'vertOriginY',\n  'vert-origin-y': 'vertOriginY',\n  vhanging: 'vHanging',\n  'v-hanging': 'vHanging',\n  videographic: 'vIdeographic',\n  'v-ideographic': 'vIdeographic',\n  viewbox: 'viewBox',\n  viewtarget: 'viewTarget',\n  visibility: 'visibility',\n  vmathematical: 'vMathematical',\n  'v-mathematical': 'vMathematical',\n  vocab: 'vocab',\n  widths: 'widths',\n  wordspacing: 'wordSpacing',\n  'word-spacing': 'wordSpacing',\n  writingmode: 'writingMode',\n  'writing-mode': 'writingMode',\n  x1: 'x1',\n  x2: 'x2',\n  x: 'x',\n  xchannelselector: 'xChannelSelector',\n  xheight: 'xHeight',\n  'x-height': 'xHeight',\n  xlinkactuate: 'xlinkActuate',\n  'xlink:actuate': 'xlinkActuate',\n  xlinkarcrole: 'xlinkArcrole',\n  'xlink:arcrole': 'xlinkArcrole',\n  xlinkhref: 'xlinkHref',\n  'xlink:href': 'xlinkHref',\n  xlinkrole: 'xlinkRole',\n  'xlink:role': 'xlinkRole',\n  xlinkshow: 'xlinkShow',\n  'xlink:show': 'xlinkShow',\n  xlinktitle: 'xlinkTitle',\n  'xlink:title': 'xlinkTitle',\n  xlinktype: 'xlinkType',\n  'xlink:type': 'xlinkType',\n  xmlbase: 'xmlBase',\n  'xml:base': 'xmlBase',\n  xmllang: 'xmlLang',\n  'xml:lang': 'xmlLang',\n  xmlns: 'xmlns',\n  'xml:space': 'xmlSpace',\n  xmlnsxlink: 'xmlnsXlink',\n  'xmlns:xlink': 'xmlnsXlink',\n  xmlspace: 'xmlSpace',\n  y1: 'y1',\n  y2: 'y2',\n  y: 'y',\n  ychannelselector: 'yChannelSelector',\n  z: 'z',\n  zoomandpan: 'zoomAndPan'\n};\n\nvar ariaProperties = {\n  'aria-current': 0,\n  // state\n  'aria-details': 0,\n  'aria-disabled': 0,\n  // state\n  'aria-hidden': 0,\n  // state\n  'aria-invalid': 0,\n  // state\n  'aria-keyshortcuts': 0,\n  'aria-label': 0,\n  'aria-roledescription': 0,\n  // Widget Attributes\n  'aria-autocomplete': 0,\n  'aria-checked': 0,\n  'aria-expanded': 0,\n  'aria-haspopup': 0,\n  'aria-level': 0,\n  'aria-modal': 0,\n  'aria-multiline': 0,\n  'aria-multiselectable': 0,\n  'aria-orientation': 0,\n  'aria-placeholder': 0,\n  'aria-pressed': 0,\n  'aria-readonly': 0,\n  'aria-required': 0,\n  'aria-selected': 0,\n  'aria-sort': 0,\n  'aria-valuemax': 0,\n  'aria-valuemin': 0,\n  'aria-valuenow': 0,\n  'aria-valuetext': 0,\n  // Live Region Attributes\n  'aria-atomic': 0,\n  'aria-busy': 0,\n  'aria-live': 0,\n  'aria-relevant': 0,\n  // Drag-and-Drop Attributes\n  'aria-dropeffect': 0,\n  'aria-grabbed': 0,\n  // Relationship Attributes\n  'aria-activedescendant': 0,\n  'aria-colcount': 0,\n  'aria-colindex': 0,\n  'aria-colspan': 0,\n  'aria-controls': 0,\n  'aria-describedby': 0,\n  'aria-errormessage': 0,\n  'aria-flowto': 0,\n  'aria-labelledby': 0,\n  'aria-owns': 0,\n  'aria-posinset': 0,\n  'aria-rowcount': 0,\n  'aria-rowindex': 0,\n  'aria-rowspan': 0,\n  'aria-setsize': 0\n};\n\nvar warnedProperties = {};\nvar rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\nfunction validateProperty(tagName, name) {\n  {\n    if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) {\n      return true;\n    }\n\n    if (rARIACamel.test(name)) {\n      var ariaName = 'aria-' + name.slice(4).toLowerCase();\n      var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM\n      // DOM properties, then it is an invalid aria-* attribute.\n\n      if (correctName == null) {\n        error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);\n\n        warnedProperties[name] = true;\n        return true;\n      } // aria-* attributes should be lowercase; suggest the lowercase version.\n\n\n      if (name !== correctName) {\n        error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);\n\n        warnedProperties[name] = true;\n        return true;\n      }\n    }\n\n    if (rARIA.test(name)) {\n      var lowerCasedName = name.toLowerCase();\n      var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM\n      // DOM properties, then it is an invalid aria-* attribute.\n\n      if (standardName == null) {\n        warnedProperties[name] = true;\n        return false;\n      } // aria-* attributes should be lowercase; suggest the lowercase version.\n\n\n      if (name !== standardName) {\n        error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);\n\n        warnedProperties[name] = true;\n        return true;\n      }\n    }\n  }\n\n  return true;\n}\n\nfunction warnInvalidARIAProps(type, props) {\n  {\n    var invalidProps = [];\n\n    for (var key in props) {\n      var isValid = validateProperty(type, key);\n\n      if (!isValid) {\n        invalidProps.push(key);\n      }\n    }\n\n    var unknownPropString = invalidProps.map(function (prop) {\n      return '`' + prop + '`';\n    }).join(', ');\n\n    if (invalidProps.length === 1) {\n      error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);\n    } else if (invalidProps.length > 1) {\n      error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);\n    }\n  }\n}\n\nfunction validateProperties(type, props) {\n  if (isCustomComponent(type, props)) {\n    return;\n  }\n\n  warnInvalidARIAProps(type, props);\n}\n\nvar didWarnValueNull = false;\nfunction validateProperties$1(type, props) {\n  {\n    if (type !== 'input' && type !== 'textarea' && type !== 'select') {\n      return;\n    }\n\n    if (props != null && props.value === null && !didWarnValueNull) {\n      didWarnValueNull = true;\n\n      if (type === 'select' && props.multiple) {\n        error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);\n      } else {\n        error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);\n      }\n    }\n  }\n}\n\nvar validateProperty$1 = function () {};\n\n{\n  var warnedProperties$1 = {};\n  var _hasOwnProperty = Object.prototype.hasOwnProperty;\n  var EVENT_NAME_REGEX = /^on./;\n  var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;\n  var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\n  var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\n\n  validateProperty$1 = function (tagName, name, value, canUseEventSystem) {\n    if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {\n      return true;\n    }\n\n    var lowerCasedName = name.toLowerCase();\n\n    if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {\n      error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');\n\n      warnedProperties$1[name] = true;\n      return true;\n    } // We can't rely on the event system being injected on the server.\n\n\n    if (canUseEventSystem) {\n      if (registrationNameModules.hasOwnProperty(name)) {\n        return true;\n      }\n\n      var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;\n\n      if (registrationName != null) {\n        error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n\n      if (EVENT_NAME_REGEX.test(name)) {\n        error('Unknown event handler property `%s`. It will be ignored.', name);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n    } else if (EVENT_NAME_REGEX.test(name)) {\n      // If no event plugins have been injected, we are in a server environment.\n      // So we can't tell if the event name is correct for sure, but we can filter\n      // out known bad ones like `onclick`. We can't suggest a specific replacement though.\n      if (INVALID_EVENT_NAME_REGEX.test(name)) {\n        error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);\n      }\n\n      warnedProperties$1[name] = true;\n      return true;\n    } // Let the ARIA attribute hook validate ARIA attributes\n\n\n    if (rARIA$1.test(name) || rARIACamel$1.test(name)) {\n      return true;\n    }\n\n    if (lowerCasedName === 'innerhtml') {\n      error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (lowerCasedName === 'aria') {\n      error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {\n      error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (typeof value === 'number' && isNaN(value)) {\n      error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    var propertyInfo = getPropertyInfo(name);\n    var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.\n\n    if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n      var standardName = possibleStandardNames[lowerCasedName];\n\n      if (standardName !== name) {\n        error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n    } else if (!isReserved && name !== lowerCasedName) {\n      // Unknown attributes should have lowercase casing since that's how they\n      // will be cased anyway with server rendering.\n      error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {\n      if (value) {\n        error('Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.', value, name, name, value, name);\n      } else {\n        error('Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);\n      }\n\n      warnedProperties$1[name] = true;\n      return true;\n    } // Now that we've validated casing, do not validate\n    // data types for reserved props\n\n\n    if (isReserved) {\n      return true;\n    } // Warn when a known attribute is a bad type\n\n\n    if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {\n      warnedProperties$1[name] = true;\n      return false;\n    } // Warn when passing the strings 'false' or 'true' into a boolean prop\n\n\n    if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {\n      error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string \"false\".', name, value);\n\n      warnedProperties$1[name] = true;\n      return true;\n    }\n\n    return true;\n  };\n}\n\nvar warnUnknownProperties = function (type, props, canUseEventSystem) {\n  {\n    var unknownProps = [];\n\n    for (var key in props) {\n      var isValid = validateProperty$1(type, key, props[key], canUseEventSystem);\n\n      if (!isValid) {\n        unknownProps.push(key);\n      }\n    }\n\n    var unknownPropString = unknownProps.map(function (prop) {\n      return '`' + prop + '`';\n    }).join(', ');\n\n    if (unknownProps.length === 1) {\n      error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);\n    } else if (unknownProps.length > 1) {\n      error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);\n    }\n  }\n};\n\nfunction validateProperties$2(type, props, canUseEventSystem) {\n  if (isCustomComponent(type, props)) {\n    return;\n  }\n\n  warnUnknownProperties(type, props, canUseEventSystem);\n}\n\nvar didWarnInvalidHydration = false;\nvar DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';\nvar SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';\nvar SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';\nvar AUTOFOCUS = 'autoFocus';\nvar CHILDREN = 'children';\nvar STYLE = 'style';\nvar HTML$1 = '__html';\nvar HTML_NAMESPACE$1 = Namespaces.html;\nvar warnedUnknownTags;\nvar suppressHydrationWarning;\nvar validatePropertiesInDevelopment;\nvar warnForTextDifference;\nvar warnForPropDifference;\nvar warnForExtraAttributes;\nvar warnForInvalidEventListener;\nvar canDiffStyleForHydrationWarning;\nvar normalizeMarkupForTextOrAttribute;\nvar normalizeHTML;\n\n{\n  warnedUnknownTags = {\n    // Chrome is the only major browser not shipping <time>. But as of July\n    // 2017 it intends to ship it due to widespread usage. We intentionally\n    // *don't* warn for <time> even if it's unrecognized by Chrome because\n    // it soon will be, and many apps have been using it anyway.\n    time: true,\n    // There are working polyfills for <dialog>. Let people use it.\n    dialog: true,\n    // Electron ships a custom <webview> tag to display external web content in\n    // an isolated frame and process.\n    // This tag is not present in non Electron environments such as JSDom which\n    // is often used for testing purposes.\n    // @see https://electronjs.org/docs/api/webview-tag\n    webview: true\n  };\n\n  validatePropertiesInDevelopment = function (type, props) {\n    validateProperties(type, props);\n    validateProperties$1(type, props);\n    validateProperties$2(type, props,\n    /* canUseEventSystem */\n    true);\n  }; // IE 11 parses & normalizes the style attribute as opposed to other\n  // browsers. It adds spaces and sorts the properties in some\n  // non-alphabetical order. Handling that would require sorting CSS\n  // properties in the client & server versions or applying\n  // `expectedStyle` to a temporary DOM node to read its `style` attribute\n  // normalized. Since it only affects IE, we're skipping style warnings\n  // in that browser completely in favor of doing all that work.\n  // See https://github.com/facebook/react/issues/11807\n\n\n  canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF.\n  // It also can turn \\u0000 into \\uFFFD inside attributes.\n  // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream\n  // If we have a mismatch, it might be caused by that.\n  // We will still patch up in this case but not fire the warning.\n\n  var NORMALIZE_NEWLINES_REGEX = /\\r\\n?/g;\n  var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\\u0000|\\uFFFD/g;\n\n  normalizeMarkupForTextOrAttribute = function (markup) {\n    var markupString = typeof markup === 'string' ? markup : '' + markup;\n    return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');\n  };\n\n  warnForTextDifference = function (serverText, clientText) {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);\n    var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);\n\n    if (normalizedServerText === normalizedClientText) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Text content did not match. Server: \"%s\" Client: \"%s\"', normalizedServerText, normalizedClientText);\n  };\n\n  warnForPropDifference = function (propName, serverValue, clientValue) {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);\n    var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);\n\n    if (normalizedServerValue === normalizedClientValue) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));\n  };\n\n  warnForExtraAttributes = function (attributeNames) {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n    var names = [];\n    attributeNames.forEach(function (name) {\n      names.push(name);\n    });\n\n    error('Extra attributes from the server: %s', names);\n  };\n\n  warnForInvalidEventListener = function (registrationName, listener) {\n    if (listener === false) {\n      error('Expected `%s` listener to be a function, instead got `false`.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName);\n    } else {\n      error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);\n    }\n  }; // Parse the HTML and read it back to normalize the HTML string so that it\n  // can be used for comparison.\n\n\n  normalizeHTML = function (parent, html) {\n    // We could have created a separate document here to avoid\n    // re-initializing custom elements if they exist. But this breaks\n    // how <noscript> is being handled. So we use the same document.\n    // See the discussion in https://github.com/facebook/react/pull/11157.\n    var testElement = parent.namespaceURI === HTML_NAMESPACE$1 ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);\n    testElement.innerHTML = html;\n    return testElement.innerHTML;\n  };\n}\n\nfunction ensureListeningTo(rootContainerElement, registrationName) {\n  var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE;\n  var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument;\n  legacyListenToEvent(registrationName, doc);\n}\n\nfunction getOwnerDocumentFromRootContainer(rootContainerElement) {\n  return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;\n}\n\nfunction noop() {}\n\nfunction trapClickOnNonInteractiveElement(node) {\n  // Mobile Safari does not fire properly bubble click events on\n  // non-interactive elements, which means delegated click listeners do not\n  // fire. The workaround for this bug involves attaching an empty click\n  // listener on the target node.\n  // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n  // Just set it using the onclick property so that we don't have to manage any\n  // bookkeeping for it. Not sure if we need to clear it when the listener is\n  // removed.\n  // TODO: Only do this for the relevant Safaris maybe?\n  node.onclick = noop;\n}\n\nfunction setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {\n  for (var propKey in nextProps) {\n    if (!nextProps.hasOwnProperty(propKey)) {\n      continue;\n    }\n\n    var nextProp = nextProps[propKey];\n\n    if (propKey === STYLE) {\n      {\n        if (nextProp) {\n          // Freeze the next style object so that we can assume it won't be\n          // mutated. We have already warned for this in the past.\n          Object.freeze(nextProp);\n        }\n      } // Relies on `updateStylesByID` not mutating `styleUpdates`.\n\n\n      setValueForStyles(domElement, nextProp);\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n      var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n\n      if (nextHtml != null) {\n        setInnerHTML(domElement, nextHtml);\n      }\n    } else if (propKey === CHILDREN) {\n      if (typeof nextProp === 'string') {\n        // Avoid setting initial textContent when the text is empty. In IE11 setting\n        // textContent on a <textarea> will cause the placeholder to not\n        // show within the <textarea> until it has been focused and blurred again.\n        // https://github.com/facebook/react/issues/6731#issuecomment-254874553\n        var canSetTextContent = tag !== 'textarea' || nextProp !== '';\n\n        if (canSetTextContent) {\n          setTextContent(domElement, nextProp);\n        }\n      } else if (typeof nextProp === 'number') {\n        setTextContent(domElement, '' + nextProp);\n      }\n    } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n      if (nextProp != null) {\n        if ( typeof nextProp !== 'function') {\n          warnForInvalidEventListener(propKey, nextProp);\n        }\n\n        ensureListeningTo(rootContainerElement, propKey);\n      }\n    } else if (nextProp != null) {\n      setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);\n    }\n  }\n}\n\nfunction updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {\n  // TODO: Handle wasCustomComponentTag\n  for (var i = 0; i < updatePayload.length; i += 2) {\n    var propKey = updatePayload[i];\n    var propValue = updatePayload[i + 1];\n\n    if (propKey === STYLE) {\n      setValueForStyles(domElement, propValue);\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n      setInnerHTML(domElement, propValue);\n    } else if (propKey === CHILDREN) {\n      setTextContent(domElement, propValue);\n    } else {\n      setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);\n    }\n  }\n}\n\nfunction createElement(type, props, rootContainerElement, parentNamespace) {\n  var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML\n  // tags get no namespace.\n\n  var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);\n  var domElement;\n  var namespaceURI = parentNamespace;\n\n  if (namespaceURI === HTML_NAMESPACE$1) {\n    namespaceURI = getIntrinsicNamespace(type);\n  }\n\n  if (namespaceURI === HTML_NAMESPACE$1) {\n    {\n      isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to\n      // allow <SVG> or <mATH>.\n\n      if (!isCustomComponentTag && type !== type.toLowerCase()) {\n        error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);\n      }\n    }\n\n    if (type === 'script') {\n      // Create the script via .innerHTML so its \"parser-inserted\" flag is\n      // set to true and it does not execute\n      var div = ownerDocument.createElement('div');\n\n      div.innerHTML = '<script><' + '/script>'; // eslint-disable-line\n      // This is guaranteed to yield a script element.\n\n      var firstChild = div.firstChild;\n      domElement = div.removeChild(firstChild);\n    } else if (typeof props.is === 'string') {\n      // $FlowIssue `createElement` should be updated for Web Components\n      domElement = ownerDocument.createElement(type, {\n        is: props.is\n      });\n    } else {\n      // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.\n      // See discussion in https://github.com/facebook/react/pull/6896\n      // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240\n      domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size`\n      // attributes on `select`s needs to be added before `option`s are inserted.\n      // This prevents:\n      // - a bug where the `select` does not scroll to the correct option because singular\n      //  `select` elements automatically pick the first item #13222\n      // - a bug where the `select` set the first item as selected despite the `size` attribute #14239\n      // See https://github.com/facebook/react/issues/13222\n      // and https://github.com/facebook/react/issues/14239\n\n      if (type === 'select') {\n        var node = domElement;\n\n        if (props.multiple) {\n          node.multiple = true;\n        } else if (props.size) {\n          // Setting a size greater than 1 causes a select to behave like `multiple=true`, where\n          // it is possible that no option is selected.\n          //\n          // This is only necessary when a select in \"single selection mode\".\n          node.size = props.size;\n        }\n      }\n    }\n  } else {\n    domElement = ownerDocument.createElementNS(namespaceURI, type);\n  }\n\n  {\n    if (namespaceURI === HTML_NAMESPACE$1) {\n      if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {\n        warnedUnknownTags[type] = true;\n\n        error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);\n      }\n    }\n  }\n\n  return domElement;\n}\nfunction createTextNode(text, rootContainerElement) {\n  return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);\n}\nfunction setInitialProperties(domElement, tag, rawProps, rootContainerElement) {\n  var isCustomComponentTag = isCustomComponent(tag, rawProps);\n\n  {\n    validatePropertiesInDevelopment(tag, rawProps);\n  } // TODO: Make sure that we check isMounted before firing any of these events.\n\n\n  var props;\n\n  switch (tag) {\n    case 'iframe':\n    case 'object':\n    case 'embed':\n      trapBubbledEvent(TOP_LOAD, domElement);\n      props = rawProps;\n      break;\n\n    case 'video':\n    case 'audio':\n      // Create listener for each media event\n      for (var i = 0; i < mediaEventTypes.length; i++) {\n        trapBubbledEvent(mediaEventTypes[i], domElement);\n      }\n\n      props = rawProps;\n      break;\n\n    case 'source':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      props = rawProps;\n      break;\n\n    case 'img':\n    case 'image':\n    case 'link':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      trapBubbledEvent(TOP_LOAD, domElement);\n      props = rawProps;\n      break;\n\n    case 'form':\n      trapBubbledEvent(TOP_RESET, domElement);\n      trapBubbledEvent(TOP_SUBMIT, domElement);\n      props = rawProps;\n      break;\n\n    case 'details':\n      trapBubbledEvent(TOP_TOGGLE, domElement);\n      props = rawProps;\n      break;\n\n    case 'input':\n      initWrapperState(domElement, rawProps);\n      props = getHostProps(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'option':\n      validateProps(domElement, rawProps);\n      props = getHostProps$1(domElement, rawProps);\n      break;\n\n    case 'select':\n      initWrapperState$1(domElement, rawProps);\n      props = getHostProps$2(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'textarea':\n      initWrapperState$2(domElement, rawProps);\n      props = getHostProps$3(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    default:\n      props = rawProps;\n  }\n\n  assertValidProps(tag, props);\n  setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);\n\n  switch (tag) {\n    case 'input':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper(domElement, rawProps, false);\n      break;\n\n    case 'textarea':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper$3(domElement);\n      break;\n\n    case 'option':\n      postMountWrapper$1(domElement, rawProps);\n      break;\n\n    case 'select':\n      postMountWrapper$2(domElement, rawProps);\n      break;\n\n    default:\n      if (typeof props.onClick === 'function') {\n        // TODO: This cast may not be sound for SVG, MathML or custom elements.\n        trapClickOnNonInteractiveElement(domElement);\n      }\n\n      break;\n  }\n} // Calculate the diff between the two objects.\n\nfunction diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {\n  {\n    validatePropertiesInDevelopment(tag, nextRawProps);\n  }\n\n  var updatePayload = null;\n  var lastProps;\n  var nextProps;\n\n  switch (tag) {\n    case 'input':\n      lastProps = getHostProps(domElement, lastRawProps);\n      nextProps = getHostProps(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    case 'option':\n      lastProps = getHostProps$1(domElement, lastRawProps);\n      nextProps = getHostProps$1(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    case 'select':\n      lastProps = getHostProps$2(domElement, lastRawProps);\n      nextProps = getHostProps$2(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    case 'textarea':\n      lastProps = getHostProps$3(domElement, lastRawProps);\n      nextProps = getHostProps$3(domElement, nextRawProps);\n      updatePayload = [];\n      break;\n\n    default:\n      lastProps = lastRawProps;\n      nextProps = nextRawProps;\n\n      if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {\n        // TODO: This cast may not be sound for SVG, MathML or custom elements.\n        trapClickOnNonInteractiveElement(domElement);\n      }\n\n      break;\n  }\n\n  assertValidProps(tag, nextProps);\n  var propKey;\n  var styleName;\n  var styleUpdates = null;\n\n  for (propKey in lastProps) {\n    if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {\n      continue;\n    }\n\n    if (propKey === STYLE) {\n      var lastStyle = lastProps[propKey];\n\n      for (styleName in lastStyle) {\n        if (lastStyle.hasOwnProperty(styleName)) {\n          if (!styleUpdates) {\n            styleUpdates = {};\n          }\n\n          styleUpdates[styleName] = '';\n        }\n      }\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n      // This is a special case. If any listener updates we need to ensure\n      // that the \"current\" fiber pointer gets updated so we need a commit\n      // to update this element.\n      if (!updatePayload) {\n        updatePayload = [];\n      }\n    } else {\n      // For all other deleted properties we add it to the queue. We use\n      // the whitelist in the commit phase instead.\n      (updatePayload = updatePayload || []).push(propKey, null);\n    }\n  }\n\n  for (propKey in nextProps) {\n    var nextProp = nextProps[propKey];\n    var lastProp = lastProps != null ? lastProps[propKey] : undefined;\n\n    if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {\n      continue;\n    }\n\n    if (propKey === STYLE) {\n      {\n        if (nextProp) {\n          // Freeze the next style object so that we can assume it won't be\n          // mutated. We have already warned for this in the past.\n          Object.freeze(nextProp);\n        }\n      }\n\n      if (lastProp) {\n        // Unset styles on `lastProp` but not on `nextProp`.\n        for (styleName in lastProp) {\n          if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {\n            if (!styleUpdates) {\n              styleUpdates = {};\n            }\n\n            styleUpdates[styleName] = '';\n          }\n        } // Update styles that changed since `lastProp`.\n\n\n        for (styleName in nextProp) {\n          if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {\n            if (!styleUpdates) {\n              styleUpdates = {};\n            }\n\n            styleUpdates[styleName] = nextProp[styleName];\n          }\n        }\n      } else {\n        // Relies on `updateStylesByID` not mutating `styleUpdates`.\n        if (!styleUpdates) {\n          if (!updatePayload) {\n            updatePayload = [];\n          }\n\n          updatePayload.push(propKey, styleUpdates);\n        }\n\n        styleUpdates = nextProp;\n      }\n    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n      var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n      var lastHtml = lastProp ? lastProp[HTML$1] : undefined;\n\n      if (nextHtml != null) {\n        if (lastHtml !== nextHtml) {\n          (updatePayload = updatePayload || []).push(propKey, nextHtml);\n        }\n      }\n    } else if (propKey === CHILDREN) {\n      if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {\n        (updatePayload = updatePayload || []).push(propKey, '' + nextProp);\n      }\n    } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n      if (nextProp != null) {\n        // We eagerly listen to this even though we haven't committed yet.\n        if ( typeof nextProp !== 'function') {\n          warnForInvalidEventListener(propKey, nextProp);\n        }\n\n        ensureListeningTo(rootContainerElement, propKey);\n      }\n\n      if (!updatePayload && lastProp !== nextProp) {\n        // This is a special case. If any listener updates we need to ensure\n        // that the \"current\" props pointer gets updated so we need a commit\n        // to update this element.\n        updatePayload = [];\n      }\n    } else {\n      // For any other property we always add it to the queue and then we\n      // filter it out using the whitelist during the commit.\n      (updatePayload = updatePayload || []).push(propKey, nextProp);\n    }\n  }\n\n  if (styleUpdates) {\n    {\n      validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]);\n    }\n\n    (updatePayload = updatePayload || []).push(STYLE, styleUpdates);\n  }\n\n  return updatePayload;\n} // Apply the diff.\n\nfunction updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {\n  // Update checked *before* name.\n  // In the middle of an update, it is possible to have multiple checked.\n  // When a checked radio tries to change name, browser makes another radio's checked false.\n  if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {\n    updateChecked(domElement, nextRawProps);\n  }\n\n  var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);\n  var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff.\n\n  updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props\n  // changed.\n\n  switch (tag) {\n    case 'input':\n      // Update the wrapper around inputs *after* updating props. This has to\n      // happen after `updateDOMProperties`. Otherwise HTML5 input validations\n      // raise warnings and prevent the new value from being assigned.\n      updateWrapper(domElement, nextRawProps);\n      break;\n\n    case 'textarea':\n      updateWrapper$1(domElement, nextRawProps);\n      break;\n\n    case 'select':\n      // <select> value update needs to occur after <option> children\n      // reconciliation\n      postUpdateWrapper(domElement, nextRawProps);\n      break;\n  }\n}\n\nfunction getPossibleStandardName(propName) {\n  {\n    var lowerCasedName = propName.toLowerCase();\n\n    if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n      return null;\n    }\n\n    return possibleStandardNames[lowerCasedName] || null;\n  }\n}\n\nfunction diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) {\n  var isCustomComponentTag;\n  var extraAttributeNames;\n\n  {\n    suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING] === true;\n    isCustomComponentTag = isCustomComponent(tag, rawProps);\n    validatePropertiesInDevelopment(tag, rawProps);\n  } // TODO: Make sure that we check isMounted before firing any of these events.\n\n\n  switch (tag) {\n    case 'iframe':\n    case 'object':\n    case 'embed':\n      trapBubbledEvent(TOP_LOAD, domElement);\n      break;\n\n    case 'video':\n    case 'audio':\n      // Create listener for each media event\n      for (var i = 0; i < mediaEventTypes.length; i++) {\n        trapBubbledEvent(mediaEventTypes[i], domElement);\n      }\n\n      break;\n\n    case 'source':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      break;\n\n    case 'img':\n    case 'image':\n    case 'link':\n      trapBubbledEvent(TOP_ERROR, domElement);\n      trapBubbledEvent(TOP_LOAD, domElement);\n      break;\n\n    case 'form':\n      trapBubbledEvent(TOP_RESET, domElement);\n      trapBubbledEvent(TOP_SUBMIT, domElement);\n      break;\n\n    case 'details':\n      trapBubbledEvent(TOP_TOGGLE, domElement);\n      break;\n\n    case 'input':\n      initWrapperState(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'option':\n      validateProps(domElement, rawProps);\n      break;\n\n    case 'select':\n      initWrapperState$1(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n\n    case 'textarea':\n      initWrapperState$2(domElement, rawProps);\n      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n      // to onChange. Even if there is no listener.\n\n      ensureListeningTo(rootContainerElement, 'onChange');\n      break;\n  }\n\n  assertValidProps(tag, rawProps);\n\n  {\n    extraAttributeNames = new Set();\n    var attributes = domElement.attributes;\n\n    for (var _i = 0; _i < attributes.length; _i++) {\n      var name = attributes[_i].name.toLowerCase();\n\n      switch (name) {\n        // Built-in SSR attribute is whitelisted\n        case 'data-reactroot':\n          break;\n        // Controlled attributes are not validated\n        // TODO: Only ignore them on controlled tags.\n\n        case 'value':\n          break;\n\n        case 'checked':\n          break;\n\n        case 'selected':\n          break;\n\n        default:\n          // Intentionally use the original name.\n          // See discussion in https://github.com/facebook/react/pull/10676.\n          extraAttributeNames.add(attributes[_i].name);\n      }\n    }\n  }\n\n  var updatePayload = null;\n\n  for (var propKey in rawProps) {\n    if (!rawProps.hasOwnProperty(propKey)) {\n      continue;\n    }\n\n    var nextProp = rawProps[propKey];\n\n    if (propKey === CHILDREN) {\n      // For text content children we compare against textContent. This\n      // might match additional HTML that is hidden when we read it using\n      // textContent. E.g. \"foo\" will match \"f<span>oo</span>\" but that still\n      // satisfies our requirement. Our requirement is not to produce perfect\n      // HTML and attributes. Ideally we should preserve structure but it's\n      // ok not to if the visible content is still enough to indicate what\n      // even listeners these nodes might be wired up to.\n      // TODO: Warn if there is more than a single textNode as a child.\n      // TODO: Should we use domElement.firstChild.nodeValue to compare?\n      if (typeof nextProp === 'string') {\n        if (domElement.textContent !== nextProp) {\n          if ( !suppressHydrationWarning) {\n            warnForTextDifference(domElement.textContent, nextProp);\n          }\n\n          updatePayload = [CHILDREN, nextProp];\n        }\n      } else if (typeof nextProp === 'number') {\n        if (domElement.textContent !== '' + nextProp) {\n          if ( !suppressHydrationWarning) {\n            warnForTextDifference(domElement.textContent, nextProp);\n          }\n\n          updatePayload = [CHILDREN, '' + nextProp];\n        }\n      }\n    } else if (registrationNameModules.hasOwnProperty(propKey)) {\n      if (nextProp != null) {\n        if ( typeof nextProp !== 'function') {\n          warnForInvalidEventListener(propKey, nextProp);\n        }\n\n        ensureListeningTo(rootContainerElement, propKey);\n      }\n    } else if ( // Convince Flow we've calculated it (it's DEV-only in this method.)\n    typeof isCustomComponentTag === 'boolean') {\n      // Validate that the properties correspond to their expected values.\n      var serverValue = void 0;\n      var propertyInfo = getPropertyInfo(propKey);\n\n      if (suppressHydrationWarning) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated\n      // TODO: Only ignore them on controlled tags.\n      propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n        var serverHTML = domElement.innerHTML;\n        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n        var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : '');\n\n        if (expectedHTML !== serverHTML) {\n          warnForPropDifference(propKey, serverHTML, expectedHTML);\n        }\n      } else if (propKey === STYLE) {\n        // $FlowFixMe - Should be inferred as not undefined.\n        extraAttributeNames.delete(propKey);\n\n        if (canDiffStyleForHydrationWarning) {\n          var expectedStyle = createDangerousStringForStyles(nextProp);\n          serverValue = domElement.getAttribute('style');\n\n          if (expectedStyle !== serverValue) {\n            warnForPropDifference(propKey, serverValue, expectedStyle);\n          }\n        }\n      } else if (isCustomComponentTag) {\n        // $FlowFixMe - Should be inferred as not undefined.\n        extraAttributeNames.delete(propKey.toLowerCase());\n        serverValue = getValueForAttribute(domElement, propKey, nextProp);\n\n        if (nextProp !== serverValue) {\n          warnForPropDifference(propKey, serverValue, nextProp);\n        }\n      } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {\n        var isMismatchDueToBadCasing = false;\n\n        if (propertyInfo !== null) {\n          // $FlowFixMe - Should be inferred as not undefined.\n          extraAttributeNames.delete(propertyInfo.attributeName);\n          serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);\n        } else {\n          var ownNamespace = parentNamespace;\n\n          if (ownNamespace === HTML_NAMESPACE$1) {\n            ownNamespace = getIntrinsicNamespace(tag);\n          }\n\n          if (ownNamespace === HTML_NAMESPACE$1) {\n            // $FlowFixMe - Should be inferred as not undefined.\n            extraAttributeNames.delete(propKey.toLowerCase());\n          } else {\n            var standardName = getPossibleStandardName(propKey);\n\n            if (standardName !== null && standardName !== propKey) {\n              // If an SVG prop is supplied with bad casing, it will\n              // be successfully parsed from HTML, but will produce a mismatch\n              // (and would be incorrectly rendered on the client).\n              // However, we already warn about bad casing elsewhere.\n              // So we'll skip the misleading extra mismatch warning in this case.\n              isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined.\n\n              extraAttributeNames.delete(standardName);\n            } // $FlowFixMe - Should be inferred as not undefined.\n\n\n            extraAttributeNames.delete(propKey);\n          }\n\n          serverValue = getValueForAttribute(domElement, propKey, nextProp);\n        }\n\n        if (nextProp !== serverValue && !isMismatchDueToBadCasing) {\n          warnForPropDifference(propKey, serverValue, nextProp);\n        }\n      }\n    }\n  }\n\n  {\n    // $FlowFixMe - Should be inferred as not undefined.\n    if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {\n      // $FlowFixMe - Should be inferred as not undefined.\n      warnForExtraAttributes(extraAttributeNames);\n    }\n  }\n\n  switch (tag) {\n    case 'input':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper(domElement, rawProps, true);\n      break;\n\n    case 'textarea':\n      // TODO: Make sure we check if this is still unmounted or do any clean\n      // up necessary since we never stop tracking anymore.\n      track(domElement);\n      postMountWrapper$3(domElement);\n      break;\n\n    case 'select':\n    case 'option':\n      // For input and textarea we current always set the value property at\n      // post mount to force it to diverge from attributes. However, for\n      // option and select we don't quite do the same thing and select\n      // is not resilient to the DOM state changing so we don't do that here.\n      // TODO: Consider not doing this for input and textarea.\n      break;\n\n    default:\n      if (typeof rawProps.onClick === 'function') {\n        // TODO: This cast may not be sound for SVG, MathML or custom elements.\n        trapClickOnNonInteractiveElement(domElement);\n      }\n\n      break;\n  }\n\n  return updatePayload;\n}\nfunction diffHydratedText(textNode, text) {\n  var isDifferent = textNode.nodeValue !== text;\n  return isDifferent;\n}\nfunction warnForUnmatchedText(textNode, text) {\n  {\n    warnForTextDifference(textNode.nodeValue, text);\n  }\n}\nfunction warnForDeletedHydratableElement(parentNode, child) {\n  {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());\n  }\n}\nfunction warnForDeletedHydratableText(parentNode, child) {\n  {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Did not expect server HTML to contain the text node \"%s\" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());\n  }\n}\nfunction warnForInsertedHydratedElement(parentNode, tag, props) {\n  {\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());\n  }\n}\nfunction warnForInsertedHydratedText(parentNode, text) {\n  {\n    if (text === '') {\n      // We expect to insert empty text nodes since they're not represented in\n      // the HTML.\n      // TODO: Remove this special case if we can just avoid inserting empty\n      // text nodes.\n      return;\n    }\n\n    if (didWarnInvalidHydration) {\n      return;\n    }\n\n    didWarnInvalidHydration = true;\n\n    error('Expected server HTML to contain a matching text node for \"%s\" in <%s>.', text, parentNode.nodeName.toLowerCase());\n  }\n}\nfunction restoreControlledState$3(domElement, tag, props) {\n  switch (tag) {\n    case 'input':\n      restoreControlledState(domElement, props);\n      return;\n\n    case 'textarea':\n      restoreControlledState$2(domElement, props);\n      return;\n\n    case 'select':\n      restoreControlledState$1(domElement, props);\n      return;\n  }\n}\n\nfunction getActiveElement(doc) {\n  doc = doc || (typeof document !== 'undefined' ? document : undefined);\n\n  if (typeof doc === 'undefined') {\n    return null;\n  }\n\n  try {\n    return doc.activeElement || doc.body;\n  } catch (e) {\n    return doc.body;\n  }\n}\n\n/**\n * Given any node return the first leaf node without children.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {DOMElement|DOMTextNode}\n */\n\nfunction getLeafNode(node) {\n  while (node && node.firstChild) {\n    node = node.firstChild;\n  }\n\n  return node;\n}\n/**\n * Get the next sibling within a container. This will walk up the\n * DOM if a node's siblings have been exhausted.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {?DOMElement|DOMTextNode}\n */\n\n\nfunction getSiblingNode(node) {\n  while (node) {\n    if (node.nextSibling) {\n      return node.nextSibling;\n    }\n\n    node = node.parentNode;\n  }\n}\n/**\n * Get object describing the nodes which contain characters at offset.\n *\n * @param {DOMElement|DOMTextNode} root\n * @param {number} offset\n * @return {?object}\n */\n\n\nfunction getNodeForCharacterOffset(root, offset) {\n  var node = getLeafNode(root);\n  var nodeStart = 0;\n  var nodeEnd = 0;\n\n  while (node) {\n    if (node.nodeType === TEXT_NODE) {\n      nodeEnd = nodeStart + node.textContent.length;\n\n      if (nodeStart <= offset && nodeEnd >= offset) {\n        return {\n          node: node,\n          offset: offset - nodeStart\n        };\n      }\n\n      nodeStart = nodeEnd;\n    }\n\n    node = getLeafNode(getSiblingNode(node));\n  }\n}\n\n/**\n * @param {DOMElement} outerNode\n * @return {?object}\n */\n\nfunction getOffsets(outerNode) {\n  var ownerDocument = outerNode.ownerDocument;\n  var win = ownerDocument && ownerDocument.defaultView || window;\n  var selection = win.getSelection && win.getSelection();\n\n  if (!selection || selection.rangeCount === 0) {\n    return null;\n  }\n\n  var anchorNode = selection.anchorNode,\n      anchorOffset = selection.anchorOffset,\n      focusNode = selection.focusNode,\n      focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be \"anonymous divs\", e.g. the\n  // up/down buttons on an <input type=\"number\">. Anonymous divs do not seem to\n  // expose properties, triggering a \"Permission denied error\" if any of its\n  // properties are accessed. The only seemingly possible way to avoid erroring\n  // is to access a property that typically works for non-anonymous divs and\n  // catch any error that may otherwise arise. See\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n\n  try {\n    /* eslint-disable no-unused-expressions */\n    anchorNode.nodeType;\n    focusNode.nodeType;\n    /* eslint-enable no-unused-expressions */\n  } catch (e) {\n    return null;\n  }\n\n  return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);\n}\n/**\n * Returns {start, end} where `start` is the character/codepoint index of\n * (anchorNode, anchorOffset) within the textContent of `outerNode`, and\n * `end` is the index of (focusNode, focusOffset).\n *\n * Returns null if you pass in garbage input but we should probably just crash.\n *\n * Exported only for testing.\n */\n\nfunction getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {\n  var length = 0;\n  var start = -1;\n  var end = -1;\n  var indexWithinAnchor = 0;\n  var indexWithinFocus = 0;\n  var node = outerNode;\n  var parentNode = null;\n\n  outer: while (true) {\n    var next = null;\n\n    while (true) {\n      if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {\n        start = length + anchorOffset;\n      }\n\n      if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {\n        end = length + focusOffset;\n      }\n\n      if (node.nodeType === TEXT_NODE) {\n        length += node.nodeValue.length;\n      }\n\n      if ((next = node.firstChild) === null) {\n        break;\n      } // Moving from `node` to its first child `next`.\n\n\n      parentNode = node;\n      node = next;\n    }\n\n    while (true) {\n      if (node === outerNode) {\n        // If `outerNode` has children, this is always the second time visiting\n        // it. If it has no children, this is still the first loop, and the only\n        // valid selection is anchorNode and focusNode both equal to this node\n        // and both offsets 0, in which case we will have handled above.\n        break outer;\n      }\n\n      if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {\n        start = length;\n      }\n\n      if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {\n        end = length;\n      }\n\n      if ((next = node.nextSibling) !== null) {\n        break;\n      }\n\n      node = parentNode;\n      parentNode = node.parentNode;\n    } // Moving from `node` to its next sibling `next`.\n\n\n    node = next;\n  }\n\n  if (start === -1 || end === -1) {\n    // This should never happen. (Would happen if the anchor/focus nodes aren't\n    // actually inside the passed-in node.)\n    return null;\n  }\n\n  return {\n    start: start,\n    end: end\n  };\n}\n/**\n * In modern non-IE browsers, we can support both forward and backward\n * selections.\n *\n * Note: IE10+ supports the Selection object, but it does not support\n * the `extend` method, which means that even in modern IE, it's not possible\n * to programmatically create a backward selection. Thus, for all IE\n * versions, we use the old IE API to create our selections.\n *\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\n\nfunction setOffsets(node, offsets) {\n  var doc = node.ownerDocument || document;\n  var win = doc && doc.defaultView || window; // Edge fails with \"Object expected\" in some scenarios.\n  // (For instance: TinyMCE editor used in a list component that supports pasting to add more,\n  // fails when pasting 100+ items)\n\n  if (!win.getSelection) {\n    return;\n  }\n\n  var selection = win.getSelection();\n  var length = node.textContent.length;\n  var start = Math.min(offsets.start, length);\n  var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method.\n  // Flip backward selections, so we can set with a single range.\n\n  if (!selection.extend && start > end) {\n    var temp = end;\n    end = start;\n    start = temp;\n  }\n\n  var startMarker = getNodeForCharacterOffset(node, start);\n  var endMarker = getNodeForCharacterOffset(node, end);\n\n  if (startMarker && endMarker) {\n    if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {\n      return;\n    }\n\n    var range = doc.createRange();\n    range.setStart(startMarker.node, startMarker.offset);\n    selection.removeAllRanges();\n\n    if (start > end) {\n      selection.addRange(range);\n      selection.extend(endMarker.node, endMarker.offset);\n    } else {\n      range.setEnd(endMarker.node, endMarker.offset);\n      selection.addRange(range);\n    }\n  }\n}\n\nfunction isTextNode(node) {\n  return node && node.nodeType === TEXT_NODE;\n}\n\nfunction containsNode(outerNode, innerNode) {\n  if (!outerNode || !innerNode) {\n    return false;\n  } else if (outerNode === innerNode) {\n    return true;\n  } else if (isTextNode(outerNode)) {\n    return false;\n  } else if (isTextNode(innerNode)) {\n    return containsNode(outerNode, innerNode.parentNode);\n  } else if ('contains' in outerNode) {\n    return outerNode.contains(innerNode);\n  } else if (outerNode.compareDocumentPosition) {\n    return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n  } else {\n    return false;\n  }\n}\n\nfunction isInDocument(node) {\n  return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);\n}\n\nfunction isSameOriginFrame(iframe) {\n  try {\n    // Accessing the contentDocument of a HTMLIframeElement can cause the browser\n    // to throw, e.g. if it has a cross-origin src attribute.\n    // Safari will show an error in the console when the access results in \"Blocked a frame with origin\". e.g:\n    // iframe.contentDocument.defaultView;\n    // A safety way is to access one of the cross origin properties: Window or Location\n    // Which might result in \"SecurityError\" DOM Exception and it is compatible to Safari.\n    // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl\n    return typeof iframe.contentWindow.location.href === 'string';\n  } catch (err) {\n    return false;\n  }\n}\n\nfunction getActiveElementDeep() {\n  var win = window;\n  var element = getActiveElement();\n\n  while (element instanceof win.HTMLIFrameElement) {\n    if (isSameOriginFrame(element)) {\n      win = element.contentWindow;\n    } else {\n      return element;\n    }\n\n    element = getActiveElement(win.document);\n  }\n\n  return element;\n}\n/**\n * @ReactInputSelection: React input selection module. Based on Selection.js,\n * but modified to be suitable for react and has a couple of bug fixes (doesn't\n * assume buttons have range selections allowed).\n * Input selection module for React.\n */\n\n/**\n * @hasSelectionCapabilities: we get the element types that support selection\n * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`\n * and `selectionEnd` rows.\n */\n\n\nfunction hasSelectionCapabilities(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n  return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');\n}\nfunction getSelectionInformation() {\n  var focusedElem = getActiveElementDeep();\n  return {\n    // Used by Flare\n    activeElementDetached: null,\n    focusedElem: focusedElem,\n    selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null\n  };\n}\n/**\n * @restoreSelection: If any selection information was potentially lost,\n * restore it. This is useful when performing operations that could remove dom\n * nodes and place them back in, resulting in focus being lost.\n */\n\nfunction restoreSelection(priorSelectionInformation) {\n  var curFocusedElem = getActiveElementDeep();\n  var priorFocusedElem = priorSelectionInformation.focusedElem;\n  var priorSelectionRange = priorSelectionInformation.selectionRange;\n\n  if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {\n    if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {\n      setSelection(priorFocusedElem, priorSelectionRange);\n    } // Focusing a node can change the scroll position, which is undesirable\n\n\n    var ancestors = [];\n    var ancestor = priorFocusedElem;\n\n    while (ancestor = ancestor.parentNode) {\n      if (ancestor.nodeType === ELEMENT_NODE) {\n        ancestors.push({\n          element: ancestor,\n          left: ancestor.scrollLeft,\n          top: ancestor.scrollTop\n        });\n      }\n    }\n\n    if (typeof priorFocusedElem.focus === 'function') {\n      priorFocusedElem.focus();\n    }\n\n    for (var i = 0; i < ancestors.length; i++) {\n      var info = ancestors[i];\n      info.element.scrollLeft = info.left;\n      info.element.scrollTop = info.top;\n    }\n  }\n}\n/**\n * @getSelection: Gets the selection bounds of a focused textarea, input or\n * contentEditable node.\n * -@input: Look up selection bounds of this input\n * -@return {start: selectionStart, end: selectionEnd}\n */\n\nfunction getSelection(input) {\n  var selection;\n\n  if ('selectionStart' in input) {\n    // Modern browser with input or textarea.\n    selection = {\n      start: input.selectionStart,\n      end: input.selectionEnd\n    };\n  } else {\n    // Content editable or old IE textarea.\n    selection = getOffsets(input);\n  }\n\n  return selection || {\n    start: 0,\n    end: 0\n  };\n}\n/**\n * @setSelection: Sets the selection bounds of a textarea or input and focuses\n * the input.\n * -@input     Set selection bounds of this input or textarea\n * -@offsets   Object of same form that is returned from get*\n */\n\nfunction setSelection(input, offsets) {\n  var start = offsets.start,\n      end = offsets.end;\n\n  if (end === undefined) {\n    end = start;\n  }\n\n  if ('selectionStart' in input) {\n    input.selectionStart = start;\n    input.selectionEnd = Math.min(end, input.value.length);\n  } else {\n    setOffsets(input, offsets);\n  }\n}\n\nvar validateDOMNesting = function () {};\n\nvar updatedAncestorInfo = function () {};\n\n{\n  // This validation code was written based on the HTML5 parsing spec:\n  // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n  //\n  // Note: this does not catch all invalid nesting, nor does it try to (as it's\n  // not clear what practical benefit doing so provides); instead, we warn only\n  // for cases where the parser will give a parse tree differing from what React\n  // intended. For example, <b><div></div></b> is invalid but we don't warn\n  // because it still parses correctly; we do warn for other cases like nested\n  // <p> tags where the beginning of the second element implicitly closes the\n  // first, causing a confusing mess.\n  // https://html.spec.whatwg.org/multipage/syntax.html#special\n  var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n\n  var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point\n  // TODO: Distinguish by namespace here -- for <title>, including it here\n  // errs on the side of fewer warnings\n  'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope\n\n  var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags\n\n  var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];\n  var emptyAncestorInfo = {\n    current: null,\n    formTag: null,\n    aTagInScope: null,\n    buttonTagInScope: null,\n    nobrTagInScope: null,\n    pTagInButtonScope: null,\n    listItemTagAutoclosing: null,\n    dlItemTagAutoclosing: null\n  };\n\n  updatedAncestorInfo = function (oldInfo, tag) {\n    var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);\n\n    var info = {\n      tag: tag\n    };\n\n    if (inScopeTags.indexOf(tag) !== -1) {\n      ancestorInfo.aTagInScope = null;\n      ancestorInfo.buttonTagInScope = null;\n      ancestorInfo.nobrTagInScope = null;\n    }\n\n    if (buttonScopeTags.indexOf(tag) !== -1) {\n      ancestorInfo.pTagInButtonScope = null;\n    } // See rules for 'li', 'dd', 'dt' start tags in\n    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n\n\n    if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {\n      ancestorInfo.listItemTagAutoclosing = null;\n      ancestorInfo.dlItemTagAutoclosing = null;\n    }\n\n    ancestorInfo.current = info;\n\n    if (tag === 'form') {\n      ancestorInfo.formTag = info;\n    }\n\n    if (tag === 'a') {\n      ancestorInfo.aTagInScope = info;\n    }\n\n    if (tag === 'button') {\n      ancestorInfo.buttonTagInScope = info;\n    }\n\n    if (tag === 'nobr') {\n      ancestorInfo.nobrTagInScope = info;\n    }\n\n    if (tag === 'p') {\n      ancestorInfo.pTagInButtonScope = info;\n    }\n\n    if (tag === 'li') {\n      ancestorInfo.listItemTagAutoclosing = info;\n    }\n\n    if (tag === 'dd' || tag === 'dt') {\n      ancestorInfo.dlItemTagAutoclosing = info;\n    }\n\n    return ancestorInfo;\n  };\n  /**\n   * Returns whether\n   */\n\n\n  var isTagValidWithParent = function (tag, parentTag) {\n    // First, let's check if we're in an unusual parsing mode...\n    switch (parentTag) {\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect\n      case 'select':\n        return tag === 'option' || tag === 'optgroup' || tag === '#text';\n\n      case 'optgroup':\n        return tag === 'option' || tag === '#text';\n      // Strictly speaking, seeing an <option> doesn't mean we're in a <select>\n      // but\n\n      case 'option':\n        return tag === '#text';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption\n      // No special behavior since these rules fall back to \"in body\" mode for\n      // all except special table nodes which cause bad parsing behavior anyway.\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr\n\n      case 'tr':\n        return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody\n\n      case 'tbody':\n      case 'thead':\n      case 'tfoot':\n        return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup\n\n      case 'colgroup':\n        return tag === 'col' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable\n\n      case 'table':\n        return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead\n\n      case 'head':\n        return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';\n      // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element\n\n      case 'html':\n        return tag === 'head' || tag === 'body' || tag === 'frameset';\n\n      case 'frameset':\n        return tag === 'frame';\n\n      case '#document':\n        return tag === 'html';\n    } // Probably in the \"in body\" parsing mode, so we outlaw only tag combos\n    // where the parsing rules cause implicit opens or closes to be added.\n    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n\n\n    switch (tag) {\n      case 'h1':\n      case 'h2':\n      case 'h3':\n      case 'h4':\n      case 'h5':\n      case 'h6':\n        return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';\n\n      case 'rp':\n      case 'rt':\n        return impliedEndTags.indexOf(parentTag) === -1;\n\n      case 'body':\n      case 'caption':\n      case 'col':\n      case 'colgroup':\n      case 'frameset':\n      case 'frame':\n      case 'head':\n      case 'html':\n      case 'tbody':\n      case 'td':\n      case 'tfoot':\n      case 'th':\n      case 'thead':\n      case 'tr':\n        // These tags are only valid with a few parents that have special child\n        // parsing rules -- if we're down here, then none of those matched and\n        // so we allow it only if we don't know what the parent is, as all other\n        // cases are invalid.\n        return parentTag == null;\n    }\n\n    return true;\n  };\n  /**\n   * Returns whether\n   */\n\n\n  var findInvalidAncestorForTag = function (tag, ancestorInfo) {\n    switch (tag) {\n      case 'address':\n      case 'article':\n      case 'aside':\n      case 'blockquote':\n      case 'center':\n      case 'details':\n      case 'dialog':\n      case 'dir':\n      case 'div':\n      case 'dl':\n      case 'fieldset':\n      case 'figcaption':\n      case 'figure':\n      case 'footer':\n      case 'header':\n      case 'hgroup':\n      case 'main':\n      case 'menu':\n      case 'nav':\n      case 'ol':\n      case 'p':\n      case 'section':\n      case 'summary':\n      case 'ul':\n      case 'pre':\n      case 'listing':\n      case 'table':\n      case 'hr':\n      case 'xmp':\n      case 'h1':\n      case 'h2':\n      case 'h3':\n      case 'h4':\n      case 'h5':\n      case 'h6':\n        return ancestorInfo.pTagInButtonScope;\n\n      case 'form':\n        return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;\n\n      case 'li':\n        return ancestorInfo.listItemTagAutoclosing;\n\n      case 'dd':\n      case 'dt':\n        return ancestorInfo.dlItemTagAutoclosing;\n\n      case 'button':\n        return ancestorInfo.buttonTagInScope;\n\n      case 'a':\n        // Spec says something about storing a list of markers, but it sounds\n        // equivalent to this check.\n        return ancestorInfo.aTagInScope;\n\n      case 'nobr':\n        return ancestorInfo.nobrTagInScope;\n    }\n\n    return null;\n  };\n\n  var didWarn$1 = {};\n\n  validateDOMNesting = function (childTag, childText, ancestorInfo) {\n    ancestorInfo = ancestorInfo || emptyAncestorInfo;\n    var parentInfo = ancestorInfo.current;\n    var parentTag = parentInfo && parentInfo.tag;\n\n    if (childText != null) {\n      if (childTag != null) {\n        error('validateDOMNesting: when childText is passed, childTag should be null');\n      }\n\n      childTag = '#text';\n    }\n\n    var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;\n    var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);\n    var invalidParentOrAncestor = invalidParent || invalidAncestor;\n\n    if (!invalidParentOrAncestor) {\n      return;\n    }\n\n    var ancestorTag = invalidParentOrAncestor.tag;\n    var addendum = getCurrentFiberStackInDev();\n    var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;\n\n    if (didWarn$1[warnKey]) {\n      return;\n    }\n\n    didWarn$1[warnKey] = true;\n    var tagDisplayName = childTag;\n    var whitespaceInfo = '';\n\n    if (childTag === '#text') {\n      if (/\\S/.test(childText)) {\n        tagDisplayName = 'Text nodes';\n      } else {\n        tagDisplayName = 'Whitespace text nodes';\n        whitespaceInfo = \" Make sure you don't have any extra whitespace between tags on \" + 'each line of your source code.';\n      }\n    } else {\n      tagDisplayName = '<' + childTag + '>';\n    }\n\n    if (invalidParent) {\n      var info = '';\n\n      if (ancestorTag === 'table' && childTag === 'tr') {\n        info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.';\n      }\n\n      error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info);\n    } else {\n      error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag);\n    }\n  };\n}\n\nvar SUPPRESS_HYDRATION_WARNING$1;\n\n{\n  SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';\n}\n\nvar SUSPENSE_START_DATA = '$';\nvar SUSPENSE_END_DATA = '/$';\nvar SUSPENSE_PENDING_START_DATA = '$?';\nvar SUSPENSE_FALLBACK_START_DATA = '$!';\nvar STYLE$1 = 'style';\nvar eventsEnabled = null;\nvar selectionInformation = null;\n\nfunction shouldAutoFocusHostComponent(type, props) {\n  switch (type) {\n    case 'button':\n    case 'input':\n    case 'select':\n    case 'textarea':\n      return !!props.autoFocus;\n  }\n\n  return false;\n}\nfunction getRootHostContext(rootContainerInstance) {\n  var type;\n  var namespace;\n  var nodeType = rootContainerInstance.nodeType;\n\n  switch (nodeType) {\n    case DOCUMENT_NODE:\n    case DOCUMENT_FRAGMENT_NODE:\n      {\n        type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';\n        var root = rootContainerInstance.documentElement;\n        namespace = root ? root.namespaceURI : getChildNamespace(null, '');\n        break;\n      }\n\n    default:\n      {\n        var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;\n        var ownNamespace = container.namespaceURI || null;\n        type = container.tagName;\n        namespace = getChildNamespace(ownNamespace, type);\n        break;\n      }\n  }\n\n  {\n    var validatedTag = type.toLowerCase();\n    var ancestorInfo = updatedAncestorInfo(null, validatedTag);\n    return {\n      namespace: namespace,\n      ancestorInfo: ancestorInfo\n    };\n  }\n}\nfunction getChildHostContext(parentHostContext, type, rootContainerInstance) {\n  {\n    var parentHostContextDev = parentHostContext;\n    var namespace = getChildNamespace(parentHostContextDev.namespace, type);\n    var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);\n    return {\n      namespace: namespace,\n      ancestorInfo: ancestorInfo\n    };\n  }\n}\nfunction getPublicInstance(instance) {\n  return instance;\n}\nfunction prepareForCommit(containerInfo) {\n  eventsEnabled = isEnabled();\n  selectionInformation = getSelectionInformation();\n  setEnabled(false);\n}\nfunction resetAfterCommit(containerInfo) {\n  restoreSelection(selectionInformation);\n  setEnabled(eventsEnabled);\n  eventsEnabled = null;\n\n  selectionInformation = null;\n}\nfunction createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n  var parentNamespace;\n\n  {\n    // TODO: take namespace into account when validating.\n    var hostContextDev = hostContext;\n    validateDOMNesting(type, null, hostContextDev.ancestorInfo);\n\n    if (typeof props.children === 'string' || typeof props.children === 'number') {\n      var string = '' + props.children;\n      var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);\n      validateDOMNesting(null, string, ownAncestorInfo);\n    }\n\n    parentNamespace = hostContextDev.namespace;\n  }\n\n  var domElement = createElement(type, props, rootContainerInstance, parentNamespace);\n  precacheFiberNode(internalInstanceHandle, domElement);\n  updateFiberProps(domElement, props);\n  return domElement;\n}\nfunction appendInitialChild(parentInstance, child) {\n  parentInstance.appendChild(child);\n}\nfunction finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {\n  setInitialProperties(domElement, type, props, rootContainerInstance);\n  return shouldAutoFocusHostComponent(type, props);\n}\nfunction prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {\n  {\n    var hostContextDev = hostContext;\n\n    if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {\n      var string = '' + newProps.children;\n      var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);\n      validateDOMNesting(null, string, ownAncestorInfo);\n    }\n  }\n\n  return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);\n}\nfunction shouldSetTextContent(type, props) {\n  return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;\n}\nfunction shouldDeprioritizeSubtree(type, props) {\n  return !!props.hidden;\n}\nfunction createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {\n  {\n    var hostContextDev = hostContext;\n    validateDOMNesting(null, text, hostContextDev.ancestorInfo);\n  }\n\n  var textNode = createTextNode(text, rootContainerInstance);\n  precacheFiberNode(internalInstanceHandle, textNode);\n  return textNode;\n}\n// if a component just imports ReactDOM (e.g. for findDOMNode).\n// Some environments might not have setTimeout or clearTimeout.\n\nvar scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;\nvar cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;\nvar noTimeout = -1; // -------------------\nfunction commitMount(domElement, type, newProps, internalInstanceHandle) {\n  // Despite the naming that might imply otherwise, this method only\n  // fires if there is an `Update` effect scheduled during mounting.\n  // This happens if `finalizeInitialChildren` returns `true` (which it\n  // does to implement the `autoFocus` attribute on the client). But\n  // there are also other cases when this might happen (such as patching\n  // up text content during hydration mismatch). So we'll check this again.\n  if (shouldAutoFocusHostComponent(type, newProps)) {\n    domElement.focus();\n  }\n}\nfunction commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {\n  // Update the props handle so that we know which props are the ones with\n  // with current event handlers.\n  updateFiberProps(domElement, newProps); // Apply the diff to the DOM node.\n\n  updateProperties(domElement, updatePayload, type, oldProps, newProps);\n}\nfunction resetTextContent(domElement) {\n  setTextContent(domElement, '');\n}\nfunction commitTextUpdate(textInstance, oldText, newText) {\n  textInstance.nodeValue = newText;\n}\nfunction appendChild(parentInstance, child) {\n  parentInstance.appendChild(child);\n}\nfunction appendChildToContainer(container, child) {\n  var parentNode;\n\n  if (container.nodeType === COMMENT_NODE) {\n    parentNode = container.parentNode;\n    parentNode.insertBefore(child, container);\n  } else {\n    parentNode = container;\n    parentNode.appendChild(child);\n  } // This container might be used for a portal.\n  // If something inside a portal is clicked, that click should bubble\n  // through the React tree. However, on Mobile Safari the click would\n  // never bubble through the *DOM* tree unless an ancestor with onclick\n  // event exists. So we wouldn't see it and dispatch it.\n  // This is why we ensure that non React root containers have inline onclick\n  // defined.\n  // https://github.com/facebook/react/issues/11918\n\n\n  var reactRootContainer = container._reactRootContainer;\n\n  if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {\n    // TODO: This cast may not be sound for SVG, MathML or custom elements.\n    trapClickOnNonInteractiveElement(parentNode);\n  }\n}\nfunction insertBefore(parentInstance, child, beforeChild) {\n  parentInstance.insertBefore(child, beforeChild);\n}\nfunction insertInContainerBefore(container, child, beforeChild) {\n  if (container.nodeType === COMMENT_NODE) {\n    container.parentNode.insertBefore(child, beforeChild);\n  } else {\n    container.insertBefore(child, beforeChild);\n  }\n}\nfunction removeChild(parentInstance, child) {\n  parentInstance.removeChild(child);\n}\nfunction removeChildFromContainer(container, child) {\n  if (container.nodeType === COMMENT_NODE) {\n    container.parentNode.removeChild(child);\n  } else {\n    container.removeChild(child);\n  }\n}\n\nfunction hideInstance(instance) {\n  // pass host context to this method?\n\n\n  instance = instance;\n  var style = instance.style;\n\n  if (typeof style.setProperty === 'function') {\n    style.setProperty('display', 'none', 'important');\n  } else {\n    style.display = 'none';\n  }\n}\nfunction hideTextInstance(textInstance) {\n  textInstance.nodeValue = '';\n}\nfunction unhideInstance(instance, props) {\n  instance = instance;\n  var styleProp = props[STYLE$1];\n  var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;\n  instance.style.display = dangerousStyleValue('display', display);\n}\nfunction unhideTextInstance(textInstance, text) {\n  textInstance.nodeValue = text;\n} // -------------------\nfunction canHydrateInstance(instance, type, props) {\n  if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {\n    return null;\n  } // This has now been refined to an element node.\n\n\n  return instance;\n}\nfunction canHydrateTextInstance(instance, text) {\n  if (text === '' || instance.nodeType !== TEXT_NODE) {\n    // Empty strings are not parsed by HTML so there won't be a correct match here.\n    return null;\n  } // This has now been refined to a text node.\n\n\n  return instance;\n}\nfunction isSuspenseInstancePending(instance) {\n  return instance.data === SUSPENSE_PENDING_START_DATA;\n}\nfunction isSuspenseInstanceFallback(instance) {\n  return instance.data === SUSPENSE_FALLBACK_START_DATA;\n}\n\nfunction getNextHydratable(node) {\n  // Skip non-hydratable nodes.\n  for (; node != null; node = node.nextSibling) {\n    var nodeType = node.nodeType;\n\n    if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {\n      break;\n    }\n  }\n\n  return node;\n}\n\nfunction getNextHydratableSibling(instance) {\n  return getNextHydratable(instance.nextSibling);\n}\nfunction getFirstHydratableChild(parentInstance) {\n  return getNextHydratable(parentInstance.firstChild);\n}\nfunction hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n  precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events\n  // get attached.\n\n  updateFiberProps(instance, props);\n  var parentNamespace;\n\n  {\n    var hostContextDev = hostContext;\n    parentNamespace = hostContextDev.namespace;\n  }\n\n  return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);\n}\nfunction hydrateTextInstance(textInstance, text, internalInstanceHandle) {\n  precacheFiberNode(internalInstanceHandle, textInstance);\n  return diffHydratedText(textInstance, text);\n}\nfunction getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {\n  var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary.\n  // There might be nested nodes so we need to keep track of how\n  // deep we are and only break out when we're back on top.\n\n  var depth = 0;\n\n  while (node) {\n    if (node.nodeType === COMMENT_NODE) {\n      var data = node.data;\n\n      if (data === SUSPENSE_END_DATA) {\n        if (depth === 0) {\n          return getNextHydratableSibling(node);\n        } else {\n          depth--;\n        }\n      } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {\n        depth++;\n      }\n    }\n\n    node = node.nextSibling;\n  } // TODO: Warn, we didn't find the end comment boundary.\n\n\n  return null;\n} // Returns the SuspenseInstance if this node is a direct child of a\n// SuspenseInstance. I.e. if its previous sibling is a Comment with\n// SUSPENSE_x_START_DATA. Otherwise, null.\n\nfunction getParentSuspenseInstance(targetInstance) {\n  var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary.\n  // There might be nested nodes so we need to keep track of how\n  // deep we are and only break out when we're back on top.\n\n  var depth = 0;\n\n  while (node) {\n    if (node.nodeType === COMMENT_NODE) {\n      var data = node.data;\n\n      if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {\n        if (depth === 0) {\n          return node;\n        } else {\n          depth--;\n        }\n      } else if (data === SUSPENSE_END_DATA) {\n        depth++;\n      }\n    }\n\n    node = node.previousSibling;\n  }\n\n  return null;\n}\nfunction commitHydratedContainer(container) {\n  // Retry if any event replaying was blocked on this.\n  retryIfBlockedOn(container);\n}\nfunction commitHydratedSuspenseInstance(suspenseInstance) {\n  // Retry if any event replaying was blocked on this.\n  retryIfBlockedOn(suspenseInstance);\n}\nfunction didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {\n  {\n    warnForUnmatchedText(textInstance, text);\n  }\n}\nfunction didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    warnForUnmatchedText(textInstance, text);\n  }\n}\nfunction didNotHydrateContainerInstance(parentContainer, instance) {\n  {\n    if (instance.nodeType === ELEMENT_NODE) {\n      warnForDeletedHydratableElement(parentContainer, instance);\n    } else if (instance.nodeType === COMMENT_NODE) ; else {\n      warnForDeletedHydratableText(parentContainer, instance);\n    }\n  }\n}\nfunction didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    if (instance.nodeType === ELEMENT_NODE) {\n      warnForDeletedHydratableElement(parentInstance, instance);\n    } else if (instance.nodeType === COMMENT_NODE) ; else {\n      warnForDeletedHydratableText(parentInstance, instance);\n    }\n  }\n}\nfunction didNotFindHydratableContainerInstance(parentContainer, type, props) {\n  {\n    warnForInsertedHydratedElement(parentContainer, type);\n  }\n}\nfunction didNotFindHydratableContainerTextInstance(parentContainer, text) {\n  {\n    warnForInsertedHydratedText(parentContainer, text);\n  }\n}\nfunction didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    warnForInsertedHydratedElement(parentInstance, type);\n  }\n}\nfunction didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n    warnForInsertedHydratedText(parentInstance, text);\n  }\n}\nfunction didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) {\n  if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) ;\n}\n\nvar randomKey = Math.random().toString(36).slice(2);\nvar internalInstanceKey = '__reactInternalInstance$' + randomKey;\nvar internalEventHandlersKey = '__reactEventHandlers$' + randomKey;\nvar internalContainerInstanceKey = '__reactContainere$' + randomKey;\nfunction precacheFiberNode(hostInst, node) {\n  node[internalInstanceKey] = hostInst;\n}\nfunction markContainerAsRoot(hostRoot, node) {\n  node[internalContainerInstanceKey] = hostRoot;\n}\nfunction unmarkContainerAsRoot(node) {\n  node[internalContainerInstanceKey] = null;\n}\nfunction isContainerMarkedAsRoot(node) {\n  return !!node[internalContainerInstanceKey];\n} // Given a DOM node, return the closest HostComponent or HostText fiber ancestor.\n// If the target node is part of a hydrated or not yet rendered subtree, then\n// this may also return a SuspenseComponent or HostRoot to indicate that.\n// Conceptually the HostRoot fiber is a child of the Container node. So if you\n// pass the Container node as the targetNode, you will not actually get the\n// HostRoot back. To get to the HostRoot, you need to pass a child of it.\n// The same thing applies to Suspense boundaries.\n\nfunction getClosestInstanceFromNode(targetNode) {\n  var targetInst = targetNode[internalInstanceKey];\n\n  if (targetInst) {\n    // Don't return HostRoot or SuspenseComponent here.\n    return targetInst;\n  } // If the direct event target isn't a React owned DOM node, we need to look\n  // to see if one of its parents is a React owned DOM node.\n\n\n  var parentNode = targetNode.parentNode;\n\n  while (parentNode) {\n    // We'll check if this is a container root that could include\n    // React nodes in the future. We need to check this first because\n    // if we're a child of a dehydrated container, we need to first\n    // find that inner container before moving on to finding the parent\n    // instance. Note that we don't check this field on  the targetNode\n    // itself because the fibers are conceptually between the container\n    // node and the first child. It isn't surrounding the container node.\n    // If it's not a container, we check if it's an instance.\n    targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];\n\n    if (targetInst) {\n      // Since this wasn't the direct target of the event, we might have\n      // stepped past dehydrated DOM nodes to get here. However they could\n      // also have been non-React nodes. We need to answer which one.\n      // If we the instance doesn't have any children, then there can't be\n      // a nested suspense boundary within it. So we can use this as a fast\n      // bailout. Most of the time, when people add non-React children to\n      // the tree, it is using a ref to a child-less DOM node.\n      // Normally we'd only need to check one of the fibers because if it\n      // has ever gone from having children to deleting them or vice versa\n      // it would have deleted the dehydrated boundary nested inside already.\n      // However, since the HostRoot starts out with an alternate it might\n      // have one on the alternate so we need to check in case this was a\n      // root.\n      var alternate = targetInst.alternate;\n\n      if (targetInst.child !== null || alternate !== null && alternate.child !== null) {\n        // Next we need to figure out if the node that skipped past is\n        // nested within a dehydrated boundary and if so, which one.\n        var suspenseInstance = getParentSuspenseInstance(targetNode);\n\n        while (suspenseInstance !== null) {\n          // We found a suspense instance. That means that we haven't\n          // hydrated it yet. Even though we leave the comments in the\n          // DOM after hydrating, and there are boundaries in the DOM\n          // that could already be hydrated, we wouldn't have found them\n          // through this pass since if the target is hydrated it would\n          // have had an internalInstanceKey on it.\n          // Let's get the fiber associated with the SuspenseComponent\n          // as the deepest instance.\n          var targetSuspenseInst = suspenseInstance[internalInstanceKey];\n\n          if (targetSuspenseInst) {\n            return targetSuspenseInst;\n          } // If we don't find a Fiber on the comment, it might be because\n          // we haven't gotten to hydrate it yet. There might still be a\n          // parent boundary that hasn't above this one so we need to find\n          // the outer most that is known.\n\n\n          suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent\n          // host component also hasn't hydrated yet. We can return it\n          // below since it will bail out on the isMounted check later.\n        }\n      }\n\n      return targetInst;\n    }\n\n    targetNode = parentNode;\n    parentNode = targetNode.parentNode;\n  }\n\n  return null;\n}\n/**\n * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent\n * instance, or null if the node was not rendered by this React.\n */\n\nfunction getInstanceFromNode$1(node) {\n  var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];\n\n  if (inst) {\n    if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {\n      return inst;\n    } else {\n      return null;\n    }\n  }\n\n  return null;\n}\n/**\n * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding\n * DOM node.\n */\n\nfunction getNodeFromInstance$1(inst) {\n  if (inst.tag === HostComponent || inst.tag === HostText) {\n    // In Fiber this, is just the state node right now. We assume it will be\n    // a host component or host text.\n    return inst.stateNode;\n  } // Without this first invariant, passing a non-DOM-component triggers the next\n  // invariant for a missing parent, which is super confusing.\n\n\n  {\n    {\n      throw Error( \"getNodeFromInstance: Invalid argument.\" );\n    }\n  }\n}\nfunction getFiberCurrentPropsFromNode$1(node) {\n  return node[internalEventHandlersKey] || null;\n}\nfunction updateFiberProps(node, props) {\n  node[internalEventHandlersKey] = props;\n}\n\nfunction getParent(inst) {\n  do {\n    inst = inst.return; // TODO: If this is a HostRoot we might want to bail out.\n    // That is depending on if we want nested subtrees (layers) to bubble\n    // events to their parent. We could also go through parentNode on the\n    // host node but that wouldn't work for React Native and doesn't let us\n    // do the portal feature.\n  } while (inst && inst.tag !== HostComponent);\n\n  if (inst) {\n    return inst;\n  }\n\n  return null;\n}\n/**\n * Return the lowest common ancestor of A and B, or null if they are in\n * different trees.\n */\n\n\nfunction getLowestCommonAncestor(instA, instB) {\n  var depthA = 0;\n\n  for (var tempA = instA; tempA; tempA = getParent(tempA)) {\n    depthA++;\n  }\n\n  var depthB = 0;\n\n  for (var tempB = instB; tempB; tempB = getParent(tempB)) {\n    depthB++;\n  } // If A is deeper, crawl up.\n\n\n  while (depthA - depthB > 0) {\n    instA = getParent(instA);\n    depthA--;\n  } // If B is deeper, crawl up.\n\n\n  while (depthB - depthA > 0) {\n    instB = getParent(instB);\n    depthB--;\n  } // Walk in lockstep until we find a match.\n\n\n  var depth = depthA;\n\n  while (depth--) {\n    if (instA === instB || instA === instB.alternate) {\n      return instA;\n    }\n\n    instA = getParent(instA);\n    instB = getParent(instB);\n  }\n\n  return null;\n}\n/**\n * Simulates the traversal of a two-phase, capture/bubble event dispatch.\n */\n\nfunction traverseTwoPhase(inst, fn, arg) {\n  var path = [];\n\n  while (inst) {\n    path.push(inst);\n    inst = getParent(inst);\n  }\n\n  var i;\n\n  for (i = path.length; i-- > 0;) {\n    fn(path[i], 'captured', arg);\n  }\n\n  for (i = 0; i < path.length; i++) {\n    fn(path[i], 'bubbled', arg);\n  }\n}\n/**\n * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that\n * should would receive a `mouseEnter` or `mouseLeave` event.\n *\n * Does not invoke the callback on the nearest common ancestor because nothing\n * \"entered\" or \"left\" that element.\n */\n\nfunction traverseEnterLeave(from, to, fn, argFrom, argTo) {\n  var common = from && to ? getLowestCommonAncestor(from, to) : null;\n  var pathFrom = [];\n\n  while (true) {\n    if (!from) {\n      break;\n    }\n\n    if (from === common) {\n      break;\n    }\n\n    var alternate = from.alternate;\n\n    if (alternate !== null && alternate === common) {\n      break;\n    }\n\n    pathFrom.push(from);\n    from = getParent(from);\n  }\n\n  var pathTo = [];\n\n  while (true) {\n    if (!to) {\n      break;\n    }\n\n    if (to === common) {\n      break;\n    }\n\n    var _alternate = to.alternate;\n\n    if (_alternate !== null && _alternate === common) {\n      break;\n    }\n\n    pathTo.push(to);\n    to = getParent(to);\n  }\n\n  for (var i = 0; i < pathFrom.length; i++) {\n    fn(pathFrom[i], 'bubbled', argFrom);\n  }\n\n  for (var _i = pathTo.length; _i-- > 0;) {\n    fn(pathTo[_i], 'captured', argTo);\n  }\n}\n\nfunction isInteractive(tag) {\n  return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';\n}\n\nfunction shouldPreventMouseEvent(name, type, props) {\n  switch (name) {\n    case 'onClick':\n    case 'onClickCapture':\n    case 'onDoubleClick':\n    case 'onDoubleClickCapture':\n    case 'onMouseDown':\n    case 'onMouseDownCapture':\n    case 'onMouseMove':\n    case 'onMouseMoveCapture':\n    case 'onMouseUp':\n    case 'onMouseUpCapture':\n    case 'onMouseEnter':\n      return !!(props.disabled && isInteractive(type));\n\n    default:\n      return false;\n  }\n}\n/**\n * @param {object} inst The instance, which is the source of events.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @return {?function} The stored callback.\n */\n\n\nfunction getListener(inst, registrationName) {\n  var listener; // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not\n  // live here; needs to be moved to a better place soon\n\n  var stateNode = inst.stateNode;\n\n  if (!stateNode) {\n    // Work in progress (ex: onload events in incremental mode).\n    return null;\n  }\n\n  var props = getFiberCurrentPropsFromNode(stateNode);\n\n  if (!props) {\n    // Work in progress.\n    return null;\n  }\n\n  listener = props[registrationName];\n\n  if (shouldPreventMouseEvent(registrationName, inst.type, props)) {\n    return null;\n  }\n\n  if (!(!listener || typeof listener === 'function')) {\n    {\n      throw Error( \"Expected `\" + registrationName + \"` listener to be a function, instead got a value of `\" + typeof listener + \"` type.\" );\n    }\n  }\n\n  return listener;\n}\n\n/**\n * Some event types have a notion of different registration names for different\n * \"phases\" of propagation. This finds listeners by a given phase.\n */\nfunction listenerAtPhase(inst, event, propagationPhase) {\n  var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];\n  return getListener(inst, registrationName);\n}\n/**\n * A small set of propagation patterns, each of which will accept a small amount\n * of information, and generate a set of \"dispatch ready event objects\" - which\n * are sets of events that have already been annotated with a set of dispatched\n * listener functions/ids. The API is designed this way to discourage these\n * propagation strategies from actually executing the dispatches, since we\n * always want to collect the entire set of dispatches before executing even a\n * single one.\n */\n\n/**\n * Tags a `SyntheticEvent` with dispatched listeners. Creating this function\n * here, allows us to not have to bind or create functions for each event.\n * Mutating the event's members allows us to not have to create a wrapping\n * \"dispatch\" object that pairs the event with the listener.\n */\n\n\nfunction accumulateDirectionalDispatches(inst, phase, event) {\n  {\n    if (!inst) {\n      error('Dispatching inst must not be null');\n    }\n  }\n\n  var listener = listenerAtPhase(inst, event, phase);\n\n  if (listener) {\n    event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n    event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n  }\n}\n/**\n * Collect dispatches (must be entirely collected before dispatching - see unit\n * tests). Lazily allocate the array to conserve memory.  We must loop through\n * each event and perform the traversal for each one. We cannot perform a\n * single traversal for the entire collection of events because each event may\n * have a different target.\n */\n\n\nfunction accumulateTwoPhaseDispatchesSingle(event) {\n  if (event && event.dispatchConfig.phasedRegistrationNames) {\n    traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);\n  }\n}\n/**\n * Accumulates without regard to direction, does not look for phased\n * registration names. Same as `accumulateDirectDispatchesSingle` but without\n * requiring that the `dispatchMarker` be the same as the dispatched ID.\n */\n\n\nfunction accumulateDispatches(inst, ignoredDirection, event) {\n  if (inst && event && event.dispatchConfig.registrationName) {\n    var registrationName = event.dispatchConfig.registrationName;\n    var listener = getListener(inst, registrationName);\n\n    if (listener) {\n      event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n      event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n    }\n  }\n}\n/**\n * Accumulates dispatches on an `SyntheticEvent`, but only for the\n * `dispatchMarker`.\n * @param {SyntheticEvent} event\n */\n\n\nfunction accumulateDirectDispatchesSingle(event) {\n  if (event && event.dispatchConfig.registrationName) {\n    accumulateDispatches(event._targetInst, null, event);\n  }\n}\n\nfunction accumulateTwoPhaseDispatches(events) {\n  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n}\nfunction accumulateEnterLeaveDispatches(leave, enter, from, to) {\n  traverseEnterLeave(from, to, accumulateDispatches, leave, enter);\n}\nfunction accumulateDirectDispatches(events) {\n  forEachAccumulated(events, accumulateDirectDispatchesSingle);\n}\n\n/**\n * These variables store information about text content of a target node,\n * allowing comparison of content before and after a given event.\n *\n * Identify the node where selection currently begins, then observe\n * both its text content and its current position in the DOM. Since the\n * browser may natively replace the target node during composition, we can\n * use its position to find its replacement.\n *\n *\n */\nvar root = null;\nvar startText = null;\nvar fallbackText = null;\nfunction initialize(nativeEventTarget) {\n  root = nativeEventTarget;\n  startText = getText();\n  return true;\n}\nfunction reset() {\n  root = null;\n  startText = null;\n  fallbackText = null;\n}\nfunction getData() {\n  if (fallbackText) {\n    return fallbackText;\n  }\n\n  var start;\n  var startValue = startText;\n  var startLength = startValue.length;\n  var end;\n  var endValue = getText();\n  var endLength = endValue.length;\n\n  for (start = 0; start < startLength; start++) {\n    if (startValue[start] !== endValue[start]) {\n      break;\n    }\n  }\n\n  var minEnd = startLength - start;\n\n  for (end = 1; end <= minEnd; end++) {\n    if (startValue[startLength - end] !== endValue[endLength - end]) {\n      break;\n    }\n  }\n\n  var sliceTail = end > 1 ? 1 - end : undefined;\n  fallbackText = endValue.slice(start, sliceTail);\n  return fallbackText;\n}\nfunction getText() {\n  if ('value' in root) {\n    return root.value;\n  }\n\n  return root.textContent;\n}\n\nvar EVENT_POOL_SIZE = 10;\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar EventInterface = {\n  type: null,\n  target: null,\n  // currentTarget is set when dispatching; no use in copying it here\n  currentTarget: function () {\n    return null;\n  },\n  eventPhase: null,\n  bubbles: null,\n  cancelable: null,\n  timeStamp: function (event) {\n    return event.timeStamp || Date.now();\n  },\n  defaultPrevented: null,\n  isTrusted: null\n};\n\nfunction functionThatReturnsTrue() {\n  return true;\n}\n\nfunction functionThatReturnsFalse() {\n  return false;\n}\n/**\n * Synthetic events are dispatched by event plugins, typically in response to a\n * top-level event delegation handler.\n *\n * These systems should generally use pooling to reduce the frequency of garbage\n * collection. The system should check `isPersistent` to determine whether the\n * event should be released into the pool after being dispatched. Users that\n * need a persisted event should invoke `persist`.\n *\n * Synthetic events (and subclasses) implement the DOM Level 3 Events API by\n * normalizing browser quirks. Subclasses do not necessarily have to implement a\n * DOM interface; custom application-specific events can also subclass this.\n *\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {*} targetInst Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @param {DOMEventTarget} nativeEventTarget Target node.\n */\n\n\nfunction SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {\n  {\n    // these have a getter/setter for warnings\n    delete this.nativeEvent;\n    delete this.preventDefault;\n    delete this.stopPropagation;\n    delete this.isDefaultPrevented;\n    delete this.isPropagationStopped;\n  }\n\n  this.dispatchConfig = dispatchConfig;\n  this._targetInst = targetInst;\n  this.nativeEvent = nativeEvent;\n  var Interface = this.constructor.Interface;\n\n  for (var propName in Interface) {\n    if (!Interface.hasOwnProperty(propName)) {\n      continue;\n    }\n\n    {\n      delete this[propName]; // this has a getter/setter for warnings\n    }\n\n    var normalize = Interface[propName];\n\n    if (normalize) {\n      this[propName] = normalize(nativeEvent);\n    } else {\n      if (propName === 'target') {\n        this.target = nativeEventTarget;\n      } else {\n        this[propName] = nativeEvent[propName];\n      }\n    }\n  }\n\n  var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;\n\n  if (defaultPrevented) {\n    this.isDefaultPrevented = functionThatReturnsTrue;\n  } else {\n    this.isDefaultPrevented = functionThatReturnsFalse;\n  }\n\n  this.isPropagationStopped = functionThatReturnsFalse;\n  return this;\n}\n\n_assign(SyntheticEvent.prototype, {\n  preventDefault: function () {\n    this.defaultPrevented = true;\n    var event = this.nativeEvent;\n\n    if (!event) {\n      return;\n    }\n\n    if (event.preventDefault) {\n      event.preventDefault();\n    } else if (typeof event.returnValue !== 'unknown') {\n      event.returnValue = false;\n    }\n\n    this.isDefaultPrevented = functionThatReturnsTrue;\n  },\n  stopPropagation: function () {\n    var event = this.nativeEvent;\n\n    if (!event) {\n      return;\n    }\n\n    if (event.stopPropagation) {\n      event.stopPropagation();\n    } else if (typeof event.cancelBubble !== 'unknown') {\n      // The ChangeEventPlugin registers a \"propertychange\" event for\n      // IE. This event does not support bubbling or cancelling, and\n      // any references to cancelBubble throw \"Member not found\".  A\n      // typeof check of \"unknown\" circumvents this issue (and is also\n      // IE specific).\n      event.cancelBubble = true;\n    }\n\n    this.isPropagationStopped = functionThatReturnsTrue;\n  },\n\n  /**\n   * We release all dispatched `SyntheticEvent`s after each event loop, adding\n   * them back into the pool. This allows a way to hold onto a reference that\n   * won't be added back into the pool.\n   */\n  persist: function () {\n    this.isPersistent = functionThatReturnsTrue;\n  },\n\n  /**\n   * Checks if this event should be released back into the pool.\n   *\n   * @return {boolean} True if this should not be released, false otherwise.\n   */\n  isPersistent: functionThatReturnsFalse,\n\n  /**\n   * `PooledClass` looks for `destructor` on each instance it releases.\n   */\n  destructor: function () {\n    var Interface = this.constructor.Interface;\n\n    for (var propName in Interface) {\n      {\n        Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));\n      }\n    }\n\n    this.dispatchConfig = null;\n    this._targetInst = null;\n    this.nativeEvent = null;\n    this.isDefaultPrevented = functionThatReturnsFalse;\n    this.isPropagationStopped = functionThatReturnsFalse;\n    this._dispatchListeners = null;\n    this._dispatchInstances = null;\n\n    {\n      Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));\n      Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse));\n      Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse));\n      Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {}));\n      Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {}));\n    }\n  }\n});\n\nSyntheticEvent.Interface = EventInterface;\n/**\n * Helper to reduce boilerplate when creating subclasses.\n */\n\nSyntheticEvent.extend = function (Interface) {\n  var Super = this;\n\n  var E = function () {};\n\n  E.prototype = Super.prototype;\n  var prototype = new E();\n\n  function Class() {\n    return Super.apply(this, arguments);\n  }\n\n  _assign(prototype, Class.prototype);\n\n  Class.prototype = prototype;\n  Class.prototype.constructor = Class;\n  Class.Interface = _assign({}, Super.Interface, Interface);\n  Class.extend = Super.extend;\n  addEventPoolingTo(Class);\n  return Class;\n};\n\naddEventPoolingTo(SyntheticEvent);\n/**\n * Helper to nullify syntheticEvent instance properties when destructing\n *\n * @param {String} propName\n * @param {?object} getVal\n * @return {object} defineProperty object\n */\n\nfunction getPooledWarningPropertyDefinition(propName, getVal) {\n  var isFunction = typeof getVal === 'function';\n  return {\n    configurable: true,\n    set: set,\n    get: get\n  };\n\n  function set(val) {\n    var action = isFunction ? 'setting the method' : 'setting the property';\n    warn(action, 'This is effectively a no-op');\n    return val;\n  }\n\n  function get() {\n    var action = isFunction ? 'accessing the method' : 'accessing the property';\n    var result = isFunction ? 'This is a no-op function' : 'This is set to null';\n    warn(action, result);\n    return getVal;\n  }\n\n  function warn(action, result) {\n    {\n      error(\"This synthetic event is reused for performance reasons. If you're seeing this, \" + \"you're %s `%s` on a released/nullified synthetic event. %s. \" + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result);\n    }\n  }\n}\n\nfunction getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {\n  var EventConstructor = this;\n\n  if (EventConstructor.eventPool.length) {\n    var instance = EventConstructor.eventPool.pop();\n    EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst);\n    return instance;\n  }\n\n  return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);\n}\n\nfunction releasePooledEvent(event) {\n  var EventConstructor = this;\n\n  if (!(event instanceof EventConstructor)) {\n    {\n      throw Error( \"Trying to release an event instance into a pool of a different type.\" );\n    }\n  }\n\n  event.destructor();\n\n  if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {\n    EventConstructor.eventPool.push(event);\n  }\n}\n\nfunction addEventPoolingTo(EventConstructor) {\n  EventConstructor.eventPool = [];\n  EventConstructor.getPooled = getPooledEvent;\n  EventConstructor.release = releasePooledEvent;\n}\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents\n */\n\nvar SyntheticCompositionEvent = SyntheticEvent.extend({\n  data: null\n});\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105\n *      /#events-inputevents\n */\n\nvar SyntheticInputEvent = SyntheticEvent.extend({\n  data: null\n});\n\nvar END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space\n\nvar START_KEYCODE = 229;\nvar canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;\nvar documentMode = null;\n\nif (canUseDOM && 'documentMode' in document) {\n  documentMode = document.documentMode;\n} // Webkit offers a very useful `textInput` event that can be used to\n// directly represent `beforeInput`. The IE `textinput` event is not as\n// useful, so we don't use it.\n\n\nvar canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied\n// by the native compositionend event may be incorrect. Japanese ideographic\n// spaces, for instance (\\u3000) are not recorded correctly.\n\nvar useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);\nvar SPACEBAR_CODE = 32;\nvar SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); // Events and their corresponding property names.\n\nvar eventTypes = {\n  beforeInput: {\n    phasedRegistrationNames: {\n      bubbled: 'onBeforeInput',\n      captured: 'onBeforeInputCapture'\n    },\n    dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE]\n  },\n  compositionEnd: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionEnd',\n      captured: 'onCompositionEndCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n  },\n  compositionStart: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionStart',\n      captured: 'onCompositionStartCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n  },\n  compositionUpdate: {\n    phasedRegistrationNames: {\n      bubbled: 'onCompositionUpdate',\n      captured: 'onCompositionUpdateCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n  }\n}; // Track whether we've ever handled a keypress on the space key.\n\nvar hasSpaceKeypress = false;\n/**\n * Return whether a native keypress event is assumed to be a command.\n * This is required because Firefox fires `keypress` events for key commands\n * (cut, copy, select-all, etc.) even though no character is inserted.\n */\n\nfunction isKeypressCommand(nativeEvent) {\n  return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command.\n  !(nativeEvent.ctrlKey && nativeEvent.altKey);\n}\n/**\n * Translate native top level events into event types.\n *\n * @param {string} topLevelType\n * @return {object}\n */\n\n\nfunction getCompositionEventType(topLevelType) {\n  switch (topLevelType) {\n    case TOP_COMPOSITION_START:\n      return eventTypes.compositionStart;\n\n    case TOP_COMPOSITION_END:\n      return eventTypes.compositionEnd;\n\n    case TOP_COMPOSITION_UPDATE:\n      return eventTypes.compositionUpdate;\n  }\n}\n/**\n * Does our fallback best-guess model think this event signifies that\n * composition has begun?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\n\n\nfunction isFallbackCompositionStart(topLevelType, nativeEvent) {\n  return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE;\n}\n/**\n * Does our fallback mode think that this event is the end of composition?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\n\n\nfunction isFallbackCompositionEnd(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case TOP_KEY_UP:\n      // Command keys insert or clear IME input.\n      return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;\n\n    case TOP_KEY_DOWN:\n      // Expect IME keyCode on each keydown. If we get any other\n      // code we must have exited earlier.\n      return nativeEvent.keyCode !== START_KEYCODE;\n\n    case TOP_KEY_PRESS:\n    case TOP_MOUSE_DOWN:\n    case TOP_BLUR:\n      // Events are not possible without cancelling IME.\n      return true;\n\n    default:\n      return false;\n  }\n}\n/**\n * Google Input Tools provides composition data via a CustomEvent,\n * with the `data` property populated in the `detail` object. If this\n * is available on the event object, use it. If not, this is a plain\n * composition event and we have nothing special to extract.\n *\n * @param {object} nativeEvent\n * @return {?string}\n */\n\n\nfunction getDataFromCustomEvent(nativeEvent) {\n  var detail = nativeEvent.detail;\n\n  if (typeof detail === 'object' && 'data' in detail) {\n    return detail.data;\n  }\n\n  return null;\n}\n/**\n * Check if a composition event was triggered by Korean IME.\n * Our fallback mode does not work well with IE's Korean IME,\n * so just use native composition events when Korean IME is used.\n * Although CompositionEvent.locale property is deprecated,\n * it is available in IE, where our fallback mode is enabled.\n *\n * @param {object} nativeEvent\n * @return {boolean}\n */\n\n\nfunction isUsingKoreanIME(nativeEvent) {\n  return nativeEvent.locale === 'ko';\n} // Track the current IME composition status, if any.\n\n\nvar isComposing = false;\n/**\n * @return {?object} A SyntheticCompositionEvent.\n */\n\nfunction extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n  var eventType;\n  var fallbackData;\n\n  if (canUseCompositionEvent) {\n    eventType = getCompositionEventType(topLevelType);\n  } else if (!isComposing) {\n    if (isFallbackCompositionStart(topLevelType, nativeEvent)) {\n      eventType = eventTypes.compositionStart;\n    }\n  } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n    eventType = eventTypes.compositionEnd;\n  }\n\n  if (!eventType) {\n    return null;\n  }\n\n  if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {\n    // The current composition is stored statically and must not be\n    // overwritten while composition continues.\n    if (!isComposing && eventType === eventTypes.compositionStart) {\n      isComposing = initialize(nativeEventTarget);\n    } else if (eventType === eventTypes.compositionEnd) {\n      if (isComposing) {\n        fallbackData = getData();\n      }\n    }\n  }\n\n  var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);\n\n  if (fallbackData) {\n    // Inject data generated from fallback path into the synthetic event.\n    // This matches the property of native CompositionEventInterface.\n    event.data = fallbackData;\n  } else {\n    var customData = getDataFromCustomEvent(nativeEvent);\n\n    if (customData !== null) {\n      event.data = customData;\n    }\n  }\n\n  accumulateTwoPhaseDispatches(event);\n  return event;\n}\n/**\n * @param {TopLevelType} topLevelType Number from `TopLevelType`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The string corresponding to this `beforeInput` event.\n */\n\n\nfunction getNativeBeforeInputChars(topLevelType, nativeEvent) {\n  switch (topLevelType) {\n    case TOP_COMPOSITION_END:\n      return getDataFromCustomEvent(nativeEvent);\n\n    case TOP_KEY_PRESS:\n      /**\n       * If native `textInput` events are available, our goal is to make\n       * use of them. However, there is a special case: the spacebar key.\n       * In Webkit, preventing default on a spacebar `textInput` event\n       * cancels character insertion, but it *also* causes the browser\n       * to fall back to its default spacebar behavior of scrolling the\n       * page.\n       *\n       * Tracking at:\n       * https://code.google.com/p/chromium/issues/detail?id=355103\n       *\n       * To avoid this issue, use the keypress event as if no `textInput`\n       * event is available.\n       */\n      var which = nativeEvent.which;\n\n      if (which !== SPACEBAR_CODE) {\n        return null;\n      }\n\n      hasSpaceKeypress = true;\n      return SPACEBAR_CHAR;\n\n    case TOP_TEXT_INPUT:\n      // Record the characters to be added to the DOM.\n      var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled\n      // it at the keypress level and bail immediately. Android Chrome\n      // doesn't give us keycodes, so we need to ignore it.\n\n      if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {\n        return null;\n      }\n\n      return chars;\n\n    default:\n      // For other native event types, do nothing.\n      return null;\n  }\n}\n/**\n * For browsers that do not provide the `textInput` event, extract the\n * appropriate string to use for SyntheticInputEvent.\n *\n * @param {number} topLevelType Number from `TopLevelEventTypes`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The fallback string for this `beforeInput` event.\n */\n\n\nfunction getFallbackBeforeInputChars(topLevelType, nativeEvent) {\n  // If we are currently composing (IME) and using a fallback to do so,\n  // try to extract the composed characters from the fallback object.\n  // If composition event is available, we extract a string only at\n  // compositionevent, otherwise extract it at fallback events.\n  if (isComposing) {\n    if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n      var chars = getData();\n      reset();\n      isComposing = false;\n      return chars;\n    }\n\n    return null;\n  }\n\n  switch (topLevelType) {\n    case TOP_PASTE:\n      // If a paste event occurs after a keypress, throw out the input\n      // chars. Paste events should not lead to BeforeInput events.\n      return null;\n\n    case TOP_KEY_PRESS:\n      /**\n       * As of v27, Firefox may fire keypress events even when no character\n       * will be inserted. A few possibilities:\n       *\n       * - `which` is `0`. Arrow keys, Esc key, etc.\n       *\n       * - `which` is the pressed key code, but no char is available.\n       *   Ex: 'AltGr + d` in Polish. There is no modified character for\n       *   this key combination and no character is inserted into the\n       *   document, but FF fires the keypress for char code `100` anyway.\n       *   No `input` event will occur.\n       *\n       * - `which` is the pressed key code, but a command combination is\n       *   being used. Ex: `Cmd+C`. No character is inserted, and no\n       *   `input` event will occur.\n       */\n      if (!isKeypressCommand(nativeEvent)) {\n        // IE fires the `keypress` event when a user types an emoji via\n        // Touch keyboard of Windows.  In such a case, the `char` property\n        // holds an emoji character like `\\uD83D\\uDE0A`.  Because its length\n        // is 2, the property `which` does not represent an emoji correctly.\n        // In such a case, we directly return the `char` property instead of\n        // using `which`.\n        if (nativeEvent.char && nativeEvent.char.length > 1) {\n          return nativeEvent.char;\n        } else if (nativeEvent.which) {\n          return String.fromCharCode(nativeEvent.which);\n        }\n      }\n\n      return null;\n\n    case TOP_COMPOSITION_END:\n      return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;\n\n    default:\n      return null;\n  }\n}\n/**\n * Extract a SyntheticInputEvent for `beforeInput`, based on either native\n * `textInput` or fallback behavior.\n *\n * @return {?object} A SyntheticInputEvent.\n */\n\n\nfunction extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n  var chars;\n\n  if (canUseTextInputEvent) {\n    chars = getNativeBeforeInputChars(topLevelType, nativeEvent);\n  } else {\n    chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);\n  } // If no characters are being inserted, no BeforeInput event should\n  // be fired.\n\n\n  if (!chars) {\n    return null;\n  }\n\n  var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);\n  event.data = chars;\n  accumulateTwoPhaseDispatches(event);\n  return event;\n}\n/**\n * Create an `onBeforeInput` event to match\n * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.\n *\n * This event plugin is based on the native `textInput` event\n * available in Chrome, Safari, Opera, and IE. This event fires after\n * `onKeyPress` and `onCompositionEnd`, but before `onInput`.\n *\n * `beforeInput` is spec'd but not implemented in any browsers, and\n * the `input` event does not provide any useful information about what has\n * actually been added, contrary to the spec. Thus, `textInput` is the best\n * available event to identify the characters that have actually been inserted\n * into the target node.\n *\n * This plugin is also responsible for emitting `composition` events, thus\n * allowing us to share composition fallback code for both `beforeInput` and\n * `composition` event types.\n */\n\n\nvar BeforeInputEventPlugin = {\n  eventTypes: eventTypes,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n    var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n\n    if (composition === null) {\n      return beforeInput;\n    }\n\n    if (beforeInput === null) {\n      return composition;\n    }\n\n    return [composition, beforeInput];\n  }\n};\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n */\nvar supportedInputTypes = {\n  color: true,\n  date: true,\n  datetime: true,\n  'datetime-local': true,\n  email: true,\n  month: true,\n  number: true,\n  password: true,\n  range: true,\n  search: true,\n  tel: true,\n  text: true,\n  time: true,\n  url: true,\n  week: true\n};\n\nfunction isTextInputElement(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n\n  if (nodeName === 'input') {\n    return !!supportedInputTypes[elem.type];\n  }\n\n  if (nodeName === 'textarea') {\n    return true;\n  }\n\n  return false;\n}\n\nvar eventTypes$1 = {\n  change: {\n    phasedRegistrationNames: {\n      bubbled: 'onChange',\n      captured: 'onChangeCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE]\n  }\n};\n\nfunction createAndAccumulateChangeEvent(inst, nativeEvent, target) {\n  var event = SyntheticEvent.getPooled(eventTypes$1.change, inst, nativeEvent, target);\n  event.type = 'change'; // Flag this event loop as needing state restore.\n\n  enqueueStateRestore(target);\n  accumulateTwoPhaseDispatches(event);\n  return event;\n}\n/**\n * For IE shims\n */\n\n\nvar activeElement = null;\nvar activeElementInst = null;\n/**\n * SECTION: handle `change` event\n */\n\nfunction shouldUseChangeEvent(elem) {\n  var nodeName = elem.nodeName && elem.nodeName.toLowerCase();\n  return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';\n}\n\nfunction manualDispatchChangeEvent(nativeEvent) {\n  var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the\n  // other events and have it go through ReactBrowserEventEmitter. Since it\n  // doesn't, we manually listen for the events and so we have to enqueue and\n  // process the abstract event manually.\n  //\n  // Batching is necessary here in order to ensure that all event handlers run\n  // before the next rerender (including event handlers attached to ancestor\n  // elements instead of directly on the input). Without this, controlled\n  // components don't work properly in conjunction with event bubbling because\n  // the component is rerendered and the value reverted before all the event\n  // handlers can run. See https://github.com/facebook/react/issues/708.\n\n  batchedUpdates(runEventInBatch, event);\n}\n\nfunction runEventInBatch(event) {\n  runEventsInBatch(event);\n}\n\nfunction getInstIfValueChanged(targetInst) {\n  var targetNode = getNodeFromInstance$1(targetInst);\n\n  if (updateValueIfChanged(targetNode)) {\n    return targetInst;\n  }\n}\n\nfunction getTargetInstForChangeEvent(topLevelType, targetInst) {\n  if (topLevelType === TOP_CHANGE) {\n    return targetInst;\n  }\n}\n/**\n * SECTION: handle `input` event\n */\n\n\nvar isInputEventSupported = false;\n\nif (canUseDOM) {\n  // IE9 claims to support the input event but fails to trigger it when\n  // deleting text, so we ignore its input events.\n  isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);\n}\n/**\n * (For IE <=9) Starts tracking propertychange events on the passed-in element\n * and override the value property so that we can distinguish user events from\n * value changes in JS.\n */\n\n\nfunction startWatchingForValueChange(target, targetInst) {\n  activeElement = target;\n  activeElementInst = targetInst;\n  activeElement.attachEvent('onpropertychange', handlePropertyChange);\n}\n/**\n * (For IE <=9) Removes the event listeners from the currently-tracked element,\n * if any exists.\n */\n\n\nfunction stopWatchingForValueChange() {\n  if (!activeElement) {\n    return;\n  }\n\n  activeElement.detachEvent('onpropertychange', handlePropertyChange);\n  activeElement = null;\n  activeElementInst = null;\n}\n/**\n * (For IE <=9) Handles a propertychange event, sending a `change` event if\n * the value of the active element has changed.\n */\n\n\nfunction handlePropertyChange(nativeEvent) {\n  if (nativeEvent.propertyName !== 'value') {\n    return;\n  }\n\n  if (getInstIfValueChanged(activeElementInst)) {\n    manualDispatchChangeEvent(nativeEvent);\n  }\n}\n\nfunction handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {\n  if (topLevelType === TOP_FOCUS) {\n    // In IE9, propertychange fires for most input events but is buggy and\n    // doesn't fire when text is deleted, but conveniently, selectionchange\n    // appears to fire in all of the remaining cases so we catch those and\n    // forward the event if the value has changed\n    // In either case, we don't want to call the event handler if the value\n    // is changed from JS so we redefine a setter for `.value` that updates\n    // our activeElementValue variable, allowing us to ignore those changes\n    //\n    // stopWatching() should be a noop here but we call it just in case we\n    // missed a blur event somehow.\n    stopWatchingForValueChange();\n    startWatchingForValueChange(target, targetInst);\n  } else if (topLevelType === TOP_BLUR) {\n    stopWatchingForValueChange();\n  }\n} // For IE8 and IE9.\n\n\nfunction getTargetInstForInputEventPolyfill(topLevelType, targetInst) {\n  if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) {\n    // On the selectionchange event, the target is just document which isn't\n    // helpful for us so just check activeElement instead.\n    //\n    // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire\n    // propertychange on the first input event after setting `value` from a\n    // script and fires only keydown, keypress, keyup. Catching keyup usually\n    // gets it and catching keydown lets us fire an event for the first\n    // keystroke if user does a key repeat (it'll be a little delayed: right\n    // before the second keystroke). Other input methods (e.g., paste) seem to\n    // fire selectionchange normally.\n    return getInstIfValueChanged(activeElementInst);\n  }\n}\n/**\n * SECTION: handle `click` event\n */\n\n\nfunction shouldUseClickEvent(elem) {\n  // Use the `click` event to detect changes to checkbox and radio inputs.\n  // This approach works across all browsers, whereas `change` does not fire\n  // until `blur` in IE8.\n  var nodeName = elem.nodeName;\n  return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');\n}\n\nfunction getTargetInstForClickEvent(topLevelType, targetInst) {\n  if (topLevelType === TOP_CLICK) {\n    return getInstIfValueChanged(targetInst);\n  }\n}\n\nfunction getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {\n  if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) {\n    return getInstIfValueChanged(targetInst);\n  }\n}\n\nfunction handleControlledInputBlur(node) {\n  var state = node._wrapperState;\n\n  if (!state || !state.controlled || node.type !== 'number') {\n    return;\n  }\n\n  {\n    // If controlled, assign the value attribute to the current value on blur\n    setDefaultValue(node, 'number', node.value);\n  }\n}\n/**\n * This plugin creates an `onChange` event that normalizes change events\n * across form elements. This event fires at a time when it's possible to\n * change the element's value without seeing a flicker.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - select\n */\n\n\nvar ChangeEventPlugin = {\n  eventTypes: eventTypes$1,\n  _isInputEventSupported: isInputEventSupported,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n    var getTargetInstFunc, handleEventFunc;\n\n    if (shouldUseChangeEvent(targetNode)) {\n      getTargetInstFunc = getTargetInstForChangeEvent;\n    } else if (isTextInputElement(targetNode)) {\n      if (isInputEventSupported) {\n        getTargetInstFunc = getTargetInstForInputOrChangeEvent;\n      } else {\n        getTargetInstFunc = getTargetInstForInputEventPolyfill;\n        handleEventFunc = handleEventsForInputEventPolyfill;\n      }\n    } else if (shouldUseClickEvent(targetNode)) {\n      getTargetInstFunc = getTargetInstForClickEvent;\n    }\n\n    if (getTargetInstFunc) {\n      var inst = getTargetInstFunc(topLevelType, targetInst);\n\n      if (inst) {\n        var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);\n        return event;\n      }\n    }\n\n    if (handleEventFunc) {\n      handleEventFunc(topLevelType, targetNode, targetInst);\n    } // When blurring, set the value attribute for number inputs\n\n\n    if (topLevelType === TOP_BLUR) {\n      handleControlledInputBlur(targetNode);\n    }\n  }\n};\n\nvar SyntheticUIEvent = SyntheticEvent.extend({\n  view: null,\n  detail: null\n});\n\n/**\n * Translation from modifier key to the associated property in the event.\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers\n */\nvar modifierKeyToProp = {\n  Alt: 'altKey',\n  Control: 'ctrlKey',\n  Meta: 'metaKey',\n  Shift: 'shiftKey'\n}; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support\n// getModifierState. If getModifierState is not supported, we map it to a set of\n// modifier keys exposed by the event. In this case, Lock-keys are not supported.\n\nfunction modifierStateGetter(keyArg) {\n  var syntheticEvent = this;\n  var nativeEvent = syntheticEvent.nativeEvent;\n\n  if (nativeEvent.getModifierState) {\n    return nativeEvent.getModifierState(keyArg);\n  }\n\n  var keyProp = modifierKeyToProp[keyArg];\n  return keyProp ? !!nativeEvent[keyProp] : false;\n}\n\nfunction getEventModifierState(nativeEvent) {\n  return modifierStateGetter;\n}\n\nvar previousScreenX = 0;\nvar previousScreenY = 0; // Use flags to signal movementX/Y has already been set\n\nvar isMovementXSet = false;\nvar isMovementYSet = false;\n/**\n * @interface MouseEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticMouseEvent = SyntheticUIEvent.extend({\n  screenX: null,\n  screenY: null,\n  clientX: null,\n  clientY: null,\n  pageX: null,\n  pageY: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  getModifierState: getEventModifierState,\n  button: null,\n  buttons: null,\n  relatedTarget: function (event) {\n    return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n  },\n  movementX: function (event) {\n    if ('movementX' in event) {\n      return event.movementX;\n    }\n\n    var screenX = previousScreenX;\n    previousScreenX = event.screenX;\n\n    if (!isMovementXSet) {\n      isMovementXSet = true;\n      return 0;\n    }\n\n    return event.type === 'mousemove' ? event.screenX - screenX : 0;\n  },\n  movementY: function (event) {\n    if ('movementY' in event) {\n      return event.movementY;\n    }\n\n    var screenY = previousScreenY;\n    previousScreenY = event.screenY;\n\n    if (!isMovementYSet) {\n      isMovementYSet = true;\n      return 0;\n    }\n\n    return event.type === 'mousemove' ? event.screenY - screenY : 0;\n  }\n});\n\n/**\n * @interface PointerEvent\n * @see http://www.w3.org/TR/pointerevents/\n */\n\nvar SyntheticPointerEvent = SyntheticMouseEvent.extend({\n  pointerId: null,\n  width: null,\n  height: null,\n  pressure: null,\n  tangentialPressure: null,\n  tiltX: null,\n  tiltY: null,\n  twist: null,\n  pointerType: null,\n  isPrimary: null\n});\n\nvar eventTypes$2 = {\n  mouseEnter: {\n    registrationName: 'onMouseEnter',\n    dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]\n  },\n  mouseLeave: {\n    registrationName: 'onMouseLeave',\n    dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]\n  },\n  pointerEnter: {\n    registrationName: 'onPointerEnter',\n    dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]\n  },\n  pointerLeave: {\n    registrationName: 'onPointerLeave',\n    dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]\n  }\n};\nvar EnterLeaveEventPlugin = {\n  eventTypes: eventTypes$2,\n\n  /**\n   * For almost every interaction we care about, there will be both a top-level\n   * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that\n   * we do not extract duplicate events. However, moving the mouse into the\n   * browser from outside will not fire a `mouseout` event. In this case, we use\n   * the `mouseover` top-level event.\n   */\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER;\n    var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT;\n\n    if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0 && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {\n      // If this is an over event with a target, then we've already dispatched\n      // the event in the out event of the other target. If this is replayed,\n      // then it's because we couldn't dispatch against this target previously\n      // so we have to do it now instead.\n      return null;\n    }\n\n    if (!isOutEvent && !isOverEvent) {\n      // Must not be a mouse or pointer in or out - ignoring.\n      return null;\n    }\n\n    var win;\n\n    if (nativeEventTarget.window === nativeEventTarget) {\n      // `nativeEventTarget` is probably a window object.\n      win = nativeEventTarget;\n    } else {\n      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n      var doc = nativeEventTarget.ownerDocument;\n\n      if (doc) {\n        win = doc.defaultView || doc.parentWindow;\n      } else {\n        win = window;\n      }\n    }\n\n    var from;\n    var to;\n\n    if (isOutEvent) {\n      from = targetInst;\n      var related = nativeEvent.relatedTarget || nativeEvent.toElement;\n      to = related ? getClosestInstanceFromNode(related) : null;\n\n      if (to !== null) {\n        var nearestMounted = getNearestMountedFiber(to);\n\n        if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {\n          to = null;\n        }\n      }\n    } else {\n      // Moving to a node from outside the window.\n      from = null;\n      to = targetInst;\n    }\n\n    if (from === to) {\n      // Nothing pertains to our managed components.\n      return null;\n    }\n\n    var eventInterface, leaveEventType, enterEventType, eventTypePrefix;\n\n    if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) {\n      eventInterface = SyntheticMouseEvent;\n      leaveEventType = eventTypes$2.mouseLeave;\n      enterEventType = eventTypes$2.mouseEnter;\n      eventTypePrefix = 'mouse';\n    } else if (topLevelType === TOP_POINTER_OUT || topLevelType === TOP_POINTER_OVER) {\n      eventInterface = SyntheticPointerEvent;\n      leaveEventType = eventTypes$2.pointerLeave;\n      enterEventType = eventTypes$2.pointerEnter;\n      eventTypePrefix = 'pointer';\n    }\n\n    var fromNode = from == null ? win : getNodeFromInstance$1(from);\n    var toNode = to == null ? win : getNodeFromInstance$1(to);\n    var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget);\n    leave.type = eventTypePrefix + 'leave';\n    leave.target = fromNode;\n    leave.relatedTarget = toNode;\n    var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget);\n    enter.type = eventTypePrefix + 'enter';\n    enter.target = toNode;\n    enter.relatedTarget = fromNode;\n    accumulateEnterLeaveDispatches(leave, enter, from, to); // If we are not processing the first ancestor, then we\n    // should not process the same nativeEvent again, as we\n    // will have already processed it in the first ancestor.\n\n    if ((eventSystemFlags & IS_FIRST_ANCESTOR) === 0) {\n      return [leave];\n    }\n\n    return [leave, enter];\n  }\n};\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n  return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n  ;\n}\n\nvar objectIs = typeof Object.is === 'function' ? Object.is : is;\n\nvar hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\n\nfunction shallowEqual(objA, objB) {\n  if (objectIs(objA, objB)) {\n    return true;\n  }\n\n  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  } // Test for A's keys different from B.\n\n\n  for (var i = 0; i < keysA.length; i++) {\n    if (!hasOwnProperty$2.call(objB, keysA[i]) || !objectIs(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nvar skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;\nvar eventTypes$3 = {\n  select: {\n    phasedRegistrationNames: {\n      bubbled: 'onSelect',\n      captured: 'onSelectCapture'\n    },\n    dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_DRAG_END, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE]\n  }\n};\nvar activeElement$1 = null;\nvar activeElementInst$1 = null;\nvar lastSelection = null;\nvar mouseDown = false;\n/**\n * Get an object which is a unique representation of the current selection.\n *\n * The return value will not be consistent across nodes or browsers, but\n * two identical selections on the same node will return identical objects.\n *\n * @param {DOMElement} node\n * @return {object}\n */\n\nfunction getSelection$1(node) {\n  if ('selectionStart' in node && hasSelectionCapabilities(node)) {\n    return {\n      start: node.selectionStart,\n      end: node.selectionEnd\n    };\n  } else {\n    var win = node.ownerDocument && node.ownerDocument.defaultView || window;\n    var selection = win.getSelection();\n    return {\n      anchorNode: selection.anchorNode,\n      anchorOffset: selection.anchorOffset,\n      focusNode: selection.focusNode,\n      focusOffset: selection.focusOffset\n    };\n  }\n}\n/**\n * Get document associated with the event target.\n *\n * @param {object} nativeEventTarget\n * @return {Document}\n */\n\n\nfunction getEventTargetDocument(eventTarget) {\n  return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;\n}\n/**\n * Poll selection to see whether it's changed.\n *\n * @param {object} nativeEvent\n * @param {object} nativeEventTarget\n * @return {?SyntheticEvent}\n */\n\n\nfunction constructSelectEvent(nativeEvent, nativeEventTarget) {\n  // Ensure we have the right element, and that the user is not dragging a\n  // selection (this matches native `select` event behavior). In HTML5, select\n  // fires only on input and textarea thus if there's no focused element we\n  // won't dispatch.\n  var doc = getEventTargetDocument(nativeEventTarget);\n\n  if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {\n    return null;\n  } // Only fire when selection has actually changed.\n\n\n  var currentSelection = getSelection$1(activeElement$1);\n\n  if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n    lastSelection = currentSelection;\n    var syntheticEvent = SyntheticEvent.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);\n    syntheticEvent.type = 'select';\n    syntheticEvent.target = activeElement$1;\n    accumulateTwoPhaseDispatches(syntheticEvent);\n    return syntheticEvent;\n  }\n\n  return null;\n}\n/**\n * This plugin creates an `onSelect` event that normalizes select events\n * across form elements.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - contentEditable\n *\n * This differs from native browser implementations in the following ways:\n * - Fires on contentEditable fields as well as inputs.\n * - Fires for collapsed selection.\n * - Fires after user input.\n */\n\n\nvar SelectEventPlugin = {\n  eventTypes: eventTypes$3,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, container) {\n    var containerOrDoc = container || getEventTargetDocument(nativeEventTarget); // Track whether all listeners exists for this plugin. If none exist, we do\n    // not extract events. See #3639.\n\n    if (!containerOrDoc || !isListeningToAllDependencies('onSelect', containerOrDoc)) {\n      return null;\n    }\n\n    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n\n    switch (topLevelType) {\n      // Track the input node that has focus.\n      case TOP_FOCUS:\n        if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {\n          activeElement$1 = targetNode;\n          activeElementInst$1 = targetInst;\n          lastSelection = null;\n        }\n\n        break;\n\n      case TOP_BLUR:\n        activeElement$1 = null;\n        activeElementInst$1 = null;\n        lastSelection = null;\n        break;\n      // Don't fire the event while the user is dragging. This matches the\n      // semantics of the native select event.\n\n      case TOP_MOUSE_DOWN:\n        mouseDown = true;\n        break;\n\n      case TOP_CONTEXT_MENU:\n      case TOP_MOUSE_UP:\n      case TOP_DRAG_END:\n        mouseDown = false;\n        return constructSelectEvent(nativeEvent, nativeEventTarget);\n      // Chrome and IE fire non-standard event when selection is changed (and\n      // sometimes when it hasn't). IE's event fires out of order with respect\n      // to key and input events on deletion, so we discard it.\n      //\n      // Firefox doesn't support selectionchange, so check selection status\n      // after each key entry. The selection changes after keydown and before\n      // keyup, but we check on keydown as well in the case of holding down a\n      // key, when multiple keydown events are fired but only one keyup is.\n      // This is also our approach for IE handling, for the reason above.\n\n      case TOP_SELECTION_CHANGE:\n        if (skipSelectionChangeEvent) {\n          break;\n        }\n\n      // falls through\n\n      case TOP_KEY_DOWN:\n      case TOP_KEY_UP:\n        return constructSelectEvent(nativeEvent, nativeEventTarget);\n    }\n\n    return null;\n  }\n};\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent\n */\n\nvar SyntheticAnimationEvent = SyntheticEvent.extend({\n  animationName: null,\n  elapsedTime: null,\n  pseudoElement: null\n});\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/clipboard-apis/\n */\n\nvar SyntheticClipboardEvent = SyntheticEvent.extend({\n  clipboardData: function (event) {\n    return 'clipboardData' in event ? event.clipboardData : window.clipboardData;\n  }\n});\n\n/**\n * @interface FocusEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticFocusEvent = SyntheticUIEvent.extend({\n  relatedTarget: null\n});\n\n/**\n * `charCode` represents the actual \"character code\" and is safe to use with\n * `String.fromCharCode`. As such, only keys that correspond to printable\n * characters produce a valid `charCode`, the only exception to this is Enter.\n * The Tab-key is considered non-printable and does not have a `charCode`,\n * presumably because it does not produce a tab-character in browsers.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {number} Normalized `charCode` property.\n */\nfunction getEventCharCode(nativeEvent) {\n  var charCode;\n  var keyCode = nativeEvent.keyCode;\n\n  if ('charCode' in nativeEvent) {\n    charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`.\n\n    if (charCode === 0 && keyCode === 13) {\n      charCode = 13;\n    }\n  } else {\n    // IE8 does not implement `charCode`, but `keyCode` has the correct value.\n    charCode = keyCode;\n  } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)\n  // report Enter as charCode 10 when ctrl is pressed.\n\n\n  if (charCode === 10) {\n    charCode = 13;\n  } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.\n  // Must not discard the (non-)printable Enter-key.\n\n\n  if (charCode >= 32 || charCode === 13) {\n    return charCode;\n  }\n\n  return 0;\n}\n\n/**\n * Normalization of deprecated HTML5 `key` values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\n\nvar normalizeKey = {\n  Esc: 'Escape',\n  Spacebar: ' ',\n  Left: 'ArrowLeft',\n  Up: 'ArrowUp',\n  Right: 'ArrowRight',\n  Down: 'ArrowDown',\n  Del: 'Delete',\n  Win: 'OS',\n  Menu: 'ContextMenu',\n  Apps: 'ContextMenu',\n  Scroll: 'ScrollLock',\n  MozPrintableKey: 'Unidentified'\n};\n/**\n * Translation from legacy `keyCode` to HTML5 `key`\n * Only special keys supported, all others depend on keyboard layout or browser\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\n\nvar translateToKey = {\n  '8': 'Backspace',\n  '9': 'Tab',\n  '12': 'Clear',\n  '13': 'Enter',\n  '16': 'Shift',\n  '17': 'Control',\n  '18': 'Alt',\n  '19': 'Pause',\n  '20': 'CapsLock',\n  '27': 'Escape',\n  '32': ' ',\n  '33': 'PageUp',\n  '34': 'PageDown',\n  '35': 'End',\n  '36': 'Home',\n  '37': 'ArrowLeft',\n  '38': 'ArrowUp',\n  '39': 'ArrowRight',\n  '40': 'ArrowDown',\n  '45': 'Insert',\n  '46': 'Delete',\n  '112': 'F1',\n  '113': 'F2',\n  '114': 'F3',\n  '115': 'F4',\n  '116': 'F5',\n  '117': 'F6',\n  '118': 'F7',\n  '119': 'F8',\n  '120': 'F9',\n  '121': 'F10',\n  '122': 'F11',\n  '123': 'F12',\n  '144': 'NumLock',\n  '145': 'ScrollLock',\n  '224': 'Meta'\n};\n/**\n * @param {object} nativeEvent Native browser event.\n * @return {string} Normalized `key` property.\n */\n\nfunction getEventKey(nativeEvent) {\n  if (nativeEvent.key) {\n    // Normalize inconsistent values reported by browsers due to\n    // implementations of a working draft specification.\n    // FireFox implements `key` but returns `MozPrintableKey` for all\n    // printable characters (normalized to `Unidentified`), ignore it.\n    var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n\n    if (key !== 'Unidentified') {\n      return key;\n    }\n  } // Browser does not implement `key`, polyfill as much of it as we can.\n\n\n  if (nativeEvent.type === 'keypress') {\n    var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can\n    // thus be captured by `keypress`, no other non-printable key should.\n\n    return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);\n  }\n\n  if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {\n    // While user keyboard layout determines the actual meaning of each\n    // `keyCode` value, almost all function keys have a universal value.\n    return translateToKey[nativeEvent.keyCode] || 'Unidentified';\n  }\n\n  return '';\n}\n\n/**\n * @interface KeyboardEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticKeyboardEvent = SyntheticUIEvent.extend({\n  key: getEventKey,\n  location: null,\n  ctrlKey: null,\n  shiftKey: null,\n  altKey: null,\n  metaKey: null,\n  repeat: null,\n  locale: null,\n  getModifierState: getEventModifierState,\n  // Legacy Interface\n  charCode: function (event) {\n    // `charCode` is the result of a KeyPress event and represents the value of\n    // the actual printable character.\n    // KeyPress is deprecated, but its replacement is not yet final and not\n    // implemented in any major browser. Only KeyPress has charCode.\n    if (event.type === 'keypress') {\n      return getEventCharCode(event);\n    }\n\n    return 0;\n  },\n  keyCode: function (event) {\n    // `keyCode` is the result of a KeyDown/Up event and represents the value of\n    // physical keyboard key.\n    // The actual meaning of the value depends on the users' keyboard layout\n    // which cannot be detected. Assuming that it is a US keyboard layout\n    // provides a surprisingly accurate mapping for US and European users.\n    // Due to this, it is left to the user to implement at this time.\n    if (event.type === 'keydown' || event.type === 'keyup') {\n      return event.keyCode;\n    }\n\n    return 0;\n  },\n  which: function (event) {\n    // `which` is an alias for either `keyCode` or `charCode` depending on the\n    // type of the event.\n    if (event.type === 'keypress') {\n      return getEventCharCode(event);\n    }\n\n    if (event.type === 'keydown' || event.type === 'keyup') {\n      return event.keyCode;\n    }\n\n    return 0;\n  }\n});\n\n/**\n * @interface DragEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticDragEvent = SyntheticMouseEvent.extend({\n  dataTransfer: null\n});\n\n/**\n * @interface TouchEvent\n * @see http://www.w3.org/TR/touch-events/\n */\n\nvar SyntheticTouchEvent = SyntheticUIEvent.extend({\n  touches: null,\n  targetTouches: null,\n  changedTouches: null,\n  altKey: null,\n  metaKey: null,\n  ctrlKey: null,\n  shiftKey: null,\n  getModifierState: getEventModifierState\n});\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent\n */\n\nvar SyntheticTransitionEvent = SyntheticEvent.extend({\n  propertyName: null,\n  elapsedTime: null,\n  pseudoElement: null\n});\n\n/**\n * @interface WheelEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\n\nvar SyntheticWheelEvent = SyntheticMouseEvent.extend({\n  deltaX: function (event) {\n    return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).\n    'wheelDeltaX' in event ? -event.wheelDeltaX : 0;\n  },\n  deltaY: function (event) {\n    return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).\n    'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).\n    'wheelDelta' in event ? -event.wheelDelta : 0;\n  },\n  deltaZ: null,\n  // Browsers without \"deltaMode\" is reporting in raw wheel delta where one\n  // notch on the scroll is always +/- 120, roughly equivalent to pixels.\n  // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or\n  // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.\n  deltaMode: null\n});\n\nvar knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING];\nvar SimpleEventPlugin = {\n  // simpleEventPluginEventTypes gets populated from\n  // the DOMEventProperties module.\n  eventTypes: simpleEventPluginEventTypes,\n  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var dispatchConfig = topLevelEventsToDispatchConfig.get(topLevelType);\n\n    if (!dispatchConfig) {\n      return null;\n    }\n\n    var EventConstructor;\n\n    switch (topLevelType) {\n      case TOP_KEY_PRESS:\n        // Firefox creates a keypress event for function keys too. This removes\n        // the unwanted keypress events. Enter is however both printable and\n        // non-printable. One would expect Tab to be as well (but it isn't).\n        if (getEventCharCode(nativeEvent) === 0) {\n          return null;\n        }\n\n      /* falls through */\n\n      case TOP_KEY_DOWN:\n      case TOP_KEY_UP:\n        EventConstructor = SyntheticKeyboardEvent;\n        break;\n\n      case TOP_BLUR:\n      case TOP_FOCUS:\n        EventConstructor = SyntheticFocusEvent;\n        break;\n\n      case TOP_CLICK:\n        // Firefox creates a click event on right mouse clicks. This removes the\n        // unwanted click events.\n        if (nativeEvent.button === 2) {\n          return null;\n        }\n\n      /* falls through */\n\n      case TOP_AUX_CLICK:\n      case TOP_DOUBLE_CLICK:\n      case TOP_MOUSE_DOWN:\n      case TOP_MOUSE_MOVE:\n      case TOP_MOUSE_UP: // TODO: Disabled elements should not respond to mouse events\n\n      /* falls through */\n\n      case TOP_MOUSE_OUT:\n      case TOP_MOUSE_OVER:\n      case TOP_CONTEXT_MENU:\n        EventConstructor = SyntheticMouseEvent;\n        break;\n\n      case TOP_DRAG:\n      case TOP_DRAG_END:\n      case TOP_DRAG_ENTER:\n      case TOP_DRAG_EXIT:\n      case TOP_DRAG_LEAVE:\n      case TOP_DRAG_OVER:\n      case TOP_DRAG_START:\n      case TOP_DROP:\n        EventConstructor = SyntheticDragEvent;\n        break;\n\n      case TOP_TOUCH_CANCEL:\n      case TOP_TOUCH_END:\n      case TOP_TOUCH_MOVE:\n      case TOP_TOUCH_START:\n        EventConstructor = SyntheticTouchEvent;\n        break;\n\n      case TOP_ANIMATION_END:\n      case TOP_ANIMATION_ITERATION:\n      case TOP_ANIMATION_START:\n        EventConstructor = SyntheticAnimationEvent;\n        break;\n\n      case TOP_TRANSITION_END:\n        EventConstructor = SyntheticTransitionEvent;\n        break;\n\n      case TOP_SCROLL:\n        EventConstructor = SyntheticUIEvent;\n        break;\n\n      case TOP_WHEEL:\n        EventConstructor = SyntheticWheelEvent;\n        break;\n\n      case TOP_COPY:\n      case TOP_CUT:\n      case TOP_PASTE:\n        EventConstructor = SyntheticClipboardEvent;\n        break;\n\n      case TOP_GOT_POINTER_CAPTURE:\n      case TOP_LOST_POINTER_CAPTURE:\n      case TOP_POINTER_CANCEL:\n      case TOP_POINTER_DOWN:\n      case TOP_POINTER_MOVE:\n      case TOP_POINTER_OUT:\n      case TOP_POINTER_OVER:\n      case TOP_POINTER_UP:\n        EventConstructor = SyntheticPointerEvent;\n        break;\n\n      default:\n        {\n          if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {\n            error('SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType);\n          }\n        } // HTML Events\n        // @see http://www.w3.org/TR/html5/index.html#events-0\n\n\n        EventConstructor = SyntheticEvent;\n        break;\n    }\n\n    var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);\n    accumulateTwoPhaseDispatches(event);\n    return event;\n  }\n};\n\n/**\n * Specifies a deterministic ordering of `EventPlugin`s. A convenient way to\n * reason about plugins, without having to package every one of them. This\n * is better than having plugins be ordered in the same order that they\n * are injected because that ordering would be influenced by the packaging order.\n * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that\n * preventing default on events is convenient in `SimpleEventPlugin` handlers.\n */\n\nvar DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];\n/**\n * Inject modules for resolving DOM hierarchy and plugin ordering.\n */\n\ninjectEventPluginOrder(DOMEventPluginOrder);\nsetComponentTree(getFiberCurrentPropsFromNode$1, getInstanceFromNode$1, getNodeFromInstance$1);\n/**\n * Some important event plugins included by default (without having to require\n * them).\n */\n\ninjectEventPluginsByName({\n  SimpleEventPlugin: SimpleEventPlugin,\n  EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n  ChangeEventPlugin: ChangeEventPlugin,\n  SelectEventPlugin: SelectEventPlugin,\n  BeforeInputEventPlugin: BeforeInputEventPlugin\n});\n\n// Prefix measurements so that it's possible to filter them.\n// Longer prefixes are hard to read in DevTools.\nvar reactEmoji = \"\\u269B\";\nvar warningEmoji = \"\\u26D4\";\nvar supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function'; // Keep track of current fiber so that we know the path to unwind on pause.\n// TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?\n\nvar currentFiber = null; // If we're in the middle of user code, which fiber and method is it?\n// Reusing `currentFiber` would be confusing for this because user code fiber\n// can change during commit phase too, but we don't need to unwind it (since\n// lifecycles in the commit phase don't resemble a tree).\n\nvar currentPhase = null;\nvar currentPhaseFiber = null; // Did lifecycle hook schedule an update? This is often a performance problem,\n// so we will keep track of it, and include it in the report.\n// Track commits caused by cascading updates.\n\nvar isCommitting = false;\nvar hasScheduledUpdateInCurrentCommit = false;\nvar hasScheduledUpdateInCurrentPhase = false;\nvar commitCountInCurrentWorkLoop = 0;\nvar effectCountInCurrentCommit = 0;\n// to avoid stretch the commit phase with measurement overhead.\n\nvar labelsInCurrentCommit = new Set();\n\nvar formatMarkName = function (markName) {\n  return reactEmoji + \" \" + markName;\n};\n\nvar formatLabel = function (label, warning) {\n  var prefix = warning ? warningEmoji + \" \" : reactEmoji + \" \";\n  var suffix = warning ? \" Warning: \" + warning : '';\n  return \"\" + prefix + label + suffix;\n};\n\nvar beginMark = function (markName) {\n  performance.mark(formatMarkName(markName));\n};\n\nvar clearMark = function (markName) {\n  performance.clearMarks(formatMarkName(markName));\n};\n\nvar endMark = function (label, markName, warning) {\n  var formattedMarkName = formatMarkName(markName);\n  var formattedLabel = formatLabel(label, warning);\n\n  try {\n    performance.measure(formattedLabel, formattedMarkName);\n  } catch (err) {} // If previous mark was missing for some reason, this will throw.\n  // This could only happen if React crashed in an unexpected place earlier.\n  // Don't pile on with more errors.\n  // Clear marks immediately to avoid growing buffer.\n\n\n  performance.clearMarks(formattedMarkName);\n  performance.clearMeasures(formattedLabel);\n};\n\nvar getFiberMarkName = function (label, debugID) {\n  return label + \" (#\" + debugID + \")\";\n};\n\nvar getFiberLabel = function (componentName, isMounted, phase) {\n  if (phase === null) {\n    // These are composite component total time measurements.\n    return componentName + \" [\" + (isMounted ? 'update' : 'mount') + \"]\";\n  } else {\n    // Composite component methods.\n    return componentName + \".\" + phase;\n  }\n};\n\nvar beginFiberMark = function (fiber, phase) {\n  var componentName = getComponentName(fiber.type) || 'Unknown';\n  var debugID = fiber._debugID;\n  var isMounted = fiber.alternate !== null;\n  var label = getFiberLabel(componentName, isMounted, phase);\n\n  if (isCommitting && labelsInCurrentCommit.has(label)) {\n    // During the commit phase, we don't show duplicate labels because\n    // there is a fixed overhead for every measurement, and we don't\n    // want to stretch the commit phase beyond necessary.\n    return false;\n  }\n\n  labelsInCurrentCommit.add(label);\n  var markName = getFiberMarkName(label, debugID);\n  beginMark(markName);\n  return true;\n};\n\nvar clearFiberMark = function (fiber, phase) {\n  var componentName = getComponentName(fiber.type) || 'Unknown';\n  var debugID = fiber._debugID;\n  var isMounted = fiber.alternate !== null;\n  var label = getFiberLabel(componentName, isMounted, phase);\n  var markName = getFiberMarkName(label, debugID);\n  clearMark(markName);\n};\n\nvar endFiberMark = function (fiber, phase, warning) {\n  var componentName = getComponentName(fiber.type) || 'Unknown';\n  var debugID = fiber._debugID;\n  var isMounted = fiber.alternate !== null;\n  var label = getFiberLabel(componentName, isMounted, phase);\n  var markName = getFiberMarkName(label, debugID);\n  endMark(label, markName, warning);\n};\n\nvar shouldIgnoreFiber = function (fiber) {\n  // Host components should be skipped in the timeline.\n  // We could check typeof fiber.type, but does this work with RN?\n  switch (fiber.tag) {\n    case HostRoot:\n    case HostComponent:\n    case HostText:\n    case HostPortal:\n    case Fragment:\n    case ContextProvider:\n    case ContextConsumer:\n    case Mode:\n      return true;\n\n    default:\n      return false;\n  }\n};\n\nvar clearPendingPhaseMeasurement = function () {\n  if (currentPhase !== null && currentPhaseFiber !== null) {\n    clearFiberMark(currentPhaseFiber, currentPhase);\n  }\n\n  currentPhaseFiber = null;\n  currentPhase = null;\n  hasScheduledUpdateInCurrentPhase = false;\n};\n\nvar pauseTimers = function () {\n  // Stops all currently active measurements so that they can be resumed\n  // if we continue in a later deferred loop from the same unit of work.\n  var fiber = currentFiber;\n\n  while (fiber) {\n    if (fiber._debugIsCurrentlyTiming) {\n      endFiberMark(fiber, null, null);\n    }\n\n    fiber = fiber.return;\n  }\n};\n\nvar resumeTimersRecursively = function (fiber) {\n  if (fiber.return !== null) {\n    resumeTimersRecursively(fiber.return);\n  }\n\n  if (fiber._debugIsCurrentlyTiming) {\n    beginFiberMark(fiber, null);\n  }\n};\n\nvar resumeTimers = function () {\n  // Resumes all measurements that were active during the last deferred loop.\n  if (currentFiber !== null) {\n    resumeTimersRecursively(currentFiber);\n  }\n};\n\nfunction recordEffect() {\n  {\n    effectCountInCurrentCommit++;\n  }\n}\nfunction recordScheduleUpdate() {\n  {\n    if (isCommitting) {\n      hasScheduledUpdateInCurrentCommit = true;\n    }\n\n    if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {\n      hasScheduledUpdateInCurrentPhase = true;\n    }\n  }\n}\nfunction startWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // If we pause, this is the fiber to unwind from.\n\n\n    currentFiber = fiber;\n\n    if (!beginFiberMark(fiber, null)) {\n      return;\n    }\n\n    fiber._debugIsCurrentlyTiming = true;\n  }\n}\nfunction cancelWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // Remember we shouldn't complete measurement for this fiber.\n    // Otherwise flamechart will be deep even for small updates.\n\n\n    fiber._debugIsCurrentlyTiming = false;\n    clearFiberMark(fiber, null);\n  }\n}\nfunction stopWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // If we pause, its parent is the fiber to unwind from.\n\n\n    currentFiber = fiber.return;\n\n    if (!fiber._debugIsCurrentlyTiming) {\n      return;\n    }\n\n    fiber._debugIsCurrentlyTiming = false;\n    endFiberMark(fiber, null, null);\n  }\n}\nfunction stopFailedWorkTimer(fiber) {\n  {\n    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n      return;\n    } // If we pause, its parent is the fiber to unwind from.\n\n\n    currentFiber = fiber.return;\n\n    if (!fiber._debugIsCurrentlyTiming) {\n      return;\n    }\n\n    fiber._debugIsCurrentlyTiming = false;\n    var warning = fiber.tag === SuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary';\n    endFiberMark(fiber, null, warning);\n  }\n}\nfunction startPhaseTimer(fiber, phase) {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    clearPendingPhaseMeasurement();\n\n    if (!beginFiberMark(fiber, phase)) {\n      return;\n    }\n\n    currentPhaseFiber = fiber;\n    currentPhase = phase;\n  }\n}\nfunction stopPhaseTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    if (currentPhase !== null && currentPhaseFiber !== null) {\n      var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;\n      endFiberMark(currentPhaseFiber, currentPhase, warning);\n    }\n\n    currentPhase = null;\n    currentPhaseFiber = null;\n  }\n}\nfunction startWorkLoopTimer(nextUnitOfWork) {\n  {\n    currentFiber = nextUnitOfWork;\n\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    commitCountInCurrentWorkLoop = 0; // This is top level call.\n    // Any other measurements are performed within.\n\n    beginMark('(React Tree Reconciliation)'); // Resume any measurements that were in progress during the last loop.\n\n    resumeTimers();\n  }\n}\nfunction stopWorkLoopTimer(interruptedBy, didCompleteRoot) {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var warning = null;\n\n    if (interruptedBy !== null) {\n      if (interruptedBy.tag === HostRoot) {\n        warning = 'A top-level update interrupted the previous render';\n      } else {\n        var componentName = getComponentName(interruptedBy.type) || 'Unknown';\n        warning = \"An update to \" + componentName + \" interrupted the previous render\";\n      }\n    } else if (commitCountInCurrentWorkLoop > 1) {\n      warning = 'There were cascading updates';\n    }\n\n    commitCountInCurrentWorkLoop = 0;\n    var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)'; // Pause any measurements until the next loop.\n\n    pauseTimers();\n    endMark(label, '(React Tree Reconciliation)', warning);\n  }\n}\nfunction startCommitTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    isCommitting = true;\n    hasScheduledUpdateInCurrentCommit = false;\n    labelsInCurrentCommit.clear();\n    beginMark('(Committing Changes)');\n  }\n}\nfunction stopCommitTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var warning = null;\n\n    if (hasScheduledUpdateInCurrentCommit) {\n      warning = 'Lifecycle hook scheduled a cascading update';\n    } else if (commitCountInCurrentWorkLoop > 0) {\n      warning = 'Caused by a cascading update in earlier commit';\n    }\n\n    hasScheduledUpdateInCurrentCommit = false;\n    commitCountInCurrentWorkLoop++;\n    isCommitting = false;\n    labelsInCurrentCommit.clear();\n    endMark('(Committing Changes)', '(Committing Changes)', warning);\n  }\n}\nfunction startCommitSnapshotEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    effectCountInCurrentCommit = 0;\n    beginMark('(Committing Snapshot Effects)');\n  }\n}\nfunction stopCommitSnapshotEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var count = effectCountInCurrentCommit;\n    effectCountInCurrentCommit = 0;\n    endMark(\"(Committing Snapshot Effects: \" + count + \" Total)\", '(Committing Snapshot Effects)', null);\n  }\n}\nfunction startCommitHostEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    effectCountInCurrentCommit = 0;\n    beginMark('(Committing Host Effects)');\n  }\n}\nfunction stopCommitHostEffectsTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var count = effectCountInCurrentCommit;\n    effectCountInCurrentCommit = 0;\n    endMark(\"(Committing Host Effects: \" + count + \" Total)\", '(Committing Host Effects)', null);\n  }\n}\nfunction startCommitLifeCyclesTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    effectCountInCurrentCommit = 0;\n    beginMark('(Calling Lifecycle Methods)');\n  }\n}\nfunction stopCommitLifeCyclesTimer() {\n  {\n    if (!supportsUserTiming) {\n      return;\n    }\n\n    var count = effectCountInCurrentCommit;\n    effectCountInCurrentCommit = 0;\n    endMark(\"(Calling Lifecycle Methods: \" + count + \" Total)\", '(Calling Lifecycle Methods)', null);\n  }\n}\n\nvar valueStack = [];\nvar fiberStack;\n\n{\n  fiberStack = [];\n}\n\nvar index = -1;\n\nfunction createCursor(defaultValue) {\n  return {\n    current: defaultValue\n  };\n}\n\nfunction pop(cursor, fiber) {\n  if (index < 0) {\n    {\n      error('Unexpected pop.');\n    }\n\n    return;\n  }\n\n  {\n    if (fiber !== fiberStack[index]) {\n      error('Unexpected Fiber popped.');\n    }\n  }\n\n  cursor.current = valueStack[index];\n  valueStack[index] = null;\n\n  {\n    fiberStack[index] = null;\n  }\n\n  index--;\n}\n\nfunction push(cursor, value, fiber) {\n  index++;\n  valueStack[index] = cursor.current;\n\n  {\n    fiberStack[index] = fiber;\n  }\n\n  cursor.current = value;\n}\n\nvar warnedAboutMissingGetChildContext;\n\n{\n  warnedAboutMissingGetChildContext = {};\n}\n\nvar emptyContextObject = {};\n\n{\n  Object.freeze(emptyContextObject);\n} // A cursor to the current merged context object on the stack.\n\n\nvar contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed.\n\nvar didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack.\n// We use this to get access to the parent context after we have already\n// pushed the next context provider, and now need to merge their contexts.\n\nvar previousContext = emptyContextObject;\n\nfunction getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {\n  {\n    if (didPushOwnContextIfProvider && isContextProvider(Component)) {\n      // If the fiber is a context provider itself, when we read its context\n      // we may have already pushed its own child context on the stack. A context\n      // provider should not \"see\" its own child context. Therefore we read the\n      // previous (parent) context instead for a context provider.\n      return previousContext;\n    }\n\n    return contextStackCursor.current;\n  }\n}\n\nfunction cacheContext(workInProgress, unmaskedContext, maskedContext) {\n  {\n    var instance = workInProgress.stateNode;\n    instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;\n    instance.__reactInternalMemoizedMaskedChildContext = maskedContext;\n  }\n}\n\nfunction getMaskedContext(workInProgress, unmaskedContext) {\n  {\n    var type = workInProgress.type;\n    var contextTypes = type.contextTypes;\n\n    if (!contextTypes) {\n      return emptyContextObject;\n    } // Avoid recreating masked context unless unmasked context has changed.\n    // Failing to do this will result in unnecessary calls to componentWillReceiveProps.\n    // This may trigger infinite loops if componentWillReceiveProps calls setState.\n\n\n    var instance = workInProgress.stateNode;\n\n    if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {\n      return instance.__reactInternalMemoizedMaskedChildContext;\n    }\n\n    var context = {};\n\n    for (var key in contextTypes) {\n      context[key] = unmaskedContext[key];\n    }\n\n    {\n      var name = getComponentName(type) || 'Unknown';\n      checkPropTypes(contextTypes, context, 'context', name, getCurrentFiberStackInDev);\n    } // Cache unmasked context so we can avoid recreating masked context unless necessary.\n    // Context is created before the class component is instantiated so check for instance.\n\n\n    if (instance) {\n      cacheContext(workInProgress, unmaskedContext, context);\n    }\n\n    return context;\n  }\n}\n\nfunction hasContextChanged() {\n  {\n    return didPerformWorkStackCursor.current;\n  }\n}\n\nfunction isContextProvider(type) {\n  {\n    var childContextTypes = type.childContextTypes;\n    return childContextTypes !== null && childContextTypes !== undefined;\n  }\n}\n\nfunction popContext(fiber) {\n  {\n    pop(didPerformWorkStackCursor, fiber);\n    pop(contextStackCursor, fiber);\n  }\n}\n\nfunction popTopLevelContextObject(fiber) {\n  {\n    pop(didPerformWorkStackCursor, fiber);\n    pop(contextStackCursor, fiber);\n  }\n}\n\nfunction pushTopLevelContextObject(fiber, context, didChange) {\n  {\n    if (!(contextStackCursor.current === emptyContextObject)) {\n      {\n        throw Error( \"Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    push(contextStackCursor, context, fiber);\n    push(didPerformWorkStackCursor, didChange, fiber);\n  }\n}\n\nfunction processChildContext(fiber, type, parentContext) {\n  {\n    var instance = fiber.stateNode;\n    var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future.\n    // It has only been added in Fiber to match the (unintentional) behavior in Stack.\n\n    if (typeof instance.getChildContext !== 'function') {\n      {\n        var componentName = getComponentName(type) || 'Unknown';\n\n        if (!warnedAboutMissingGetChildContext[componentName]) {\n          warnedAboutMissingGetChildContext[componentName] = true;\n\n          error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);\n        }\n      }\n\n      return parentContext;\n    }\n\n    var childContext;\n    startPhaseTimer(fiber, 'getChildContext');\n    childContext = instance.getChildContext();\n    stopPhaseTimer();\n\n    for (var contextKey in childContext) {\n      if (!(contextKey in childContextTypes)) {\n        {\n          throw Error( (getComponentName(type) || 'Unknown') + \".getChildContext(): key \\\"\" + contextKey + \"\\\" is not defined in childContextTypes.\" );\n        }\n      }\n    }\n\n    {\n      var name = getComponentName(type) || 'Unknown';\n      checkPropTypes(childContextTypes, childContext, 'child context', name, // In practice, there is one case in which we won't get a stack. It's when\n      // somebody calls unstable_renderSubtreeIntoContainer() and we process\n      // context from the parent component instance. The stack will be missing\n      // because it's outside of the reconciliation, and so the pointer has not\n      // been set. This is rare and doesn't matter. We'll also remove that API.\n      getCurrentFiberStackInDev);\n    }\n\n    return _assign({}, parentContext, {}, childContext);\n  }\n}\n\nfunction pushContextProvider(workInProgress) {\n  {\n    var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity.\n    // If the instance does not exist yet, we will push null at first,\n    // and replace it on the stack later when invalidating the context.\n\n    var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later.\n    // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.\n\n    previousContext = contextStackCursor.current;\n    push(contextStackCursor, memoizedMergedChildContext, workInProgress);\n    push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);\n    return true;\n  }\n}\n\nfunction invalidateContextProvider(workInProgress, type, didChange) {\n  {\n    var instance = workInProgress.stateNode;\n\n    if (!instance) {\n      {\n        throw Error( \"Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    if (didChange) {\n      // Merge parent and own context.\n      // Skip this if we're not updating due to sCU.\n      // This avoids unnecessarily recomputing memoized values.\n      var mergedContext = processChildContext(workInProgress, type, previousContext);\n      instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one.\n      // It is important to unwind the context in the reverse order.\n\n      pop(didPerformWorkStackCursor, workInProgress);\n      pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed.\n\n      push(contextStackCursor, mergedContext, workInProgress);\n      push(didPerformWorkStackCursor, didChange, workInProgress);\n    } else {\n      pop(didPerformWorkStackCursor, workInProgress);\n      push(didPerformWorkStackCursor, didChange, workInProgress);\n    }\n  }\n}\n\nfunction findCurrentUnmaskedContext(fiber) {\n  {\n    // Currently this is only used with renderSubtreeIntoContainer; not sure if it\n    // makes sense elsewhere\n    if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) {\n      {\n        throw Error( \"Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    var node = fiber;\n\n    do {\n      switch (node.tag) {\n        case HostRoot:\n          return node.stateNode.context;\n\n        case ClassComponent:\n          {\n            var Component = node.type;\n\n            if (isContextProvider(Component)) {\n              return node.stateNode.__reactInternalMemoizedMergedChildContext;\n            }\n\n            break;\n          }\n      }\n\n      node = node.return;\n    } while (node !== null);\n\n    {\n      {\n        throw Error( \"Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n}\n\nvar LegacyRoot = 0;\nvar BlockingRoot = 1;\nvar ConcurrentRoot = 2;\n\nvar Scheduler_runWithPriority = Scheduler.unstable_runWithPriority,\n    Scheduler_scheduleCallback = Scheduler.unstable_scheduleCallback,\n    Scheduler_cancelCallback = Scheduler.unstable_cancelCallback,\n    Scheduler_shouldYield = Scheduler.unstable_shouldYield,\n    Scheduler_requestPaint = Scheduler.unstable_requestPaint,\n    Scheduler_now = Scheduler.unstable_now,\n    Scheduler_getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,\n    Scheduler_ImmediatePriority = Scheduler.unstable_ImmediatePriority,\n    Scheduler_UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n    Scheduler_NormalPriority = Scheduler.unstable_NormalPriority,\n    Scheduler_LowPriority = Scheduler.unstable_LowPriority,\n    Scheduler_IdlePriority = Scheduler.unstable_IdlePriority;\n\n{\n  // Provide explicit error message when production+profiling bundle of e.g.\n  // react-dom is used with production (non-profiling) bundle of\n  // scheduler/tracing\n  if (!(tracing.__interactionsRef != null && tracing.__interactionsRef.current != null)) {\n    {\n      throw Error( \"It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling\" );\n    }\n  }\n}\n\nvar fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use\n// ascending numbers so we can compare them like numbers. They start at 90 to\n// avoid clashing with Scheduler's priorities.\n\nvar ImmediatePriority = 99;\nvar UserBlockingPriority$1 = 98;\nvar NormalPriority = 97;\nvar LowPriority = 96;\nvar IdlePriority = 95; // NoPriority is the absence of priority. Also React-only.\n\nvar NoPriority = 90;\nvar shouldYield = Scheduler_shouldYield;\nvar requestPaint = // Fall back gracefully if we're running an older version of Scheduler.\nScheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {};\nvar syncQueue = null;\nvar immediateQueueCallbackNode = null;\nvar isFlushingSyncQueue = false;\nvar initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly.\n// This will be the case for modern browsers that support `performance.now`. In\n// older browsers, Scheduler falls back to `Date.now`, which returns a Unix\n// timestamp. In that case, subtract the module initialization time to simulate\n// the behavior of performance.now and keep our times small enough to fit\n// within 32 bits.\n// TODO: Consider lifting this into Scheduler.\n\nvar now = initialTimeMs < 10000 ? Scheduler_now : function () {\n  return Scheduler_now() - initialTimeMs;\n};\nfunction getCurrentPriorityLevel() {\n  switch (Scheduler_getCurrentPriorityLevel()) {\n    case Scheduler_ImmediatePriority:\n      return ImmediatePriority;\n\n    case Scheduler_UserBlockingPriority:\n      return UserBlockingPriority$1;\n\n    case Scheduler_NormalPriority:\n      return NormalPriority;\n\n    case Scheduler_LowPriority:\n      return LowPriority;\n\n    case Scheduler_IdlePriority:\n      return IdlePriority;\n\n    default:\n      {\n        {\n          throw Error( \"Unknown priority level.\" );\n        }\n      }\n\n  }\n}\n\nfunction reactPriorityToSchedulerPriority(reactPriorityLevel) {\n  switch (reactPriorityLevel) {\n    case ImmediatePriority:\n      return Scheduler_ImmediatePriority;\n\n    case UserBlockingPriority$1:\n      return Scheduler_UserBlockingPriority;\n\n    case NormalPriority:\n      return Scheduler_NormalPriority;\n\n    case LowPriority:\n      return Scheduler_LowPriority;\n\n    case IdlePriority:\n      return Scheduler_IdlePriority;\n\n    default:\n      {\n        {\n          throw Error( \"Unknown priority level.\" );\n        }\n      }\n\n  }\n}\n\nfunction runWithPriority$1(reactPriorityLevel, fn) {\n  var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);\n  return Scheduler_runWithPriority(priorityLevel, fn);\n}\nfunction scheduleCallback(reactPriorityLevel, callback, options) {\n  var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);\n  return Scheduler_scheduleCallback(priorityLevel, callback, options);\n}\nfunction scheduleSyncCallback(callback) {\n  // Push this callback into an internal queue. We'll flush these either in\n  // the next tick, or earlier if something calls `flushSyncCallbackQueue`.\n  if (syncQueue === null) {\n    syncQueue = [callback]; // Flush the queue in the next tick, at the earliest.\n\n    immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl);\n  } else {\n    // Push onto existing queue. Don't need to schedule a callback because\n    // we already scheduled one when we created the queue.\n    syncQueue.push(callback);\n  }\n\n  return fakeCallbackNode;\n}\nfunction cancelCallback(callbackNode) {\n  if (callbackNode !== fakeCallbackNode) {\n    Scheduler_cancelCallback(callbackNode);\n  }\n}\nfunction flushSyncCallbackQueue() {\n  if (immediateQueueCallbackNode !== null) {\n    var node = immediateQueueCallbackNode;\n    immediateQueueCallbackNode = null;\n    Scheduler_cancelCallback(node);\n  }\n\n  flushSyncCallbackQueueImpl();\n}\n\nfunction flushSyncCallbackQueueImpl() {\n  if (!isFlushingSyncQueue && syncQueue !== null) {\n    // Prevent re-entrancy.\n    isFlushingSyncQueue = true;\n    var i = 0;\n\n    try {\n      var _isSync = true;\n      var queue = syncQueue;\n      runWithPriority$1(ImmediatePriority, function () {\n        for (; i < queue.length; i++) {\n          var callback = queue[i];\n\n          do {\n            callback = callback(_isSync);\n          } while (callback !== null);\n        }\n      });\n      syncQueue = null;\n    } catch (error) {\n      // If something throws, leave the remaining callbacks on the queue.\n      if (syncQueue !== null) {\n        syncQueue = syncQueue.slice(i + 1);\n      } // Resume flushing in the next tick\n\n\n      Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue);\n      throw error;\n    } finally {\n      isFlushingSyncQueue = false;\n    }\n  }\n}\n\nvar NoMode = 0;\nvar StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root\n// tag instead\n\nvar BlockingMode = 2;\nvar ConcurrentMode = 4;\nvar ProfileMode = 8;\n\n// Max 31 bit integer. The max integer size in V8 for 32-bit systems.\n// Math.pow(2, 30) - 1\n// 0b111111111111111111111111111111\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\n\nvar NoWork = 0; // TODO: Think of a better name for Never. The key difference with Idle is that\n// Never work can be committed in an inconsistent state without tearing the UI.\n// The main example is offscreen content, like a hidden subtree. So one possible\n// name is Offscreen. However, it also includes dehydrated Suspense boundaries,\n// which are inconsistent in the sense that they haven't finished yet, but\n// aren't visibly inconsistent because the server rendered HTML matches what the\n// hydrated tree would look like.\n\nvar Never = 1; // Idle is slightly higher priority than Never. It must completely finish in\n// order to be consistent.\n\nvar Idle = 2; // Continuous Hydration is slightly higher than Idle and is used to increase\n// priority of hover targets.\n\nvar ContinuousHydration = 3;\nvar Sync = MAX_SIGNED_31_BIT_INT;\nvar Batched = Sync - 1;\nvar UNIT_SIZE = 10;\nvar MAGIC_NUMBER_OFFSET = Batched - 1; // 1 unit of expiration time represents 10ms.\n\nfunction msToExpirationTime(ms) {\n  // Always subtract from the offset so that we don't clash with the magic number for NoWork.\n  return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0);\n}\nfunction expirationTimeToMs(expirationTime) {\n  return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE;\n}\n\nfunction ceiling(num, precision) {\n  return ((num / precision | 0) + 1) * precision;\n}\n\nfunction computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {\n  return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);\n} // TODO: This corresponds to Scheduler's NormalPriority, not LowPriority. Update\n// the names to reflect.\n\n\nvar LOW_PRIORITY_EXPIRATION = 5000;\nvar LOW_PRIORITY_BATCH_SIZE = 250;\nfunction computeAsyncExpiration(currentTime) {\n  return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE);\n}\nfunction computeSuspenseExpiration(currentTime, timeoutMs) {\n  // TODO: Should we warn if timeoutMs is lower than the normal pri expiration time?\n  return computeExpirationBucket(currentTime, timeoutMs, LOW_PRIORITY_BATCH_SIZE);\n} // We intentionally set a higher expiration time for interactive updates in\n// dev than in production.\n//\n// If the main thread is being blocked so long that you hit the expiration,\n// it's a problem that could be solved with better scheduling.\n//\n// People will be more likely to notice this and fix it with the long\n// expiration time in development.\n//\n// In production we opt for better UX at the risk of masking scheduling\n// problems, by expiring fast.\n\nvar HIGH_PRIORITY_EXPIRATION =  500 ;\nvar HIGH_PRIORITY_BATCH_SIZE = 100;\nfunction computeInteractiveExpiration(currentTime) {\n  return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE);\n}\nfunction inferPriorityFromExpirationTime(currentTime, expirationTime) {\n  if (expirationTime === Sync) {\n    return ImmediatePriority;\n  }\n\n  if (expirationTime === Never || expirationTime === Idle) {\n    return IdlePriority;\n  }\n\n  var msUntil = expirationTimeToMs(expirationTime) - expirationTimeToMs(currentTime);\n\n  if (msUntil <= 0) {\n    return ImmediatePriority;\n  }\n\n  if (msUntil <= HIGH_PRIORITY_EXPIRATION + HIGH_PRIORITY_BATCH_SIZE) {\n    return UserBlockingPriority$1;\n  }\n\n  if (msUntil <= LOW_PRIORITY_EXPIRATION + LOW_PRIORITY_BATCH_SIZE) {\n    return NormalPriority;\n  } // TODO: Handle LowPriority\n  // Assume anything lower has idle priority\n\n\n  return IdlePriority;\n}\n\nvar ReactStrictModeWarnings = {\n  recordUnsafeLifecycleWarnings: function (fiber, instance) {},\n  flushPendingUnsafeLifecycleWarnings: function () {},\n  recordLegacyContextWarning: function (fiber, instance) {},\n  flushLegacyContextWarning: function () {},\n  discardPendingWarnings: function () {}\n};\n\n{\n  var findStrictRoot = function (fiber) {\n    var maybeStrictRoot = null;\n    var node = fiber;\n\n    while (node !== null) {\n      if (node.mode & StrictMode) {\n        maybeStrictRoot = node;\n      }\n\n      node = node.return;\n    }\n\n    return maybeStrictRoot;\n  };\n\n  var setToSortedString = function (set) {\n    var array = [];\n    set.forEach(function (value) {\n      array.push(value);\n    });\n    return array.sort().join(', ');\n  };\n\n  var pendingComponentWillMountWarnings = [];\n  var pendingUNSAFE_ComponentWillMountWarnings = [];\n  var pendingComponentWillReceivePropsWarnings = [];\n  var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n  var pendingComponentWillUpdateWarnings = [];\n  var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about.\n\n  var didWarnAboutUnsafeLifecycles = new Set();\n\n  ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {\n    // Dedup strategy: Warn once per component.\n    if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {\n      return;\n    }\n\n    if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components.\n    instance.componentWillMount.__suppressDeprecationWarning !== true) {\n      pendingComponentWillMountWarnings.push(fiber);\n    }\n\n    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') {\n      pendingUNSAFE_ComponentWillMountWarnings.push(fiber);\n    }\n\n    if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {\n      pendingComponentWillReceivePropsWarnings.push(fiber);\n    }\n\n    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n      pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);\n    }\n\n    if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {\n      pendingComponentWillUpdateWarnings.push(fiber);\n    }\n\n    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') {\n      pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);\n    }\n  };\n\n  ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {\n    // We do an initial pass to gather component names\n    var componentWillMountUniqueNames = new Set();\n\n    if (pendingComponentWillMountWarnings.length > 0) {\n      pendingComponentWillMountWarnings.forEach(function (fiber) {\n        componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingComponentWillMountWarnings = [];\n    }\n\n    var UNSAFE_componentWillMountUniqueNames = new Set();\n\n    if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {\n      pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) {\n        UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingUNSAFE_ComponentWillMountWarnings = [];\n    }\n\n    var componentWillReceivePropsUniqueNames = new Set();\n\n    if (pendingComponentWillReceivePropsWarnings.length > 0) {\n      pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {\n        componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingComponentWillReceivePropsWarnings = [];\n    }\n\n    var UNSAFE_componentWillReceivePropsUniqueNames = new Set();\n\n    if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {\n      pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) {\n        UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n    }\n\n    var componentWillUpdateUniqueNames = new Set();\n\n    if (pendingComponentWillUpdateWarnings.length > 0) {\n      pendingComponentWillUpdateWarnings.forEach(function (fiber) {\n        componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingComponentWillUpdateWarnings = [];\n    }\n\n    var UNSAFE_componentWillUpdateUniqueNames = new Set();\n\n    if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {\n      pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) {\n        UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutUnsafeLifecycles.add(fiber.type);\n      });\n      pendingUNSAFE_ComponentWillUpdateWarnings = [];\n    } // Finally, we flush all the warnings\n    // UNSAFE_ ones before the deprecated ones, since they'll be 'louder'\n\n\n    if (UNSAFE_componentWillMountUniqueNames.size > 0) {\n      var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);\n\n      error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\\n' + '\\nPlease update the following components: %s', sortedNames);\n    }\n\n    if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {\n      var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);\n\n      error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + \"* If you're updating state whenever props change, \" + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\\n' + '\\nPlease update the following components: %s', _sortedNames);\n    }\n\n    if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {\n      var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);\n\n      error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + '\\nPlease update the following components: %s', _sortedNames2);\n    }\n\n    if (componentWillMountUniqueNames.size > 0) {\n      var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);\n\n      warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames3);\n    }\n\n    if (componentWillReceivePropsUniqueNames.size > 0) {\n      var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);\n\n      warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + \"* If you're updating state whenever props change, refactor your \" + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames4);\n    }\n\n    if (componentWillUpdateUniqueNames.size > 0) {\n      var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);\n\n      warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames5);\n    }\n  };\n\n  var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about.\n\n  var didWarnAboutLegacyContext = new Set();\n\n  ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {\n    var strictRoot = findStrictRoot(fiber);\n\n    if (strictRoot === null) {\n      error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');\n\n      return;\n    } // Dedup strategy: Warn once per component.\n\n\n    if (didWarnAboutLegacyContext.has(fiber.type)) {\n      return;\n    }\n\n    var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);\n\n    if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {\n      if (warningsForRoot === undefined) {\n        warningsForRoot = [];\n        pendingLegacyContextWarning.set(strictRoot, warningsForRoot);\n      }\n\n      warningsForRoot.push(fiber);\n    }\n  };\n\n  ReactStrictModeWarnings.flushLegacyContextWarning = function () {\n    pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {\n      if (fiberArray.length === 0) {\n        return;\n      }\n\n      var firstFiber = fiberArray[0];\n      var uniqueNames = new Set();\n      fiberArray.forEach(function (fiber) {\n        uniqueNames.add(getComponentName(fiber.type) || 'Component');\n        didWarnAboutLegacyContext.add(fiber.type);\n      });\n      var sortedNames = setToSortedString(uniqueNames);\n      var firstComponentStack = getStackByFiberInDevAndProd(firstFiber);\n\n      error('Legacy context API has been detected within a strict-mode tree.' + '\\n\\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\\n\\nPlease update the following components: %s' + '\\n\\nLearn more about this warning here: https://fb.me/react-legacy-context' + '%s', sortedNames, firstComponentStack);\n    });\n  };\n\n  ReactStrictModeWarnings.discardPendingWarnings = function () {\n    pendingComponentWillMountWarnings = [];\n    pendingUNSAFE_ComponentWillMountWarnings = [];\n    pendingComponentWillReceivePropsWarnings = [];\n    pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n    pendingComponentWillUpdateWarnings = [];\n    pendingUNSAFE_ComponentWillUpdateWarnings = [];\n    pendingLegacyContextWarning = new Map();\n  };\n}\n\nvar resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below.\n\nvar failedBoundaries = null;\nvar setRefreshHandler = function (handler) {\n  {\n    resolveFamily = handler;\n  }\n};\nfunction resolveFunctionForHotReloading(type) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return type;\n    }\n\n    var family = resolveFamily(type);\n\n    if (family === undefined) {\n      return type;\n    } // Use the latest known implementation.\n\n\n    return family.current;\n  }\n}\nfunction resolveClassForHotReloading(type) {\n  // No implementation differences.\n  return resolveFunctionForHotReloading(type);\n}\nfunction resolveForwardRefForHotReloading(type) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return type;\n    }\n\n    var family = resolveFamily(type);\n\n    if (family === undefined) {\n      // Check if we're dealing with a real forwardRef. Don't want to crash early.\n      if (type !== null && type !== undefined && typeof type.render === 'function') {\n        // ForwardRef is special because its resolved .type is an object,\n        // but it's possible that we only have its inner render function in the map.\n        // If that inner render function is different, we'll build a new forwardRef type.\n        var currentRender = resolveFunctionForHotReloading(type.render);\n\n        if (type.render !== currentRender) {\n          var syntheticType = {\n            $$typeof: REACT_FORWARD_REF_TYPE,\n            render: currentRender\n          };\n\n          if (type.displayName !== undefined) {\n            syntheticType.displayName = type.displayName;\n          }\n\n          return syntheticType;\n        }\n      }\n\n      return type;\n    } // Use the latest known implementation.\n\n\n    return family.current;\n  }\n}\nfunction isCompatibleFamilyForHotReloading(fiber, element) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return false;\n    }\n\n    var prevType = fiber.elementType;\n    var nextType = element.type; // If we got here, we know types aren't === equal.\n\n    var needsCompareFamilies = false;\n    var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null;\n\n    switch (fiber.tag) {\n      case ClassComponent:\n        {\n          if (typeof nextType === 'function') {\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      case FunctionComponent:\n        {\n          if (typeof nextType === 'function') {\n            needsCompareFamilies = true;\n          } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n            // We don't know the inner type yet.\n            // We're going to assume that the lazy inner type is stable,\n            // and so it is sufficient to avoid reconciling it away.\n            // We're not going to unwrap or actually use the new lazy type.\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      case ForwardRef:\n        {\n          if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {\n            needsCompareFamilies = true;\n          } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      case MemoComponent:\n      case SimpleMemoComponent:\n        {\n          if ($$typeofNextType === REACT_MEMO_TYPE) {\n            // TODO: if it was but can no longer be simple,\n            // we shouldn't set this.\n            needsCompareFamilies = true;\n          } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n            needsCompareFamilies = true;\n          }\n\n          break;\n        }\n\n      default:\n        return false;\n    } // Check if both types have a family and it's the same one.\n\n\n    if (needsCompareFamilies) {\n      // Note: memo() and forwardRef() we'll compare outer rather than inner type.\n      // This means both of them need to be registered to preserve state.\n      // If we unwrapped and compared the inner types for wrappers instead,\n      // then we would risk falsely saying two separate memo(Foo)\n      // calls are equivalent because they wrap the same Foo function.\n      var prevFamily = resolveFamily(prevType);\n\n      if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\nfunction markFailedErrorBoundaryForHotReloading(fiber) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return;\n    }\n\n    if (typeof WeakSet !== 'function') {\n      return;\n    }\n\n    if (failedBoundaries === null) {\n      failedBoundaries = new WeakSet();\n    }\n\n    failedBoundaries.add(fiber);\n  }\n}\nvar scheduleRefresh = function (root, update) {\n  {\n    if (resolveFamily === null) {\n      // Hot reloading is disabled.\n      return;\n    }\n\n    var staleFamilies = update.staleFamilies,\n        updatedFamilies = update.updatedFamilies;\n    flushPassiveEffects();\n    flushSync(function () {\n      scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies);\n    });\n  }\n};\nvar scheduleRoot = function (root, element) {\n  {\n    if (root.context !== emptyContextObject) {\n      // Super edge case: root has a legacy _renderSubtree context\n      // but we don't know the parentComponent so we can't pass it.\n      // Just ignore. We'll delete this with _renderSubtree code path later.\n      return;\n    }\n\n    flushPassiveEffects();\n    syncUpdates(function () {\n      updateContainer(element, root, null, null);\n    });\n  }\n};\n\nfunction scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {\n  {\n    var alternate = fiber.alternate,\n        child = fiber.child,\n        sibling = fiber.sibling,\n        tag = fiber.tag,\n        type = fiber.type;\n    var candidateType = null;\n\n    switch (tag) {\n      case FunctionComponent:\n      case SimpleMemoComponent:\n      case ClassComponent:\n        candidateType = type;\n        break;\n\n      case ForwardRef:\n        candidateType = type.render;\n        break;\n    }\n\n    if (resolveFamily === null) {\n      throw new Error('Expected resolveFamily to be set during hot reload.');\n    }\n\n    var needsRender = false;\n    var needsRemount = false;\n\n    if (candidateType !== null) {\n      var family = resolveFamily(candidateType);\n\n      if (family !== undefined) {\n        if (staleFamilies.has(family)) {\n          needsRemount = true;\n        } else if (updatedFamilies.has(family)) {\n          if (tag === ClassComponent) {\n            needsRemount = true;\n          } else {\n            needsRender = true;\n          }\n        }\n      }\n    }\n\n    if (failedBoundaries !== null) {\n      if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {\n        needsRemount = true;\n      }\n    }\n\n    if (needsRemount) {\n      fiber._debugNeedsRemount = true;\n    }\n\n    if (needsRemount || needsRender) {\n      scheduleWork(fiber, Sync);\n    }\n\n    if (child !== null && !needsRemount) {\n      scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);\n    }\n\n    if (sibling !== null) {\n      scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);\n    }\n  }\n}\n\nvar findHostInstancesForRefresh = function (root, families) {\n  {\n    var hostInstances = new Set();\n    var types = new Set(families.map(function (family) {\n      return family.current;\n    }));\n    findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances);\n    return hostInstances;\n  }\n};\n\nfunction findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {\n  {\n    var child = fiber.child,\n        sibling = fiber.sibling,\n        tag = fiber.tag,\n        type = fiber.type;\n    var candidateType = null;\n\n    switch (tag) {\n      case FunctionComponent:\n      case SimpleMemoComponent:\n      case ClassComponent:\n        candidateType = type;\n        break;\n\n      case ForwardRef:\n        candidateType = type.render;\n        break;\n    }\n\n    var didMatch = false;\n\n    if (candidateType !== null) {\n      if (types.has(candidateType)) {\n        didMatch = true;\n      }\n    }\n\n    if (didMatch) {\n      // We have a match. This only drills down to the closest host components.\n      // There's no need to search deeper because for the purpose of giving\n      // visual feedback, \"flashing\" outermost parent rectangles is sufficient.\n      findHostInstancesForFiberShallowly(fiber, hostInstances);\n    } else {\n      // If there's no match, maybe there will be one further down in the child tree.\n      if (child !== null) {\n        findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);\n      }\n    }\n\n    if (sibling !== null) {\n      findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);\n    }\n  }\n}\n\nfunction findHostInstancesForFiberShallowly(fiber, hostInstances) {\n  {\n    var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);\n\n    if (foundHostInstances) {\n      return;\n    } // If we didn't find any host children, fallback to closest host parent.\n\n\n    var node = fiber;\n\n    while (true) {\n      switch (node.tag) {\n        case HostComponent:\n          hostInstances.add(node.stateNode);\n          return;\n\n        case HostPortal:\n          hostInstances.add(node.stateNode.containerInfo);\n          return;\n\n        case HostRoot:\n          hostInstances.add(node.stateNode.containerInfo);\n          return;\n      }\n\n      if (node.return === null) {\n        throw new Error('Expected to reach root first.');\n      }\n\n      node = node.return;\n    }\n  }\n}\n\nfunction findChildHostInstancesForFiberShallowly(fiber, hostInstances) {\n  {\n    var node = fiber;\n    var foundHostInstances = false;\n\n    while (true) {\n      if (node.tag === HostComponent) {\n        // We got a match.\n        foundHostInstances = true;\n        hostInstances.add(node.stateNode); // There may still be more, so keep searching.\n      } else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === fiber) {\n        return foundHostInstances;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === fiber) {\n          return foundHostInstances;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n\n  return false;\n}\n\nfunction resolveDefaultProps(Component, baseProps) {\n  if (Component && Component.defaultProps) {\n    // Resolve default props. Taken from ReactElement\n    var props = _assign({}, baseProps);\n\n    var defaultProps = Component.defaultProps;\n\n    for (var propName in defaultProps) {\n      if (props[propName] === undefined) {\n        props[propName] = defaultProps[propName];\n      }\n    }\n\n    return props;\n  }\n\n  return baseProps;\n}\nfunction readLazyComponentType(lazyComponent) {\n  initializeLazyComponentType(lazyComponent);\n\n  if (lazyComponent._status !== Resolved) {\n    throw lazyComponent._result;\n  }\n\n  return lazyComponent._result;\n}\n\nvar valueCursor = createCursor(null);\nvar rendererSigil;\n\n{\n  // Use this to detect multiple renderers using the same context\n  rendererSigil = {};\n}\n\nvar currentlyRenderingFiber = null;\nvar lastContextDependency = null;\nvar lastContextWithAllBitsObserved = null;\nvar isDisallowedContextReadInDEV = false;\nfunction resetContextDependencies() {\n  // This is called right before React yields execution, to ensure `readContext`\n  // cannot be called outside the render phase.\n  currentlyRenderingFiber = null;\n  lastContextDependency = null;\n  lastContextWithAllBitsObserved = null;\n\n  {\n    isDisallowedContextReadInDEV = false;\n  }\n}\nfunction enterDisallowedContextReadInDEV() {\n  {\n    isDisallowedContextReadInDEV = true;\n  }\n}\nfunction exitDisallowedContextReadInDEV() {\n  {\n    isDisallowedContextReadInDEV = false;\n  }\n}\nfunction pushProvider(providerFiber, nextValue) {\n  var context = providerFiber.type._context;\n\n  {\n    push(valueCursor, context._currentValue, providerFiber);\n    context._currentValue = nextValue;\n\n    {\n      if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {\n        error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');\n      }\n\n      context._currentRenderer = rendererSigil;\n    }\n  }\n}\nfunction popProvider(providerFiber) {\n  var currentValue = valueCursor.current;\n  pop(valueCursor, providerFiber);\n  var context = providerFiber.type._context;\n\n  {\n    context._currentValue = currentValue;\n  }\n}\nfunction calculateChangedBits(context, newValue, oldValue) {\n  if (objectIs(oldValue, newValue)) {\n    // No change\n    return 0;\n  } else {\n    var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n\n    {\n      if ((changedBits & MAX_SIGNED_31_BIT_INT) !== changedBits) {\n        error('calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits);\n      }\n    }\n\n    return changedBits | 0;\n  }\n}\nfunction scheduleWorkOnParentPath(parent, renderExpirationTime) {\n  // Update the child expiration time of all the ancestors, including\n  // the alternates.\n  var node = parent;\n\n  while (node !== null) {\n    var alternate = node.alternate;\n\n    if (node.childExpirationTime < renderExpirationTime) {\n      node.childExpirationTime = renderExpirationTime;\n\n      if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {\n        alternate.childExpirationTime = renderExpirationTime;\n      }\n    } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {\n      alternate.childExpirationTime = renderExpirationTime;\n    } else {\n      // Neither alternate was updated, which means the rest of the\n      // ancestor path already has sufficient priority.\n      break;\n    }\n\n    node = node.return;\n  }\n}\nfunction propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {\n  var fiber = workInProgress.child;\n\n  if (fiber !== null) {\n    // Set the return pointer of the child to the work-in-progress fiber.\n    fiber.return = workInProgress;\n  }\n\n  while (fiber !== null) {\n    var nextFiber = void 0; // Visit this fiber.\n\n    var list = fiber.dependencies;\n\n    if (list !== null) {\n      nextFiber = fiber.child;\n      var dependency = list.firstContext;\n\n      while (dependency !== null) {\n        // Check if the context matches.\n        if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {\n          // Match! Schedule an update on this fiber.\n          if (fiber.tag === ClassComponent) {\n            // Schedule a force update on the work-in-progress.\n            var update = createUpdate(renderExpirationTime, null);\n            update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the\n            // update to the current fiber, too, which means it will persist even if\n            // this render is thrown away. Since it's a race condition, not sure it's\n            // worth fixing.\n\n            enqueueUpdate(fiber, update);\n          }\n\n          if (fiber.expirationTime < renderExpirationTime) {\n            fiber.expirationTime = renderExpirationTime;\n          }\n\n          var alternate = fiber.alternate;\n\n          if (alternate !== null && alternate.expirationTime < renderExpirationTime) {\n            alternate.expirationTime = renderExpirationTime;\n          }\n\n          scheduleWorkOnParentPath(fiber.return, renderExpirationTime); // Mark the expiration time on the list, too.\n\n          if (list.expirationTime < renderExpirationTime) {\n            list.expirationTime = renderExpirationTime;\n          } // Since we already found a match, we can stop traversing the\n          // dependency list.\n\n\n          break;\n        }\n\n        dependency = dependency.next;\n      }\n    } else if (fiber.tag === ContextProvider) {\n      // Don't scan deeper if this is a matching provider\n      nextFiber = fiber.type === workInProgress.type ? null : fiber.child;\n    } else {\n      // Traverse down.\n      nextFiber = fiber.child;\n    }\n\n    if (nextFiber !== null) {\n      // Set the return pointer of the child to the work-in-progress fiber.\n      nextFiber.return = fiber;\n    } else {\n      // No child. Traverse to next sibling.\n      nextFiber = fiber;\n\n      while (nextFiber !== null) {\n        if (nextFiber === workInProgress) {\n          // We're back to the root of this subtree. Exit.\n          nextFiber = null;\n          break;\n        }\n\n        var sibling = nextFiber.sibling;\n\n        if (sibling !== null) {\n          // Set the return pointer of the sibling to the work-in-progress fiber.\n          sibling.return = nextFiber.return;\n          nextFiber = sibling;\n          break;\n        } // No more siblings. Traverse up.\n\n\n        nextFiber = nextFiber.return;\n      }\n    }\n\n    fiber = nextFiber;\n  }\n}\nfunction prepareToReadContext(workInProgress, renderExpirationTime) {\n  currentlyRenderingFiber = workInProgress;\n  lastContextDependency = null;\n  lastContextWithAllBitsObserved = null;\n  var dependencies = workInProgress.dependencies;\n\n  if (dependencies !== null) {\n    var firstContext = dependencies.firstContext;\n\n    if (firstContext !== null) {\n      if (dependencies.expirationTime >= renderExpirationTime) {\n        // Context list has a pending update. Mark that this fiber performed work.\n        markWorkInProgressReceivedUpdate();\n      } // Reset the work-in-progress list\n\n\n      dependencies.firstContext = null;\n    }\n  }\n}\nfunction readContext(context, observedBits) {\n  {\n    // This warning would fire if you read context inside a Hook like useMemo.\n    // Unlike the class check below, it's not enforced in production for perf.\n    if (isDisallowedContextReadInDEV) {\n      error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');\n    }\n  }\n\n  if (lastContextWithAllBitsObserved === context) ; else if (observedBits === false || observedBits === 0) ; else {\n    var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types.\n\n    if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) {\n      // Observe all updates.\n      lastContextWithAllBitsObserved = context;\n      resolvedObservedBits = MAX_SIGNED_31_BIT_INT;\n    } else {\n      resolvedObservedBits = observedBits;\n    }\n\n    var contextItem = {\n      context: context,\n      observedBits: resolvedObservedBits,\n      next: null\n    };\n\n    if (lastContextDependency === null) {\n      if (!(currentlyRenderingFiber !== null)) {\n        {\n          throw Error( \"Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().\" );\n        }\n      } // This is the first dependency for this component. Create a new list.\n\n\n      lastContextDependency = contextItem;\n      currentlyRenderingFiber.dependencies = {\n        expirationTime: NoWork,\n        firstContext: contextItem,\n        responders: null\n      };\n    } else {\n      // Append a new context item.\n      lastContextDependency = lastContextDependency.next = contextItem;\n    }\n  }\n\n  return  context._currentValue ;\n}\n\nvar UpdateState = 0;\nvar ReplaceState = 1;\nvar ForceUpdate = 2;\nvar CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`.\n// It should only be read right after calling `processUpdateQueue`, via\n// `checkHasForceUpdateAfterProcessing`.\n\nvar hasForceUpdate = false;\nvar didWarnUpdateInsideUpdate;\nvar currentlyProcessingQueue;\n\n{\n  didWarnUpdateInsideUpdate = false;\n  currentlyProcessingQueue = null;\n}\n\nfunction initializeUpdateQueue(fiber) {\n  var queue = {\n    baseState: fiber.memoizedState,\n    baseQueue: null,\n    shared: {\n      pending: null\n    },\n    effects: null\n  };\n  fiber.updateQueue = queue;\n}\nfunction cloneUpdateQueue(current, workInProgress) {\n  // Clone the update queue from current. Unless it's already a clone.\n  var queue = workInProgress.updateQueue;\n  var currentQueue = current.updateQueue;\n\n  if (queue === currentQueue) {\n    var clone = {\n      baseState: currentQueue.baseState,\n      baseQueue: currentQueue.baseQueue,\n      shared: currentQueue.shared,\n      effects: currentQueue.effects\n    };\n    workInProgress.updateQueue = clone;\n  }\n}\nfunction createUpdate(expirationTime, suspenseConfig) {\n  var update = {\n    expirationTime: expirationTime,\n    suspenseConfig: suspenseConfig,\n    tag: UpdateState,\n    payload: null,\n    callback: null,\n    next: null\n  };\n  update.next = update;\n\n  {\n    update.priority = getCurrentPriorityLevel();\n  }\n\n  return update;\n}\nfunction enqueueUpdate(fiber, update) {\n  var updateQueue = fiber.updateQueue;\n\n  if (updateQueue === null) {\n    // Only occurs if the fiber has been unmounted.\n    return;\n  }\n\n  var sharedQueue = updateQueue.shared;\n  var pending = sharedQueue.pending;\n\n  if (pending === null) {\n    // This is the first update. Create a circular list.\n    update.next = update;\n  } else {\n    update.next = pending.next;\n    pending.next = update;\n  }\n\n  sharedQueue.pending = update;\n\n  {\n    if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) {\n      error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');\n\n      didWarnUpdateInsideUpdate = true;\n    }\n  }\n}\nfunction enqueueCapturedUpdate(workInProgress, update) {\n  var current = workInProgress.alternate;\n\n  if (current !== null) {\n    // Ensure the work-in-progress queue is a clone\n    cloneUpdateQueue(current, workInProgress);\n  } // Captured updates go only on the work-in-progress queue.\n\n\n  var queue = workInProgress.updateQueue; // Append the update to the end of the list.\n\n  var last = queue.baseQueue;\n\n  if (last === null) {\n    queue.baseQueue = update.next = update;\n    update.next = update;\n  } else {\n    update.next = last.next;\n    last.next = update;\n  }\n}\n\nfunction getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {\n  switch (update.tag) {\n    case ReplaceState:\n      {\n        var payload = update.payload;\n\n        if (typeof payload === 'function') {\n          // Updater function\n          {\n            enterDisallowedContextReadInDEV();\n\n            if ( workInProgress.mode & StrictMode) {\n              payload.call(instance, prevState, nextProps);\n            }\n          }\n\n          var nextState = payload.call(instance, prevState, nextProps);\n\n          {\n            exitDisallowedContextReadInDEV();\n          }\n\n          return nextState;\n        } // State object\n\n\n        return payload;\n      }\n\n    case CaptureUpdate:\n      {\n        workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;\n      }\n    // Intentional fallthrough\n\n    case UpdateState:\n      {\n        var _payload = update.payload;\n        var partialState;\n\n        if (typeof _payload === 'function') {\n          // Updater function\n          {\n            enterDisallowedContextReadInDEV();\n\n            if ( workInProgress.mode & StrictMode) {\n              _payload.call(instance, prevState, nextProps);\n            }\n          }\n\n          partialState = _payload.call(instance, prevState, nextProps);\n\n          {\n            exitDisallowedContextReadInDEV();\n          }\n        } else {\n          // Partial state object\n          partialState = _payload;\n        }\n\n        if (partialState === null || partialState === undefined) {\n          // Null and undefined are treated as no-ops.\n          return prevState;\n        } // Merge the partial state and the previous state.\n\n\n        return _assign({}, prevState, partialState);\n      }\n\n    case ForceUpdate:\n      {\n        hasForceUpdate = true;\n        return prevState;\n      }\n  }\n\n  return prevState;\n}\n\nfunction processUpdateQueue(workInProgress, props, instance, renderExpirationTime) {\n  // This is always non-null on a ClassComponent or HostRoot\n  var queue = workInProgress.updateQueue;\n  hasForceUpdate = false;\n\n  {\n    currentlyProcessingQueue = queue.shared;\n  } // The last rebase update that is NOT part of the base state.\n\n\n  var baseQueue = queue.baseQueue; // The last pending update that hasn't been processed yet.\n\n  var pendingQueue = queue.shared.pending;\n\n  if (pendingQueue !== null) {\n    // We have new updates that haven't been processed yet.\n    // We'll add them to the base queue.\n    if (baseQueue !== null) {\n      // Merge the pending queue and the base queue.\n      var baseFirst = baseQueue.next;\n      var pendingFirst = pendingQueue.next;\n      baseQueue.next = pendingFirst;\n      pendingQueue.next = baseFirst;\n    }\n\n    baseQueue = pendingQueue;\n    queue.shared.pending = null; // TODO: Pass `current` as argument\n\n    var current = workInProgress.alternate;\n\n    if (current !== null) {\n      var currentQueue = current.updateQueue;\n\n      if (currentQueue !== null) {\n        currentQueue.baseQueue = pendingQueue;\n      }\n    }\n  } // These values may change as we process the queue.\n\n\n  if (baseQueue !== null) {\n    var first = baseQueue.next; // Iterate through the list of updates to compute the result.\n\n    var newState = queue.baseState;\n    var newExpirationTime = NoWork;\n    var newBaseState = null;\n    var newBaseQueueFirst = null;\n    var newBaseQueueLast = null;\n\n    if (first !== null) {\n      var update = first;\n\n      do {\n        var updateExpirationTime = update.expirationTime;\n\n        if (updateExpirationTime < renderExpirationTime) {\n          // Priority is insufficient. Skip this update. If this is the first\n          // skipped update, the previous update/state is the new base\n          // update/state.\n          var clone = {\n            expirationTime: update.expirationTime,\n            suspenseConfig: update.suspenseConfig,\n            tag: update.tag,\n            payload: update.payload,\n            callback: update.callback,\n            next: null\n          };\n\n          if (newBaseQueueLast === null) {\n            newBaseQueueFirst = newBaseQueueLast = clone;\n            newBaseState = newState;\n          } else {\n            newBaseQueueLast = newBaseQueueLast.next = clone;\n          } // Update the remaining priority in the queue.\n\n\n          if (updateExpirationTime > newExpirationTime) {\n            newExpirationTime = updateExpirationTime;\n          }\n        } else {\n          // This update does have sufficient priority.\n          if (newBaseQueueLast !== null) {\n            var _clone = {\n              expirationTime: Sync,\n              // This update is going to be committed so we never want uncommit it.\n              suspenseConfig: update.suspenseConfig,\n              tag: update.tag,\n              payload: update.payload,\n              callback: update.callback,\n              next: null\n            };\n            newBaseQueueLast = newBaseQueueLast.next = _clone;\n          } // Mark the event time of this update as relevant to this render pass.\n          // TODO: This should ideally use the true event time of this update rather than\n          // its priority which is a derived and not reverseable value.\n          // TODO: We should skip this update if it was already committed but currently\n          // we have no way of detecting the difference between a committed and suspended\n          // update here.\n\n\n          markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.\n\n          newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance);\n          var callback = update.callback;\n\n          if (callback !== null) {\n            workInProgress.effectTag |= Callback;\n            var effects = queue.effects;\n\n            if (effects === null) {\n              queue.effects = [update];\n            } else {\n              effects.push(update);\n            }\n          }\n        }\n\n        update = update.next;\n\n        if (update === null || update === first) {\n          pendingQueue = queue.shared.pending;\n\n          if (pendingQueue === null) {\n            break;\n          } else {\n            // An update was scheduled from inside a reducer. Add the new\n            // pending updates to the end of the list and keep processing.\n            update = baseQueue.next = pendingQueue.next;\n            pendingQueue.next = first;\n            queue.baseQueue = baseQueue = pendingQueue;\n            queue.shared.pending = null;\n          }\n        }\n      } while (true);\n    }\n\n    if (newBaseQueueLast === null) {\n      newBaseState = newState;\n    } else {\n      newBaseQueueLast.next = newBaseQueueFirst;\n    }\n\n    queue.baseState = newBaseState;\n    queue.baseQueue = newBaseQueueLast; // Set the remaining expiration time to be whatever is remaining in the queue.\n    // This should be fine because the only two other things that contribute to\n    // expiration time are props and context. We're already in the middle of the\n    // begin phase by the time we start processing the queue, so we've already\n    // dealt with the props. Context in components that specify\n    // shouldComponentUpdate is tricky; but we'll have to account for\n    // that regardless.\n\n    markUnprocessedUpdateTime(newExpirationTime);\n    workInProgress.expirationTime = newExpirationTime;\n    workInProgress.memoizedState = newState;\n  }\n\n  {\n    currentlyProcessingQueue = null;\n  }\n}\n\nfunction callCallback(callback, context) {\n  if (!(typeof callback === 'function')) {\n    {\n      throw Error( \"Invalid argument passed as callback. Expected a function. Instead received: \" + callback );\n    }\n  }\n\n  callback.call(context);\n}\n\nfunction resetHasForceUpdateBeforeProcessing() {\n  hasForceUpdate = false;\n}\nfunction checkHasForceUpdateAfterProcessing() {\n  return hasForceUpdate;\n}\nfunction commitUpdateQueue(finishedWork, finishedQueue, instance) {\n  // Commit the effects\n  var effects = finishedQueue.effects;\n  finishedQueue.effects = null;\n\n  if (effects !== null) {\n    for (var i = 0; i < effects.length; i++) {\n      var effect = effects[i];\n      var callback = effect.callback;\n\n      if (callback !== null) {\n        effect.callback = null;\n        callCallback(callback, instance);\n      }\n    }\n  }\n}\n\nvar ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig;\nfunction requestCurrentSuspenseConfig() {\n  return ReactCurrentBatchConfig.suspense;\n}\n\nvar fakeInternalInstance = {};\nvar isArray = Array.isArray; // React.Component uses a shared frozen object by default.\n// We'll use it to determine whether we need to initialize legacy refs.\n\nvar emptyRefsObject = new React.Component().refs;\nvar didWarnAboutStateAssignmentForComponent;\nvar didWarnAboutUninitializedState;\nvar didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;\nvar didWarnAboutLegacyLifecyclesAndDerivedState;\nvar didWarnAboutUndefinedDerivedState;\nvar warnOnUndefinedDerivedState;\nvar warnOnInvalidCallback;\nvar didWarnAboutDirectlyAssigningPropsToState;\nvar didWarnAboutContextTypeAndContextTypes;\nvar didWarnAboutInvalidateContextType;\n\n{\n  didWarnAboutStateAssignmentForComponent = new Set();\n  didWarnAboutUninitializedState = new Set();\n  didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();\n  didWarnAboutLegacyLifecyclesAndDerivedState = new Set();\n  didWarnAboutDirectlyAssigningPropsToState = new Set();\n  didWarnAboutUndefinedDerivedState = new Set();\n  didWarnAboutContextTypeAndContextTypes = new Set();\n  didWarnAboutInvalidateContextType = new Set();\n  var didWarnOnInvalidCallback = new Set();\n\n  warnOnInvalidCallback = function (callback, callerName) {\n    if (callback === null || typeof callback === 'function') {\n      return;\n    }\n\n    var key = callerName + \"_\" + callback;\n\n    if (!didWarnOnInvalidCallback.has(key)) {\n      didWarnOnInvalidCallback.add(key);\n\n      error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);\n    }\n  };\n\n  warnOnUndefinedDerivedState = function (type, partialState) {\n    if (partialState === undefined) {\n      var componentName = getComponentName(type) || 'Component';\n\n      if (!didWarnAboutUndefinedDerivedState.has(componentName)) {\n        didWarnAboutUndefinedDerivedState.add(componentName);\n\n        error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);\n      }\n    }\n  }; // This is so gross but it's at least non-critical and can be removed if\n  // it causes problems. This is meant to give a nicer error message for\n  // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,\n  // ...)) which otherwise throws a \"_processChildContext is not a function\"\n  // exception.\n\n\n  Object.defineProperty(fakeInternalInstance, '_processChildContext', {\n    enumerable: false,\n    value: function () {\n      {\n        {\n          throw Error( \"_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).\" );\n        }\n      }\n    }\n  });\n  Object.freeze(fakeInternalInstance);\n}\n\nfunction applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {\n  var prevState = workInProgress.memoizedState;\n\n  {\n    if ( workInProgress.mode & StrictMode) {\n      // Invoke the function an extra time to help detect side-effects.\n      getDerivedStateFromProps(nextProps, prevState);\n    }\n  }\n\n  var partialState = getDerivedStateFromProps(nextProps, prevState);\n\n  {\n    warnOnUndefinedDerivedState(ctor, partialState);\n  } // Merge the partial state and the previous state.\n\n\n  var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState);\n  workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the\n  // base state.\n\n  if (workInProgress.expirationTime === NoWork) {\n    // Queue is always non-null for classes\n    var updateQueue = workInProgress.updateQueue;\n    updateQueue.baseState = memoizedState;\n  }\n}\nvar classComponentUpdater = {\n  isMounted: isMounted,\n  enqueueSetState: function (inst, payload, callback) {\n    var fiber = get(inst);\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = createUpdate(expirationTime, suspenseConfig);\n    update.payload = payload;\n\n    if (callback !== undefined && callback !== null) {\n      {\n        warnOnInvalidCallback(callback, 'setState');\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(fiber, update);\n    scheduleWork(fiber, expirationTime);\n  },\n  enqueueReplaceState: function (inst, payload, callback) {\n    var fiber = get(inst);\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = createUpdate(expirationTime, suspenseConfig);\n    update.tag = ReplaceState;\n    update.payload = payload;\n\n    if (callback !== undefined && callback !== null) {\n      {\n        warnOnInvalidCallback(callback, 'replaceState');\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(fiber, update);\n    scheduleWork(fiber, expirationTime);\n  },\n  enqueueForceUpdate: function (inst, callback) {\n    var fiber = get(inst);\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = createUpdate(expirationTime, suspenseConfig);\n    update.tag = ForceUpdate;\n\n    if (callback !== undefined && callback !== null) {\n      {\n        warnOnInvalidCallback(callback, 'forceUpdate');\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(fiber, update);\n    scheduleWork(fiber, expirationTime);\n  }\n};\n\nfunction checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {\n  var instance = workInProgress.stateNode;\n\n  if (typeof instance.shouldComponentUpdate === 'function') {\n    {\n      if ( workInProgress.mode & StrictMode) {\n        // Invoke the function an extra time to help detect side-effects.\n        instance.shouldComponentUpdate(newProps, newState, nextContext);\n      }\n    }\n\n    startPhaseTimer(workInProgress, 'shouldComponentUpdate');\n    var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);\n    stopPhaseTimer();\n\n    {\n      if (shouldUpdate === undefined) {\n        error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component');\n      }\n    }\n\n    return shouldUpdate;\n  }\n\n  if (ctor.prototype && ctor.prototype.isPureReactComponent) {\n    return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);\n  }\n\n  return true;\n}\n\nfunction checkClassInstance(workInProgress, ctor, newProps) {\n  var instance = workInProgress.stateNode;\n\n  {\n    var name = getComponentName(ctor) || 'Component';\n    var renderPresent = instance.render;\n\n    if (!renderPresent) {\n      if (ctor.prototype && typeof ctor.prototype.render === 'function') {\n        error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);\n      } else {\n        error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);\n      }\n    }\n\n    if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {\n      error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name);\n    }\n\n    if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {\n      error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name);\n    }\n\n    if (instance.propTypes) {\n      error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);\n    }\n\n    if (instance.contextType) {\n      error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);\n    }\n\n    {\n      if (instance.contextTypes) {\n        error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);\n      }\n\n      if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {\n        didWarnAboutContextTypeAndContextTypes.add(ctor);\n\n        error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);\n      }\n    }\n\n    if (typeof instance.componentShouldUpdate === 'function') {\n      error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name);\n    }\n\n    if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {\n      error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component');\n    }\n\n    if (typeof instance.componentDidUnmount === 'function') {\n      error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);\n    }\n\n    if (typeof instance.componentDidReceiveProps === 'function') {\n      error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name);\n    }\n\n    if (typeof instance.componentWillRecieveProps === 'function') {\n      error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);\n    }\n\n    if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {\n      error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);\n    }\n\n    var hasMutatedProps = instance.props !== newProps;\n\n    if (instance.props !== undefined && hasMutatedProps) {\n      error('%s(...): When calling super() in `%s`, make sure to pass ' + \"up the same props that your component's constructor was passed.\", name, name);\n    }\n\n    if (instance.defaultProps) {\n      error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name);\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {\n      didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);\n\n      error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor));\n    }\n\n    if (typeof instance.getDerivedStateFromProps === 'function') {\n      error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);\n    }\n\n    if (typeof instance.getDerivedStateFromError === 'function') {\n      error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);\n    }\n\n    if (typeof ctor.getSnapshotBeforeUpdate === 'function') {\n      error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);\n    }\n\n    var _state = instance.state;\n\n    if (_state && (typeof _state !== 'object' || isArray(_state))) {\n      error('%s.state: must be set to an object or null', name);\n    }\n\n    if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {\n      error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);\n    }\n  }\n}\n\nfunction adoptClassInstance(workInProgress, instance) {\n  instance.updater = classComponentUpdater;\n  workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates\n\n  set(instance, workInProgress);\n\n  {\n    instance._reactInternalInstance = fakeInternalInstance;\n  }\n}\n\nfunction constructClassInstance(workInProgress, ctor, props) {\n  var isLegacyContextConsumer = false;\n  var unmaskedContext = emptyContextObject;\n  var context = emptyContextObject;\n  var contextType = ctor.contextType;\n\n  {\n    if ('contextType' in ctor) {\n      var isValid = // Allow null for conditional declaration\n      contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>\n\n      if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {\n        didWarnAboutInvalidateContextType.add(ctor);\n        var addendum = '';\n\n        if (contextType === undefined) {\n          addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';\n        } else if (typeof contextType !== 'object') {\n          addendum = ' However, it is set to a ' + typeof contextType + '.';\n        } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {\n          addendum = ' Did you accidentally pass the Context.Provider instead?';\n        } else if (contextType._context !== undefined) {\n          // <Context.Consumer>\n          addendum = ' Did you accidentally pass the Context.Consumer instead?';\n        } else {\n          addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';\n        }\n\n        error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum);\n      }\n    }\n  }\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    context = readContext(contextType);\n  } else {\n    unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    var contextTypes = ctor.contextTypes;\n    isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;\n    context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;\n  } // Instantiate twice to help detect side-effects.\n\n\n  {\n    if ( workInProgress.mode & StrictMode) {\n      new ctor(props, context); // eslint-disable-line no-new\n    }\n  }\n\n  var instance = new ctor(props, context);\n  var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;\n  adoptClassInstance(workInProgress, instance);\n\n  {\n    if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {\n      var componentName = getComponentName(ctor) || 'Component';\n\n      if (!didWarnAboutUninitializedState.has(componentName)) {\n        didWarnAboutUninitializedState.add(componentName);\n\n        error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);\n      }\n    } // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n    // Warn about these lifecycles if they are present.\n    // Don't warn about react-lifecycles-compat polyfilled methods though.\n\n\n    if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {\n      var foundWillMountName = null;\n      var foundWillReceivePropsName = null;\n      var foundWillUpdateName = null;\n\n      if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {\n        foundWillMountName = 'componentWillMount';\n      } else if (typeof instance.UNSAFE_componentWillMount === 'function') {\n        foundWillMountName = 'UNSAFE_componentWillMount';\n      }\n\n      if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {\n        foundWillReceivePropsName = 'componentWillReceiveProps';\n      } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n        foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n      }\n\n      if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {\n        foundWillUpdateName = 'componentWillUpdate';\n      } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {\n        foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n      }\n\n      if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {\n        var _componentName = getComponentName(ctor) || 'Component';\n\n        var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';\n\n        if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {\n          didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);\n\n          error('Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\\n\\n' + 'The above lifecycles should be removed. Learn more about this warning here:\\n' + 'https://fb.me/react-unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? \"\\n  \" + foundWillMountName : '', foundWillReceivePropsName !== null ? \"\\n  \" + foundWillReceivePropsName : '', foundWillUpdateName !== null ? \"\\n  \" + foundWillUpdateName : '');\n        }\n      }\n    }\n  } // Cache unmasked context so we can avoid recreating masked context unless necessary.\n  // ReactFiberContext usually updates this cache but can't for newly-created instances.\n\n\n  if (isLegacyContextConsumer) {\n    cacheContext(workInProgress, unmaskedContext, context);\n  }\n\n  return instance;\n}\n\nfunction callComponentWillMount(workInProgress, instance) {\n  startPhaseTimer(workInProgress, 'componentWillMount');\n  var oldState = instance.state;\n\n  if (typeof instance.componentWillMount === 'function') {\n    instance.componentWillMount();\n  }\n\n  if (typeof instance.UNSAFE_componentWillMount === 'function') {\n    instance.UNSAFE_componentWillMount();\n  }\n\n  stopPhaseTimer();\n\n  if (oldState !== instance.state) {\n    {\n      error('%s.componentWillMount(): Assigning directly to this.state is ' + \"deprecated (except inside a component's \" + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component');\n    }\n\n    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n  }\n}\n\nfunction callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {\n  var oldState = instance.state;\n  startPhaseTimer(workInProgress, 'componentWillReceiveProps');\n\n  if (typeof instance.componentWillReceiveProps === 'function') {\n    instance.componentWillReceiveProps(newProps, nextContext);\n  }\n\n  if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n    instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n  }\n\n  stopPhaseTimer();\n\n  if (instance.state !== oldState) {\n    {\n      var componentName = getComponentName(workInProgress.type) || 'Component';\n\n      if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {\n        didWarnAboutStateAssignmentForComponent.add(componentName);\n\n        error('%s.componentWillReceiveProps(): Assigning directly to ' + \"this.state is deprecated (except inside a component's \" + 'constructor). Use setState instead.', componentName);\n      }\n    }\n\n    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n  }\n} // Invokes the mount life-cycles on a previously never rendered instance.\n\n\nfunction mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {\n  {\n    checkClassInstance(workInProgress, ctor, newProps);\n  }\n\n  var instance = workInProgress.stateNode;\n  instance.props = newProps;\n  instance.state = workInProgress.memoizedState;\n  instance.refs = emptyRefsObject;\n  initializeUpdateQueue(workInProgress);\n  var contextType = ctor.contextType;\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    instance.context = readContext(contextType);\n  } else {\n    var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    instance.context = getMaskedContext(workInProgress, unmaskedContext);\n  }\n\n  {\n    if (instance.state === newProps) {\n      var componentName = getComponentName(ctor) || 'Component';\n\n      if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {\n        didWarnAboutDirectlyAssigningPropsToState.add(componentName);\n\n        error('%s: It is not recommended to assign props directly to state ' + \"because updates to props won't be reflected in state. \" + 'In most cases, it is better to use props directly.', componentName);\n      }\n    }\n\n    if (workInProgress.mode & StrictMode) {\n      ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);\n    }\n\n    {\n      ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);\n    }\n  }\n\n  processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n  instance.state = workInProgress.memoizedState;\n  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n\n  if (typeof getDerivedStateFromProps === 'function') {\n    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n    instance.state = workInProgress.memoizedState;\n  } // In order to support react-lifecycles-compat polyfilled components,\n  // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n\n  if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {\n    callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's\n    // process them now.\n\n    processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n    instance.state = workInProgress.memoizedState;\n  }\n\n  if (typeof instance.componentDidMount === 'function') {\n    workInProgress.effectTag |= Update;\n  }\n}\n\nfunction resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {\n  var instance = workInProgress.stateNode;\n  var oldProps = workInProgress.memoizedProps;\n  instance.props = oldProps;\n  var oldContext = instance.context;\n  var contextType = ctor.contextType;\n  var nextContext = emptyContextObject;\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    nextContext = readContext(contextType);\n  } else {\n    var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);\n  }\n\n  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n  var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what\n  // ever the previously attempted to render - not the \"current\". However,\n  // during componentDidUpdate we pass the \"current\" props.\n  // In order to support react-lifecycles-compat polyfilled components,\n  // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n  if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {\n    if (oldProps !== newProps || oldContext !== nextContext) {\n      callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);\n    }\n  }\n\n  resetHasForceUpdateBeforeProcessing();\n  var oldState = workInProgress.memoizedState;\n  var newState = instance.state = oldState;\n  processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n  newState = workInProgress.memoizedState;\n\n  if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n\n    return false;\n  }\n\n  if (typeof getDerivedStateFromProps === 'function') {\n    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n    newState = workInProgress.memoizedState;\n  }\n\n  var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);\n\n  if (shouldUpdate) {\n    // In order to support react-lifecycles-compat polyfilled components,\n    // Unsafe lifecycles should not be invoked for components using the new APIs.\n    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {\n      startPhaseTimer(workInProgress, 'componentWillMount');\n\n      if (typeof instance.componentWillMount === 'function') {\n        instance.componentWillMount();\n      }\n\n      if (typeof instance.UNSAFE_componentWillMount === 'function') {\n        instance.UNSAFE_componentWillMount();\n      }\n\n      stopPhaseTimer();\n    }\n\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n  } else {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    } // If shouldComponentUpdate returned false, we should still update the\n    // memoized state to indicate that this work can be reused.\n\n\n    workInProgress.memoizedProps = newProps;\n    workInProgress.memoizedState = newState;\n  } // Update the existing instance's state, props, and context pointers even\n  // if shouldComponentUpdate returns false.\n\n\n  instance.props = newProps;\n  instance.state = newState;\n  instance.context = nextContext;\n  return shouldUpdate;\n} // Invokes the update life-cycles and returns false if it shouldn't rerender.\n\n\nfunction updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) {\n  var instance = workInProgress.stateNode;\n  cloneUpdateQueue(current, workInProgress);\n  var oldProps = workInProgress.memoizedProps;\n  instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps);\n  var oldContext = instance.context;\n  var contextType = ctor.contextType;\n  var nextContext = emptyContextObject;\n\n  if (typeof contextType === 'object' && contextType !== null) {\n    nextContext = readContext(contextType);\n  } else {\n    var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n    nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);\n  }\n\n  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n  var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what\n  // ever the previously attempted to render - not the \"current\". However,\n  // during componentDidUpdate we pass the \"current\" props.\n  // In order to support react-lifecycles-compat polyfilled components,\n  // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n  if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {\n    if (oldProps !== newProps || oldContext !== nextContext) {\n      callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);\n    }\n  }\n\n  resetHasForceUpdateBeforeProcessing();\n  var oldState = workInProgress.memoizedState;\n  var newState = instance.state = oldState;\n  processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n  newState = workInProgress.memoizedState;\n\n  if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Update;\n      }\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Snapshot;\n      }\n    }\n\n    return false;\n  }\n\n  if (typeof getDerivedStateFromProps === 'function') {\n    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n    newState = workInProgress.memoizedState;\n  }\n\n  var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);\n\n  if (shouldUpdate) {\n    // In order to support react-lifecycles-compat polyfilled components,\n    // Unsafe lifecycles should not be invoked for components using the new APIs.\n    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {\n      startPhaseTimer(workInProgress, 'componentWillUpdate');\n\n      if (typeof instance.componentWillUpdate === 'function') {\n        instance.componentWillUpdate(newProps, newState, nextContext);\n      }\n\n      if (typeof instance.UNSAFE_componentWillUpdate === 'function') {\n        instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);\n      }\n\n      stopPhaseTimer();\n    }\n\n    if (typeof instance.componentDidUpdate === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n      workInProgress.effectTag |= Snapshot;\n    }\n  } else {\n    // If an update was already in progress, we should schedule an Update\n    // effect even though we're bailing out, so that cWU/cDU are called.\n    if (typeof instance.componentDidUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Update;\n      }\n    }\n\n    if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n        workInProgress.effectTag |= Snapshot;\n      }\n    } // If shouldComponentUpdate returned false, we should still update the\n    // memoized props/state to indicate that this work can be reused.\n\n\n    workInProgress.memoizedProps = newProps;\n    workInProgress.memoizedState = newState;\n  } // Update the existing instance's state, props, and context pointers even\n  // if shouldComponentUpdate returns false.\n\n\n  instance.props = newProps;\n  instance.state = newState;\n  instance.context = nextContext;\n  return shouldUpdate;\n}\n\nvar didWarnAboutMaps;\nvar didWarnAboutGenerators;\nvar didWarnAboutStringRefs;\nvar ownerHasKeyUseWarning;\nvar ownerHasFunctionTypeWarning;\n\nvar warnForMissingKey = function (child) {};\n\n{\n  didWarnAboutMaps = false;\n  didWarnAboutGenerators = false;\n  didWarnAboutStringRefs = {};\n  /**\n   * Warn if there's no key explicitly set on dynamic arrays of children or\n   * object keys are not valid. This allows us to keep track of children between\n   * updates.\n   */\n\n  ownerHasKeyUseWarning = {};\n  ownerHasFunctionTypeWarning = {};\n\n  warnForMissingKey = function (child) {\n    if (child === null || typeof child !== 'object') {\n      return;\n    }\n\n    if (!child._store || child._store.validated || child.key != null) {\n      return;\n    }\n\n    if (!(typeof child._store === 'object')) {\n      {\n        throw Error( \"React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    child._store.validated = true;\n    var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev();\n\n    if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n      return;\n    }\n\n    ownerHasKeyUseWarning[currentComponentErrorInfo] = true;\n\n    error('Each child in a list should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.');\n  };\n}\n\nvar isArray$1 = Array.isArray;\n\nfunction coerceRef(returnFiber, current, element) {\n  var mixedRef = element.ref;\n\n  if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {\n    {\n      // TODO: Clean this up once we turn on the string ref warning for\n      // everyone, because the strict mode case will no longer be relevant\n      if ((returnFiber.mode & StrictMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs\n      // because these cannot be automatically converted to an arrow function\n      // using a codemod. Therefore, we don't have to warn about string refs again.\n      !(element._owner && element._self && element._owner.stateNode !== element._self)) {\n        var componentName = getComponentName(returnFiber.type) || 'Component';\n\n        if (!didWarnAboutStringRefs[componentName]) {\n          {\n            error('A string ref, \"%s\", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', mixedRef, getStackByFiberInDevAndProd(returnFiber));\n          }\n\n          didWarnAboutStringRefs[componentName] = true;\n        }\n      }\n    }\n\n    if (element._owner) {\n      var owner = element._owner;\n      var inst;\n\n      if (owner) {\n        var ownerFiber = owner;\n\n        if (!(ownerFiber.tag === ClassComponent)) {\n          {\n            throw Error( \"Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://fb.me/react-strict-mode-string-ref\" );\n          }\n        }\n\n        inst = ownerFiber.stateNode;\n      }\n\n      if (!inst) {\n        {\n          throw Error( \"Missing owner for string ref \" + mixedRef + \". This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n      var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref\n\n      if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) {\n        return current.ref;\n      }\n\n      var ref = function (value) {\n        var refs = inst.refs;\n\n        if (refs === emptyRefsObject) {\n          // This is a lazy pooled frozen object, so we need to initialize.\n          refs = inst.refs = {};\n        }\n\n        if (value === null) {\n          delete refs[stringRef];\n        } else {\n          refs[stringRef] = value;\n        }\n      };\n\n      ref._stringRef = stringRef;\n      return ref;\n    } else {\n      if (!(typeof mixedRef === 'string')) {\n        {\n          throw Error( \"Expected ref to be a function, a string, an object returned by React.createRef(), or null.\" );\n        }\n      }\n\n      if (!element._owner) {\n        {\n          throw Error( \"Element ref was specified as a string (\" + mixedRef + \") but no owner was set. This could happen for one of the following reasons:\\n1. You may be adding a ref to a function component\\n2. You may be adding a ref to a component that was not created inside a component's render method\\n3. You have multiple copies of React loaded\\nSee https://fb.me/react-refs-must-have-owner for more information.\" );\n        }\n      }\n    }\n  }\n\n  return mixedRef;\n}\n\nfunction throwOnInvalidObjectType(returnFiber, newChild) {\n  if (returnFiber.type !== 'textarea') {\n    var addendum = '';\n\n    {\n      addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev();\n    }\n\n    {\n      {\n        throw Error( \"Objects are not valid as a React child (found: \" + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + \").\" + addendum );\n      }\n    }\n  }\n}\n\nfunction warnOnFunctionType() {\n  {\n    var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + getCurrentFiberStackInDev();\n\n    if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {\n      return;\n    }\n\n    ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;\n\n    error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');\n  }\n} // This wrapper function exists because I expect to clone the code in each path\n// to be able to optimize each path individually by branching early. This needs\n// a compiler or we can do it manually. Helpers that don't need this branching\n// live outside of this function.\n\n\nfunction ChildReconciler(shouldTrackSideEffects) {\n  function deleteChild(returnFiber, childToDelete) {\n    if (!shouldTrackSideEffects) {\n      // Noop.\n      return;\n    } // Deletions are added in reversed order so we add it to the front.\n    // At this point, the return fiber's effect list is empty except for\n    // deletions, so we can just append the deletion to the list. The remaining\n    // effects aren't added until the complete phase. Once we implement\n    // resuming, this may not be true.\n\n\n    var last = returnFiber.lastEffect;\n\n    if (last !== null) {\n      last.nextEffect = childToDelete;\n      returnFiber.lastEffect = childToDelete;\n    } else {\n      returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n    }\n\n    childToDelete.nextEffect = null;\n    childToDelete.effectTag = Deletion;\n  }\n\n  function deleteRemainingChildren(returnFiber, currentFirstChild) {\n    if (!shouldTrackSideEffects) {\n      // Noop.\n      return null;\n    } // TODO: For the shouldClone case, this could be micro-optimized a bit by\n    // assuming that after the first child we've already added everything.\n\n\n    var childToDelete = currentFirstChild;\n\n    while (childToDelete !== null) {\n      deleteChild(returnFiber, childToDelete);\n      childToDelete = childToDelete.sibling;\n    }\n\n    return null;\n  }\n\n  function mapRemainingChildren(returnFiber, currentFirstChild) {\n    // Add the remaining children to a temporary map so that we can find them by\n    // keys quickly. Implicit (null) keys get added to this set with their index\n    // instead.\n    var existingChildren = new Map();\n    var existingChild = currentFirstChild;\n\n    while (existingChild !== null) {\n      if (existingChild.key !== null) {\n        existingChildren.set(existingChild.key, existingChild);\n      } else {\n        existingChildren.set(existingChild.index, existingChild);\n      }\n\n      existingChild = existingChild.sibling;\n    }\n\n    return existingChildren;\n  }\n\n  function useFiber(fiber, pendingProps) {\n    // We currently set sibling to null and index to 0 here because it is easy\n    // to forget to do before returning it. E.g. for the single child case.\n    var clone = createWorkInProgress(fiber, pendingProps);\n    clone.index = 0;\n    clone.sibling = null;\n    return clone;\n  }\n\n  function placeChild(newFiber, lastPlacedIndex, newIndex) {\n    newFiber.index = newIndex;\n\n    if (!shouldTrackSideEffects) {\n      // Noop.\n      return lastPlacedIndex;\n    }\n\n    var current = newFiber.alternate;\n\n    if (current !== null) {\n      var oldIndex = current.index;\n\n      if (oldIndex < lastPlacedIndex) {\n        // This is a move.\n        newFiber.effectTag = Placement;\n        return lastPlacedIndex;\n      } else {\n        // This item can stay in place.\n        return oldIndex;\n      }\n    } else {\n      // This is an insertion.\n      newFiber.effectTag = Placement;\n      return lastPlacedIndex;\n    }\n  }\n\n  function placeSingleChild(newFiber) {\n    // This is simpler for the single child case. We only need to do a\n    // placement for inserting new children.\n    if (shouldTrackSideEffects && newFiber.alternate === null) {\n      newFiber.effectTag = Placement;\n    }\n\n    return newFiber;\n  }\n\n  function updateTextNode(returnFiber, current, textContent, expirationTime) {\n    if (current === null || current.tag !== HostText) {\n      // Insert\n      var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    } else {\n      // Update\n      var existing = useFiber(current, textContent);\n      existing.return = returnFiber;\n      return existing;\n    }\n  }\n\n  function updateElement(returnFiber, current, element, expirationTime) {\n    if (current !== null) {\n      if (current.elementType === element.type || ( // Keep this check inline so it only runs on the false path:\n       isCompatibleFamilyForHotReloading(current, element) )) {\n        // Move based on index\n        var existing = useFiber(current, element.props);\n        existing.ref = coerceRef(returnFiber, current, element);\n        existing.return = returnFiber;\n\n        {\n          existing._debugSource = element._source;\n          existing._debugOwner = element._owner;\n        }\n\n        return existing;\n      }\n    } // Insert\n\n\n    var created = createFiberFromElement(element, returnFiber.mode, expirationTime);\n    created.ref = coerceRef(returnFiber, current, element);\n    created.return = returnFiber;\n    return created;\n  }\n\n  function updatePortal(returnFiber, current, portal, expirationTime) {\n    if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {\n      // Insert\n      var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    } else {\n      // Update\n      var existing = useFiber(current, portal.children || []);\n      existing.return = returnFiber;\n      return existing;\n    }\n  }\n\n  function updateFragment(returnFiber, current, fragment, expirationTime, key) {\n    if (current === null || current.tag !== Fragment) {\n      // Insert\n      var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);\n      created.return = returnFiber;\n      return created;\n    } else {\n      // Update\n      var existing = useFiber(current, fragment);\n      existing.return = returnFiber;\n      return existing;\n    }\n  }\n\n  function createChild(returnFiber, newChild, expirationTime) {\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      // Text nodes don't have keys. If the previous node is implicitly keyed\n      // we can continue to replace it without aborting even if it is not a text\n      // node.\n      var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    }\n\n    if (typeof newChild === 'object' && newChild !== null) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          {\n            var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);\n\n            _created.ref = coerceRef(returnFiber, null, newChild);\n            _created.return = returnFiber;\n            return _created;\n          }\n\n        case REACT_PORTAL_TYPE:\n          {\n            var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);\n\n            _created2.return = returnFiber;\n            return _created2;\n          }\n      }\n\n      if (isArray$1(newChild) || getIteratorFn(newChild)) {\n        var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);\n\n        _created3.return = returnFiber;\n        return _created3;\n      }\n\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    return null;\n  }\n\n  function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {\n    // Update the fiber if the keys match, otherwise return null.\n    var key = oldFiber !== null ? oldFiber.key : null;\n\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      // Text nodes don't have keys. If the previous node is implicitly keyed\n      // we can continue to replace it without aborting even if it is not a text\n      // node.\n      if (key !== null) {\n        return null;\n      }\n\n      return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);\n    }\n\n    if (typeof newChild === 'object' && newChild !== null) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          {\n            if (newChild.key === key) {\n              if (newChild.type === REACT_FRAGMENT_TYPE) {\n                return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);\n              }\n\n              return updateElement(returnFiber, oldFiber, newChild, expirationTime);\n            } else {\n              return null;\n            }\n          }\n\n        case REACT_PORTAL_TYPE:\n          {\n            if (newChild.key === key) {\n              return updatePortal(returnFiber, oldFiber, newChild, expirationTime);\n            } else {\n              return null;\n            }\n          }\n      }\n\n      if (isArray$1(newChild) || getIteratorFn(newChild)) {\n        if (key !== null) {\n          return null;\n        }\n\n        return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);\n      }\n\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    return null;\n  }\n\n  function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      // Text nodes don't have keys, so we neither have to check the old nor\n      // new node for the key. If both are text nodes, they match.\n      var matchedFiber = existingChildren.get(newIdx) || null;\n      return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);\n    }\n\n    if (typeof newChild === 'object' && newChild !== null) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          {\n            var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n\n            if (newChild.type === REACT_FRAGMENT_TYPE) {\n              return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);\n            }\n\n            return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);\n          }\n\n        case REACT_PORTAL_TYPE:\n          {\n            var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n\n            return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);\n          }\n      }\n\n      if (isArray$1(newChild) || getIteratorFn(newChild)) {\n        var _matchedFiber3 = existingChildren.get(newIdx) || null;\n\n        return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);\n      }\n\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    return null;\n  }\n  /**\n   * Warns if there is a duplicate or missing key\n   */\n\n\n  function warnOnInvalidKey(child, knownKeys) {\n    {\n      if (typeof child !== 'object' || child === null) {\n        return knownKeys;\n      }\n\n      switch (child.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n        case REACT_PORTAL_TYPE:\n          warnForMissingKey(child);\n          var key = child.key;\n\n          if (typeof key !== 'string') {\n            break;\n          }\n\n          if (knownKeys === null) {\n            knownKeys = new Set();\n            knownKeys.add(key);\n            break;\n          }\n\n          if (!knownKeys.has(key)) {\n            knownKeys.add(key);\n            break;\n          }\n\n          error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key);\n\n          break;\n      }\n    }\n\n    return knownKeys;\n  }\n\n  function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {\n    // This algorithm can't optimize by searching from both ends since we\n    // don't have backpointers on fibers. I'm trying to see how far we can get\n    // with that model. If it ends up not being worth the tradeoffs, we can\n    // add it later.\n    // Even with a two ended optimization, we'd want to optimize for the case\n    // where there are few changes and brute force the comparison instead of\n    // going for the Map. It'd like to explore hitting that path first in\n    // forward-only mode and only go for the Map once we notice that we need\n    // lots of look ahead. This doesn't handle reversal as well as two ended\n    // search but that's unusual. Besides, for the two ended optimization to\n    // work on Iterables, we'd need to copy the whole set.\n    // In this first iteration, we'll just live with hitting the bad case\n    // (adding everything to a Map) in for every insert/move.\n    // If you change this code, also update reconcileChildrenIterator() which\n    // uses the same algorithm.\n    {\n      // First, validate keys.\n      var knownKeys = null;\n\n      for (var i = 0; i < newChildren.length; i++) {\n        var child = newChildren[i];\n        knownKeys = warnOnInvalidKey(child, knownKeys);\n      }\n    }\n\n    var resultingFirstChild = null;\n    var previousNewFiber = null;\n    var oldFiber = currentFirstChild;\n    var lastPlacedIndex = 0;\n    var newIdx = 0;\n    var nextOldFiber = null;\n\n    for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {\n      if (oldFiber.index > newIdx) {\n        nextOldFiber = oldFiber;\n        oldFiber = null;\n      } else {\n        nextOldFiber = oldFiber.sibling;\n      }\n\n      var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);\n\n      if (newFiber === null) {\n        // TODO: This breaks on empty slots like null children. That's\n        // unfortunate because it triggers the slow path all the time. We need\n        // a better way to communicate whether this was a miss or null,\n        // boolean, undefined, etc.\n        if (oldFiber === null) {\n          oldFiber = nextOldFiber;\n        }\n\n        break;\n      }\n\n      if (shouldTrackSideEffects) {\n        if (oldFiber && newFiber.alternate === null) {\n          // We matched the slot, but we didn't reuse the existing fiber, so we\n          // need to delete the existing child.\n          deleteChild(returnFiber, oldFiber);\n        }\n      }\n\n      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n\n      if (previousNewFiber === null) {\n        // TODO: Move out of the loop. This only happens for the first run.\n        resultingFirstChild = newFiber;\n      } else {\n        // TODO: Defer siblings if we're not at the right index for this slot.\n        // I.e. if we had null values before, then we want to defer this\n        // for each null value. However, we also don't want to call updateSlot\n        // with the previous one.\n        previousNewFiber.sibling = newFiber;\n      }\n\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n\n    if (newIdx === newChildren.length) {\n      // We've reached the end of the new children. We can delete the rest.\n      deleteRemainingChildren(returnFiber, oldFiber);\n      return resultingFirstChild;\n    }\n\n    if (oldFiber === null) {\n      // If we don't have any more existing children we can choose a fast path\n      // since the rest will all be insertions.\n      for (; newIdx < newChildren.length; newIdx++) {\n        var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);\n\n        if (_newFiber === null) {\n          continue;\n        }\n\n        lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          // TODO: Move out of the loop. This only happens for the first run.\n          resultingFirstChild = _newFiber;\n        } else {\n          previousNewFiber.sibling = _newFiber;\n        }\n\n        previousNewFiber = _newFiber;\n      }\n\n      return resultingFirstChild;\n    } // Add all children to a key map for quick lookups.\n\n\n    var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.\n\n    for (; newIdx < newChildren.length; newIdx++) {\n      var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);\n\n      if (_newFiber2 !== null) {\n        if (shouldTrackSideEffects) {\n          if (_newFiber2.alternate !== null) {\n            // The new fiber is a work in progress, but if there exists a\n            // current, that means that we reused the fiber. We need to delete\n            // it from the child list so that we don't add it to the deletion\n            // list.\n            existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);\n          }\n        }\n\n        lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          resultingFirstChild = _newFiber2;\n        } else {\n          previousNewFiber.sibling = _newFiber2;\n        }\n\n        previousNewFiber = _newFiber2;\n      }\n    }\n\n    if (shouldTrackSideEffects) {\n      // Any existing children that weren't consumed above were deleted. We need\n      // to add them to the deletion list.\n      existingChildren.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    }\n\n    return resultingFirstChild;\n  }\n\n  function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {\n    // This is the same implementation as reconcileChildrenArray(),\n    // but using the iterator instead.\n    var iteratorFn = getIteratorFn(newChildrenIterable);\n\n    if (!(typeof iteratorFn === 'function')) {\n      {\n        throw Error( \"An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    {\n      // We don't support rendering Generators because it's a mutation.\n      // See https://github.com/facebook/react/issues/12995\n      if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag\n      newChildrenIterable[Symbol.toStringTag] === 'Generator') {\n        if (!didWarnAboutGenerators) {\n          error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.');\n        }\n\n        didWarnAboutGenerators = true;\n      } // Warn about using Maps as children\n\n\n      if (newChildrenIterable.entries === iteratorFn) {\n        if (!didWarnAboutMaps) {\n          error('Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.');\n        }\n\n        didWarnAboutMaps = true;\n      } // First, validate keys.\n      // We'll get a different iterator later for the main pass.\n\n\n      var _newChildren = iteratorFn.call(newChildrenIterable);\n\n      if (_newChildren) {\n        var knownKeys = null;\n\n        var _step = _newChildren.next();\n\n        for (; !_step.done; _step = _newChildren.next()) {\n          var child = _step.value;\n          knownKeys = warnOnInvalidKey(child, knownKeys);\n        }\n      }\n    }\n\n    var newChildren = iteratorFn.call(newChildrenIterable);\n\n    if (!(newChildren != null)) {\n      {\n        throw Error( \"An iterable object provided no iterator.\" );\n      }\n    }\n\n    var resultingFirstChild = null;\n    var previousNewFiber = null;\n    var oldFiber = currentFirstChild;\n    var lastPlacedIndex = 0;\n    var newIdx = 0;\n    var nextOldFiber = null;\n    var step = newChildren.next();\n\n    for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {\n      if (oldFiber.index > newIdx) {\n        nextOldFiber = oldFiber;\n        oldFiber = null;\n      } else {\n        nextOldFiber = oldFiber.sibling;\n      }\n\n      var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);\n\n      if (newFiber === null) {\n        // TODO: This breaks on empty slots like null children. That's\n        // unfortunate because it triggers the slow path all the time. We need\n        // a better way to communicate whether this was a miss or null,\n        // boolean, undefined, etc.\n        if (oldFiber === null) {\n          oldFiber = nextOldFiber;\n        }\n\n        break;\n      }\n\n      if (shouldTrackSideEffects) {\n        if (oldFiber && newFiber.alternate === null) {\n          // We matched the slot, but we didn't reuse the existing fiber, so we\n          // need to delete the existing child.\n          deleteChild(returnFiber, oldFiber);\n        }\n      }\n\n      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n\n      if (previousNewFiber === null) {\n        // TODO: Move out of the loop. This only happens for the first run.\n        resultingFirstChild = newFiber;\n      } else {\n        // TODO: Defer siblings if we're not at the right index for this slot.\n        // I.e. if we had null values before, then we want to defer this\n        // for each null value. However, we also don't want to call updateSlot\n        // with the previous one.\n        previousNewFiber.sibling = newFiber;\n      }\n\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n\n    if (step.done) {\n      // We've reached the end of the new children. We can delete the rest.\n      deleteRemainingChildren(returnFiber, oldFiber);\n      return resultingFirstChild;\n    }\n\n    if (oldFiber === null) {\n      // If we don't have any more existing children we can choose a fast path\n      // since the rest will all be insertions.\n      for (; !step.done; newIdx++, step = newChildren.next()) {\n        var _newFiber3 = createChild(returnFiber, step.value, expirationTime);\n\n        if (_newFiber3 === null) {\n          continue;\n        }\n\n        lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          // TODO: Move out of the loop. This only happens for the first run.\n          resultingFirstChild = _newFiber3;\n        } else {\n          previousNewFiber.sibling = _newFiber3;\n        }\n\n        previousNewFiber = _newFiber3;\n      }\n\n      return resultingFirstChild;\n    } // Add all children to a key map for quick lookups.\n\n\n    var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.\n\n    for (; !step.done; newIdx++, step = newChildren.next()) {\n      var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);\n\n      if (_newFiber4 !== null) {\n        if (shouldTrackSideEffects) {\n          if (_newFiber4.alternate !== null) {\n            // The new fiber is a work in progress, but if there exists a\n            // current, that means that we reused the fiber. We need to delete\n            // it from the child list so that we don't add it to the deletion\n            // list.\n            existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);\n          }\n        }\n\n        lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          resultingFirstChild = _newFiber4;\n        } else {\n          previousNewFiber.sibling = _newFiber4;\n        }\n\n        previousNewFiber = _newFiber4;\n      }\n    }\n\n    if (shouldTrackSideEffects) {\n      // Any existing children that weren't consumed above were deleted. We need\n      // to add them to the deletion list.\n      existingChildren.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    }\n\n    return resultingFirstChild;\n  }\n\n  function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {\n    // There's no need to check for keys on text nodes since we don't have a\n    // way to define them.\n    if (currentFirstChild !== null && currentFirstChild.tag === HostText) {\n      // We already have an existing node so let's just update it and delete\n      // the rest.\n      deleteRemainingChildren(returnFiber, currentFirstChild.sibling);\n      var existing = useFiber(currentFirstChild, textContent);\n      existing.return = returnFiber;\n      return existing;\n    } // The existing first child is not a text node so we need to create one\n    // and delete the existing ones.\n\n\n    deleteRemainingChildren(returnFiber, currentFirstChild);\n    var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n    created.return = returnFiber;\n    return created;\n  }\n\n  function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {\n    var key = element.key;\n    var child = currentFirstChild;\n\n    while (child !== null) {\n      // TODO: If key === null and child.key === null, then this only applies to\n      // the first item in the list.\n      if (child.key === key) {\n        switch (child.tag) {\n          case Fragment:\n            {\n              if (element.type === REACT_FRAGMENT_TYPE) {\n                deleteRemainingChildren(returnFiber, child.sibling);\n                var existing = useFiber(child, element.props.children);\n                existing.return = returnFiber;\n\n                {\n                  existing._debugSource = element._source;\n                  existing._debugOwner = element._owner;\n                }\n\n                return existing;\n              }\n\n              break;\n            }\n\n          case Block:\n\n          // We intentionally fallthrough here if enableBlocksAPI is not on.\n          // eslint-disable-next-lined no-fallthrough\n\n          default:\n            {\n              if (child.elementType === element.type || ( // Keep this check inline so it only runs on the false path:\n               isCompatibleFamilyForHotReloading(child, element) )) {\n                deleteRemainingChildren(returnFiber, child.sibling);\n\n                var _existing3 = useFiber(child, element.props);\n\n                _existing3.ref = coerceRef(returnFiber, child, element);\n                _existing3.return = returnFiber;\n\n                {\n                  _existing3._debugSource = element._source;\n                  _existing3._debugOwner = element._owner;\n                }\n\n                return _existing3;\n              }\n\n              break;\n            }\n        } // Didn't match.\n\n\n        deleteRemainingChildren(returnFiber, child);\n        break;\n      } else {\n        deleteChild(returnFiber, child);\n      }\n\n      child = child.sibling;\n    }\n\n    if (element.type === REACT_FRAGMENT_TYPE) {\n      var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);\n      created.return = returnFiber;\n      return created;\n    } else {\n      var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);\n\n      _created4.ref = coerceRef(returnFiber, currentFirstChild, element);\n      _created4.return = returnFiber;\n      return _created4;\n    }\n  }\n\n  function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {\n    var key = portal.key;\n    var child = currentFirstChild;\n\n    while (child !== null) {\n      // TODO: If key === null and child.key === null, then this only applies to\n      // the first item in the list.\n      if (child.key === key) {\n        if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {\n          deleteRemainingChildren(returnFiber, child.sibling);\n          var existing = useFiber(child, portal.children || []);\n          existing.return = returnFiber;\n          return existing;\n        } else {\n          deleteRemainingChildren(returnFiber, child);\n          break;\n        }\n      } else {\n        deleteChild(returnFiber, child);\n      }\n\n      child = child.sibling;\n    }\n\n    var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n    created.return = returnFiber;\n    return created;\n  } // This API will tag the children with the side-effect of the reconciliation\n  // itself. They will be added to the side-effect list as we pass through the\n  // children and the parent.\n\n\n  function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {\n    // This function is not recursive.\n    // If the top level item is an array, we treat it as a set of children,\n    // not as a fragment. Nested arrays on the other hand will be treated as\n    // fragment nodes. Recursion happens at the normal flow.\n    // Handle top level unkeyed fragments as if they were arrays.\n    // This leads to an ambiguity between <>{[...]}</> and <>...</>.\n    // We treat the ambiguous cases above the same.\n    var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;\n\n    if (isUnkeyedTopLevelFragment) {\n      newChild = newChild.props.children;\n    } // Handle object types\n\n\n    var isObject = typeof newChild === 'object' && newChild !== null;\n\n    if (isObject) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));\n\n        case REACT_PORTAL_TYPE:\n          return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));\n      }\n    }\n\n    if (typeof newChild === 'string' || typeof newChild === 'number') {\n      return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));\n    }\n\n    if (isArray$1(newChild)) {\n      return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);\n    }\n\n    if (getIteratorFn(newChild)) {\n      return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);\n    }\n\n    if (isObject) {\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n\n    {\n      if (typeof newChild === 'function') {\n        warnOnFunctionType();\n      }\n    }\n\n    if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) {\n      // If the new child is undefined, and the return fiber is a composite\n      // component, throw an error. If Fiber return types are disabled,\n      // we already threw above.\n      switch (returnFiber.tag) {\n        case ClassComponent:\n          {\n            {\n              var instance = returnFiber.stateNode;\n\n              if (instance.render._isMockFunction) {\n                // We allow auto-mocks to proceed as if they're returning null.\n                break;\n              }\n            }\n          }\n        // Intentionally fall through to the next case, which handles both\n        // functions and classes\n        // eslint-disable-next-lined no-fallthrough\n\n        case FunctionComponent:\n          {\n            var Component = returnFiber.type;\n\n            {\n              {\n                throw Error( (Component.displayName || Component.name || 'Component') + \"(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.\" );\n              }\n            }\n          }\n      }\n    } // Remaining cases are all treated as empty.\n\n\n    return deleteRemainingChildren(returnFiber, currentFirstChild);\n  }\n\n  return reconcileChildFibers;\n}\n\nvar reconcileChildFibers = ChildReconciler(true);\nvar mountChildFibers = ChildReconciler(false);\nfunction cloneChildFibers(current, workInProgress) {\n  if (!(current === null || workInProgress.child === current.child)) {\n    {\n      throw Error( \"Resuming work not yet implemented.\" );\n    }\n  }\n\n  if (workInProgress.child === null) {\n    return;\n  }\n\n  var currentChild = workInProgress.child;\n  var newChild = createWorkInProgress(currentChild, currentChild.pendingProps);\n  workInProgress.child = newChild;\n  newChild.return = workInProgress;\n\n  while (currentChild.sibling !== null) {\n    currentChild = currentChild.sibling;\n    newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps);\n    newChild.return = workInProgress;\n  }\n\n  newChild.sibling = null;\n} // Reset a workInProgress child set to prepare it for a second pass.\n\nfunction resetChildFibers(workInProgress, renderExpirationTime) {\n  var child = workInProgress.child;\n\n  while (child !== null) {\n    resetWorkInProgress(child, renderExpirationTime);\n    child = child.sibling;\n  }\n}\n\nvar NO_CONTEXT = {};\nvar contextStackCursor$1 = createCursor(NO_CONTEXT);\nvar contextFiberStackCursor = createCursor(NO_CONTEXT);\nvar rootInstanceStackCursor = createCursor(NO_CONTEXT);\n\nfunction requiredContext(c) {\n  if (!(c !== NO_CONTEXT)) {\n    {\n      throw Error( \"Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  return c;\n}\n\nfunction getRootHostContainer() {\n  var rootInstance = requiredContext(rootInstanceStackCursor.current);\n  return rootInstance;\n}\n\nfunction pushHostContainer(fiber, nextRootInstance) {\n  // Push current root instance onto the stack;\n  // This allows us to reset root when portals are popped.\n  push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it.\n  // This enables us to pop only Fibers that provide unique contexts.\n\n  push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack.\n  // However, we can't just call getRootHostContext() and push it because\n  // we'd have a different number of entries on the stack depending on\n  // whether getRootHostContext() throws somewhere in renderer code or not.\n  // So we push an empty value first. This lets us safely unwind on errors.\n\n  push(contextStackCursor$1, NO_CONTEXT, fiber);\n  var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it.\n\n  pop(contextStackCursor$1, fiber);\n  push(contextStackCursor$1, nextRootContext, fiber);\n}\n\nfunction popHostContainer(fiber) {\n  pop(contextStackCursor$1, fiber);\n  pop(contextFiberStackCursor, fiber);\n  pop(rootInstanceStackCursor, fiber);\n}\n\nfunction getHostContext() {\n  var context = requiredContext(contextStackCursor$1.current);\n  return context;\n}\n\nfunction pushHostContext(fiber) {\n  var rootInstance = requiredContext(rootInstanceStackCursor.current);\n  var context = requiredContext(contextStackCursor$1.current);\n  var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique.\n\n  if (context === nextContext) {\n    return;\n  } // Track the context and the Fiber that provided it.\n  // This enables us to pop only Fibers that provide unique contexts.\n\n\n  push(contextFiberStackCursor, fiber, fiber);\n  push(contextStackCursor$1, nextContext, fiber);\n}\n\nfunction popHostContext(fiber) {\n  // Do not pop unless this Fiber provided the current context.\n  // pushHostContext() only pushes Fibers that provide unique contexts.\n  if (contextFiberStackCursor.current !== fiber) {\n    return;\n  }\n\n  pop(contextStackCursor$1, fiber);\n  pop(contextFiberStackCursor, fiber);\n}\n\nvar DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is\n// inherited deeply down the subtree. The upper bits only affect\n// this immediate suspense boundary and gets reset each new\n// boundary or suspense list.\n\nvar SubtreeSuspenseContextMask = 1; // Subtree Flags:\n// InvisibleParentSuspenseContext indicates that one of our parent Suspense\n// boundaries is not currently showing visible main content.\n// Either because it is already showing a fallback or is not mounted at all.\n// We can use this to determine if it is desirable to trigger a fallback at\n// the parent. If not, then we might need to trigger undesirable boundaries\n// and/or suspend the commit to avoid hiding the parent content.\n\nvar InvisibleParentSuspenseContext = 1; // Shallow Flags:\n// ForceSuspenseFallback can be used by SuspenseList to force newly added\n// items into their fallback state during one of the render passes.\n\nvar ForceSuspenseFallback = 2;\nvar suspenseStackCursor = createCursor(DefaultSuspenseContext);\nfunction hasSuspenseContext(parentContext, flag) {\n  return (parentContext & flag) !== 0;\n}\nfunction setDefaultShallowSuspenseContext(parentContext) {\n  return parentContext & SubtreeSuspenseContextMask;\n}\nfunction setShallowSuspenseContext(parentContext, shallowContext) {\n  return parentContext & SubtreeSuspenseContextMask | shallowContext;\n}\nfunction addSubtreeSuspenseContext(parentContext, subtreeContext) {\n  return parentContext | subtreeContext;\n}\nfunction pushSuspenseContext(fiber, newContext) {\n  push(suspenseStackCursor, newContext, fiber);\n}\nfunction popSuspenseContext(fiber) {\n  pop(suspenseStackCursor, fiber);\n}\n\nfunction shouldCaptureSuspense(workInProgress, hasInvisibleParent) {\n  // If it was the primary children that just suspended, capture and render the\n  // fallback. Otherwise, don't capture and bubble to the next boundary.\n  var nextState = workInProgress.memoizedState;\n\n  if (nextState !== null) {\n    if (nextState.dehydrated !== null) {\n      // A dehydrated boundary always captures.\n      return true;\n    }\n\n    return false;\n  }\n\n  var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop.\n\n  if (props.fallback === undefined) {\n    return false;\n  } // Regular boundaries always capture.\n\n\n  if (props.unstable_avoidThisFallback !== true) {\n    return true;\n  } // If it's a boundary we should avoid, then we prefer to bubble up to the\n  // parent boundary if it is currently invisible.\n\n\n  if (hasInvisibleParent) {\n    return false;\n  } // If the parent is not able to handle it, we must handle it.\n\n\n  return true;\n}\nfunction findFirstSuspended(row) {\n  var node = row;\n\n  while (node !== null) {\n    if (node.tag === SuspenseComponent) {\n      var state = node.memoizedState;\n\n      if (state !== null) {\n        var dehydrated = state.dehydrated;\n\n        if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {\n          return node;\n        }\n      }\n    } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't\n    // keep track of whether it suspended or not.\n    node.memoizedProps.revealOrder !== undefined) {\n      var didSuspend = (node.effectTag & DidCapture) !== NoEffect;\n\n      if (didSuspend) {\n        return node;\n      }\n    } else if (node.child !== null) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === row) {\n      return null;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === row) {\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n\n  return null;\n}\n\nfunction createDeprecatedResponderListener(responder, props) {\n  var eventResponderListener = {\n    responder: responder,\n    props: props\n  };\n\n  {\n    Object.freeze(eventResponderListener);\n  }\n\n  return eventResponderListener;\n}\n\nvar HasEffect =\n/* */\n1; // Represents the phase in which the effect (not the clean-up) fires.\n\nvar Layout =\n/*    */\n2;\nvar Passive$1 =\n/*   */\n4;\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher,\n    ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;\nvar didWarnAboutMismatchedHooksForComponent;\n\n{\n  didWarnAboutMismatchedHooksForComponent = new Set();\n}\n\n// These are set right before calling the component.\nvar renderExpirationTime = NoWork; // The work-in-progress fiber. I've named it differently to distinguish it from\n// the work-in-progress hook.\n\nvar currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The\n// current hook list is the list that belongs to the current fiber. The\n// work-in-progress hook list is a new list that will be added to the\n// work-in-progress fiber.\n\nvar currentHook = null;\nvar workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This\n// does not get reset if we do another render pass; only when we're completely\n// finished evaluating this component. This is an optimization so we know\n// whether we need to clear render phase updates after a throw.\n\nvar didScheduleRenderPhaseUpdate = false;\nvar RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook\n\nvar currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders.\n// The list stores the order of hooks used during the initial render (mount).\n// Subsequent renders (updates) reference this list.\n\nvar hookTypesDev = null;\nvar hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore\n// the dependencies for Hooks that need them (e.g. useEffect or useMemo).\n// When true, such Hooks will always be \"remounted\". Only used during hot reload.\n\nvar ignorePreviousDependencies = false;\n\nfunction mountHookTypesDev() {\n  {\n    var hookName = currentHookNameInDev;\n\n    if (hookTypesDev === null) {\n      hookTypesDev = [hookName];\n    } else {\n      hookTypesDev.push(hookName);\n    }\n  }\n}\n\nfunction updateHookTypesDev() {\n  {\n    var hookName = currentHookNameInDev;\n\n    if (hookTypesDev !== null) {\n      hookTypesUpdateIndexDev++;\n\n      if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {\n        warnOnHookMismatchInDev(hookName);\n      }\n    }\n  }\n}\n\nfunction checkDepsAreArrayDev(deps) {\n  {\n    if (deps !== undefined && deps !== null && !Array.isArray(deps)) {\n      // Verify deps, but only on mount to avoid extra checks.\n      // It's unlikely their type would change as usually you define them inline.\n      error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps);\n    }\n  }\n}\n\nfunction warnOnHookMismatchInDev(currentHookName) {\n  {\n    var componentName = getComponentName(currentlyRenderingFiber$1.type);\n\n    if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {\n      didWarnAboutMismatchedHooksForComponent.add(componentName);\n\n      if (hookTypesDev !== null) {\n        var table = '';\n        var secondColumnStart = 30;\n\n        for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {\n          var oldHookName = hookTypesDev[i];\n          var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;\n          var row = i + 1 + \". \" + oldHookName; // Extra space so second column lines up\n          // lol @ IE not supporting String#repeat\n\n          while (row.length < secondColumnStart) {\n            row += ' ';\n          }\n\n          row += newHookName + '\\n';\n          table += row;\n        }\n\n        error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://fb.me/rules-of-hooks\\n\\n' + '   Previous render            Next render\\n' + '   ------------------------------------------------------\\n' + '%s' + '   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\n', componentName, table);\n      }\n    }\n  }\n}\n\nfunction throwInvalidHookError() {\n  {\n    {\n      throw Error( \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.\" );\n    }\n  }\n}\n\nfunction areHookInputsEqual(nextDeps, prevDeps) {\n  {\n    if (ignorePreviousDependencies) {\n      // Only true when this component is being hot reloaded.\n      return false;\n    }\n  }\n\n  if (prevDeps === null) {\n    {\n      error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);\n    }\n\n    return false;\n  }\n\n  {\n    // Don't bother comparing lengths in prod because these arrays should be\n    // passed inline.\n    if (nextDeps.length !== prevDeps.length) {\n      error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\\n\\n' + 'Previous: %s\\n' + 'Incoming: %s', currentHookNameInDev, \"[\" + prevDeps.join(', ') + \"]\", \"[\" + nextDeps.join(', ') + \"]\");\n    }\n  }\n\n  for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {\n    if (objectIs(nextDeps[i], prevDeps[i])) {\n      continue;\n    }\n\n    return false;\n  }\n\n  return true;\n}\n\nfunction renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderExpirationTime) {\n  renderExpirationTime = nextRenderExpirationTime;\n  currentlyRenderingFiber$1 = workInProgress;\n\n  {\n    hookTypesDev = current !== null ? current._debugHookTypes : null;\n    hookTypesUpdateIndexDev = -1; // Used for hot reloading:\n\n    ignorePreviousDependencies = current !== null && current.type !== workInProgress.type;\n  }\n\n  workInProgress.memoizedState = null;\n  workInProgress.updateQueue = null;\n  workInProgress.expirationTime = NoWork; // The following should have already been reset\n  // currentHook = null;\n  // workInProgressHook = null;\n  // didScheduleRenderPhaseUpdate = false;\n  // TODO Warn if no hooks are used at all during mount, then some are used during update.\n  // Currently we will identify the update render as a mount because memoizedState === null.\n  // This is tricky because it's valid for certain types of components (e.g. React.lazy)\n  // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used.\n  // Non-stateful hooks (e.g. context) don't get added to memoizedState,\n  // so memoizedState would be null during updates and mounts.\n\n  {\n    if (current !== null && current.memoizedState !== null) {\n      ReactCurrentDispatcher.current = HooksDispatcherOnUpdateInDEV;\n    } else if (hookTypesDev !== null) {\n      // This dispatcher handles an edge case where a component is updating,\n      // but no stateful hooks have been used.\n      // We want to match the production code behavior (which will use HooksDispatcherOnMount),\n      // but with the extra DEV validation to ensure hooks ordering hasn't changed.\n      // This dispatcher does that.\n      ReactCurrentDispatcher.current = HooksDispatcherOnMountWithHookTypesInDEV;\n    } else {\n      ReactCurrentDispatcher.current = HooksDispatcherOnMountInDEV;\n    }\n  }\n\n  var children = Component(props, secondArg); // Check if there was a render phase update\n\n  if (workInProgress.expirationTime === renderExpirationTime) {\n    // Keep rendering in a loop for as long as render phase updates continue to\n    // be scheduled. Use a counter to prevent infinite loops.\n    var numberOfReRenders = 0;\n\n    do {\n      workInProgress.expirationTime = NoWork;\n\n      if (!(numberOfReRenders < RE_RENDER_LIMIT)) {\n        {\n          throw Error( \"Too many re-renders. React limits the number of renders to prevent an infinite loop.\" );\n        }\n      }\n\n      numberOfReRenders += 1;\n\n      {\n        // Even when hot reloading, allow dependencies to stabilize\n        // after first render to prevent infinite render phase updates.\n        ignorePreviousDependencies = false;\n      } // Start over from the beginning of the list\n\n\n      currentHook = null;\n      workInProgressHook = null;\n      workInProgress.updateQueue = null;\n\n      {\n        // Also validate hook order for cascading updates.\n        hookTypesUpdateIndexDev = -1;\n      }\n\n      ReactCurrentDispatcher.current =  HooksDispatcherOnRerenderInDEV ;\n      children = Component(props, secondArg);\n    } while (workInProgress.expirationTime === renderExpirationTime);\n  } // We can assume the previous dispatcher is always this one, since we set it\n  // at the beginning of the render phase and there's no re-entrancy.\n\n\n  ReactCurrentDispatcher.current = ContextOnlyDispatcher;\n\n  {\n    workInProgress._debugHookTypes = hookTypesDev;\n  } // This check uses currentHook so that it works the same in DEV and prod bundles.\n  // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.\n\n\n  var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;\n  renderExpirationTime = NoWork;\n  currentlyRenderingFiber$1 = null;\n  currentHook = null;\n  workInProgressHook = null;\n\n  {\n    currentHookNameInDev = null;\n    hookTypesDev = null;\n    hookTypesUpdateIndexDev = -1;\n  }\n\n  didScheduleRenderPhaseUpdate = false;\n\n  if (!!didRenderTooFewHooks) {\n    {\n      throw Error( \"Rendered fewer hooks than expected. This may be caused by an accidental early return statement.\" );\n    }\n  }\n\n  return children;\n}\nfunction bailoutHooks(current, workInProgress, expirationTime) {\n  workInProgress.updateQueue = current.updateQueue;\n  workInProgress.effectTag &= ~(Passive | Update);\n\n  if (current.expirationTime <= expirationTime) {\n    current.expirationTime = NoWork;\n  }\n}\nfunction resetHooksAfterThrow() {\n  // We can assume the previous dispatcher is always this one, since we set it\n  // at the beginning of the render phase and there's no re-entrancy.\n  ReactCurrentDispatcher.current = ContextOnlyDispatcher;\n\n  if (didScheduleRenderPhaseUpdate) {\n    // There were render phase updates. These are only valid for this render\n    // phase, which we are now aborting. Remove the updates from the queues so\n    // they do not persist to the next render. Do not remove updates from hooks\n    // that weren't processed.\n    //\n    // Only reset the updates from the queue if it has a clone. If it does\n    // not have a clone, that means it wasn't processed, and the updates were\n    // scheduled before we entered the render phase.\n    var hook = currentlyRenderingFiber$1.memoizedState;\n\n    while (hook !== null) {\n      var queue = hook.queue;\n\n      if (queue !== null) {\n        queue.pending = null;\n      }\n\n      hook = hook.next;\n    }\n  }\n\n  renderExpirationTime = NoWork;\n  currentlyRenderingFiber$1 = null;\n  currentHook = null;\n  workInProgressHook = null;\n\n  {\n    hookTypesDev = null;\n    hookTypesUpdateIndexDev = -1;\n    currentHookNameInDev = null;\n  }\n\n  didScheduleRenderPhaseUpdate = false;\n}\n\nfunction mountWorkInProgressHook() {\n  var hook = {\n    memoizedState: null,\n    baseState: null,\n    baseQueue: null,\n    queue: null,\n    next: null\n  };\n\n  if (workInProgressHook === null) {\n    // This is the first hook in the list\n    currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook;\n  } else {\n    // Append to the end of the list\n    workInProgressHook = workInProgressHook.next = hook;\n  }\n\n  return workInProgressHook;\n}\n\nfunction updateWorkInProgressHook() {\n  // This function is used both for updates and for re-renders triggered by a\n  // render phase update. It assumes there is either a current hook we can\n  // clone, or a work-in-progress hook from a previous render pass that we can\n  // use as a base. When we reach the end of the base list, we must switch to\n  // the dispatcher used for mounts.\n  var nextCurrentHook;\n\n  if (currentHook === null) {\n    var current = currentlyRenderingFiber$1.alternate;\n\n    if (current !== null) {\n      nextCurrentHook = current.memoizedState;\n    } else {\n      nextCurrentHook = null;\n    }\n  } else {\n    nextCurrentHook = currentHook.next;\n  }\n\n  var nextWorkInProgressHook;\n\n  if (workInProgressHook === null) {\n    nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState;\n  } else {\n    nextWorkInProgressHook = workInProgressHook.next;\n  }\n\n  if (nextWorkInProgressHook !== null) {\n    // There's already a work-in-progress. Reuse it.\n    workInProgressHook = nextWorkInProgressHook;\n    nextWorkInProgressHook = workInProgressHook.next;\n    currentHook = nextCurrentHook;\n  } else {\n    // Clone from the current hook.\n    if (!(nextCurrentHook !== null)) {\n      {\n        throw Error( \"Rendered more hooks than during the previous render.\" );\n      }\n    }\n\n    currentHook = nextCurrentHook;\n    var newHook = {\n      memoizedState: currentHook.memoizedState,\n      baseState: currentHook.baseState,\n      baseQueue: currentHook.baseQueue,\n      queue: currentHook.queue,\n      next: null\n    };\n\n    if (workInProgressHook === null) {\n      // This is the first hook in the list.\n      currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook;\n    } else {\n      // Append to the end of the list.\n      workInProgressHook = workInProgressHook.next = newHook;\n    }\n  }\n\n  return workInProgressHook;\n}\n\nfunction createFunctionComponentUpdateQueue() {\n  return {\n    lastEffect: null\n  };\n}\n\nfunction basicStateReducer(state, action) {\n  // $FlowFixMe: Flow doesn't like mixed types\n  return typeof action === 'function' ? action(state) : action;\n}\n\nfunction mountReducer(reducer, initialArg, init) {\n  var hook = mountWorkInProgressHook();\n  var initialState;\n\n  if (init !== undefined) {\n    initialState = init(initialArg);\n  } else {\n    initialState = initialArg;\n  }\n\n  hook.memoizedState = hook.baseState = initialState;\n  var queue = hook.queue = {\n    pending: null,\n    dispatch: null,\n    lastRenderedReducer: reducer,\n    lastRenderedState: initialState\n  };\n  var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);\n  return [hook.memoizedState, dispatch];\n}\n\nfunction updateReducer(reducer, initialArg, init) {\n  var hook = updateWorkInProgressHook();\n  var queue = hook.queue;\n\n  if (!(queue !== null)) {\n    {\n      throw Error( \"Should have a queue. This is likely a bug in React. Please file an issue.\" );\n    }\n  }\n\n  queue.lastRenderedReducer = reducer;\n  var current = currentHook; // The last rebase update that is NOT part of the base state.\n\n  var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet.\n\n  var pendingQueue = queue.pending;\n\n  if (pendingQueue !== null) {\n    // We have new updates that haven't been processed yet.\n    // We'll add them to the base queue.\n    if (baseQueue !== null) {\n      // Merge the pending queue and the base queue.\n      var baseFirst = baseQueue.next;\n      var pendingFirst = pendingQueue.next;\n      baseQueue.next = pendingFirst;\n      pendingQueue.next = baseFirst;\n    }\n\n    current.baseQueue = baseQueue = pendingQueue;\n    queue.pending = null;\n  }\n\n  if (baseQueue !== null) {\n    // We have a queue to process.\n    var first = baseQueue.next;\n    var newState = current.baseState;\n    var newBaseState = null;\n    var newBaseQueueFirst = null;\n    var newBaseQueueLast = null;\n    var update = first;\n\n    do {\n      var updateExpirationTime = update.expirationTime;\n\n      if (updateExpirationTime < renderExpirationTime) {\n        // Priority is insufficient. Skip this update. If this is the first\n        // skipped update, the previous update/state is the new base\n        // update/state.\n        var clone = {\n          expirationTime: update.expirationTime,\n          suspenseConfig: update.suspenseConfig,\n          action: update.action,\n          eagerReducer: update.eagerReducer,\n          eagerState: update.eagerState,\n          next: null\n        };\n\n        if (newBaseQueueLast === null) {\n          newBaseQueueFirst = newBaseQueueLast = clone;\n          newBaseState = newState;\n        } else {\n          newBaseQueueLast = newBaseQueueLast.next = clone;\n        } // Update the remaining priority in the queue.\n\n\n        if (updateExpirationTime > currentlyRenderingFiber$1.expirationTime) {\n          currentlyRenderingFiber$1.expirationTime = updateExpirationTime;\n          markUnprocessedUpdateTime(updateExpirationTime);\n        }\n      } else {\n        // This update does have sufficient priority.\n        if (newBaseQueueLast !== null) {\n          var _clone = {\n            expirationTime: Sync,\n            // This update is going to be committed so we never want uncommit it.\n            suspenseConfig: update.suspenseConfig,\n            action: update.action,\n            eagerReducer: update.eagerReducer,\n            eagerState: update.eagerState,\n            next: null\n          };\n          newBaseQueueLast = newBaseQueueLast.next = _clone;\n        } // Mark the event time of this update as relevant to this render pass.\n        // TODO: This should ideally use the true event time of this update rather than\n        // its priority which is a derived and not reverseable value.\n        // TODO: We should skip this update if it was already committed but currently\n        // we have no way of detecting the difference between a committed and suspended\n        // update here.\n\n\n        markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.\n\n        if (update.eagerReducer === reducer) {\n          // If this update was processed eagerly, and its reducer matches the\n          // current reducer, we can use the eagerly computed state.\n          newState = update.eagerState;\n        } else {\n          var action = update.action;\n          newState = reducer(newState, action);\n        }\n      }\n\n      update = update.next;\n    } while (update !== null && update !== first);\n\n    if (newBaseQueueLast === null) {\n      newBaseState = newState;\n    } else {\n      newBaseQueueLast.next = newBaseQueueFirst;\n    } // Mark that the fiber performed work, but only if the new state is\n    // different from the current state.\n\n\n    if (!objectIs(newState, hook.memoizedState)) {\n      markWorkInProgressReceivedUpdate();\n    }\n\n    hook.memoizedState = newState;\n    hook.baseState = newBaseState;\n    hook.baseQueue = newBaseQueueLast;\n    queue.lastRenderedState = newState;\n  }\n\n  var dispatch = queue.dispatch;\n  return [hook.memoizedState, dispatch];\n}\n\nfunction rerenderReducer(reducer, initialArg, init) {\n  var hook = updateWorkInProgressHook();\n  var queue = hook.queue;\n\n  if (!(queue !== null)) {\n    {\n      throw Error( \"Should have a queue. This is likely a bug in React. Please file an issue.\" );\n    }\n  }\n\n  queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous\n  // work-in-progress hook.\n\n  var dispatch = queue.dispatch;\n  var lastRenderPhaseUpdate = queue.pending;\n  var newState = hook.memoizedState;\n\n  if (lastRenderPhaseUpdate !== null) {\n    // The queue doesn't persist past this render pass.\n    queue.pending = null;\n    var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next;\n    var update = firstRenderPhaseUpdate;\n\n    do {\n      // Process this render phase update. We don't have to check the\n      // priority because it will always be the same as the current\n      // render's.\n      var action = update.action;\n      newState = reducer(newState, action);\n      update = update.next;\n    } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is\n    // different from the current state.\n\n\n    if (!objectIs(newState, hook.memoizedState)) {\n      markWorkInProgressReceivedUpdate();\n    }\n\n    hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to\n    // the base state unless the queue is empty.\n    // TODO: Not sure if this is the desired semantics, but it's what we\n    // do for gDSFP. I can't remember why.\n\n    if (hook.baseQueue === null) {\n      hook.baseState = newState;\n    }\n\n    queue.lastRenderedState = newState;\n  }\n\n  return [newState, dispatch];\n}\n\nfunction mountState(initialState) {\n  var hook = mountWorkInProgressHook();\n\n  if (typeof initialState === 'function') {\n    // $FlowFixMe: Flow doesn't like mixed types\n    initialState = initialState();\n  }\n\n  hook.memoizedState = hook.baseState = initialState;\n  var queue = hook.queue = {\n    pending: null,\n    dispatch: null,\n    lastRenderedReducer: basicStateReducer,\n    lastRenderedState: initialState\n  };\n  var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);\n  return [hook.memoizedState, dispatch];\n}\n\nfunction updateState(initialState) {\n  return updateReducer(basicStateReducer);\n}\n\nfunction rerenderState(initialState) {\n  return rerenderReducer(basicStateReducer);\n}\n\nfunction pushEffect(tag, create, destroy, deps) {\n  var effect = {\n    tag: tag,\n    create: create,\n    destroy: destroy,\n    deps: deps,\n    // Circular\n    next: null\n  };\n  var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;\n\n  if (componentUpdateQueue === null) {\n    componentUpdateQueue = createFunctionComponentUpdateQueue();\n    currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;\n    componentUpdateQueue.lastEffect = effect.next = effect;\n  } else {\n    var lastEffect = componentUpdateQueue.lastEffect;\n\n    if (lastEffect === null) {\n      componentUpdateQueue.lastEffect = effect.next = effect;\n    } else {\n      var firstEffect = lastEffect.next;\n      lastEffect.next = effect;\n      effect.next = firstEffect;\n      componentUpdateQueue.lastEffect = effect;\n    }\n  }\n\n  return effect;\n}\n\nfunction mountRef(initialValue) {\n  var hook = mountWorkInProgressHook();\n  var ref = {\n    current: initialValue\n  };\n\n  {\n    Object.seal(ref);\n  }\n\n  hook.memoizedState = ref;\n  return ref;\n}\n\nfunction updateRef(initialValue) {\n  var hook = updateWorkInProgressHook();\n  return hook.memoizedState;\n}\n\nfunction mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {\n  var hook = mountWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  currentlyRenderingFiber$1.effectTag |= fiberEffectTag;\n  hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, undefined, nextDeps);\n}\n\nfunction updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {\n  var hook = updateWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var destroy = undefined;\n\n  if (currentHook !== null) {\n    var prevEffect = currentHook.memoizedState;\n    destroy = prevEffect.destroy;\n\n    if (nextDeps !== null) {\n      var prevDeps = prevEffect.deps;\n\n      if (areHookInputsEqual(nextDeps, prevDeps)) {\n        pushEffect(hookEffectTag, create, destroy, nextDeps);\n        return;\n      }\n    }\n  }\n\n  currentlyRenderingFiber$1.effectTag |= fiberEffectTag;\n  hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, destroy, nextDeps);\n}\n\nfunction mountEffect(create, deps) {\n  {\n    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n    if ('undefined' !== typeof jest) {\n      warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);\n    }\n  }\n\n  return mountEffectImpl(Update | Passive, Passive$1, create, deps);\n}\n\nfunction updateEffect(create, deps) {\n  {\n    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n    if ('undefined' !== typeof jest) {\n      warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);\n    }\n  }\n\n  return updateEffectImpl(Update | Passive, Passive$1, create, deps);\n}\n\nfunction mountLayoutEffect(create, deps) {\n  return mountEffectImpl(Update, Layout, create, deps);\n}\n\nfunction updateLayoutEffect(create, deps) {\n  return updateEffectImpl(Update, Layout, create, deps);\n}\n\nfunction imperativeHandleEffect(create, ref) {\n  if (typeof ref === 'function') {\n    var refCallback = ref;\n\n    var _inst = create();\n\n    refCallback(_inst);\n    return function () {\n      refCallback(null);\n    };\n  } else if (ref !== null && ref !== undefined) {\n    var refObject = ref;\n\n    {\n      if (!refObject.hasOwnProperty('current')) {\n        error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}');\n      }\n    }\n\n    var _inst2 = create();\n\n    refObject.current = _inst2;\n    return function () {\n      refObject.current = null;\n    };\n  }\n}\n\nfunction mountImperativeHandle(ref, create, deps) {\n  {\n    if (typeof create !== 'function') {\n      error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');\n    }\n  } // TODO: If deps are provided, should we skip comparing the ref itself?\n\n\n  var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;\n  return mountEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);\n}\n\nfunction updateImperativeHandle(ref, create, deps) {\n  {\n    if (typeof create !== 'function') {\n      error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');\n    }\n  } // TODO: If deps are provided, should we skip comparing the ref itself?\n\n\n  var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;\n  return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);\n}\n\nfunction mountDebugValue(value, formatterFn) {// This hook is normally a no-op.\n  // The react-debug-hooks package injects its own implementation\n  // so that e.g. DevTools can display custom hook values.\n}\n\nvar updateDebugValue = mountDebugValue;\n\nfunction mountCallback(callback, deps) {\n  var hook = mountWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  hook.memoizedState = [callback, nextDeps];\n  return callback;\n}\n\nfunction updateCallback(callback, deps) {\n  var hook = updateWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var prevState = hook.memoizedState;\n\n  if (prevState !== null) {\n    if (nextDeps !== null) {\n      var prevDeps = prevState[1];\n\n      if (areHookInputsEqual(nextDeps, prevDeps)) {\n        return prevState[0];\n      }\n    }\n  }\n\n  hook.memoizedState = [callback, nextDeps];\n  return callback;\n}\n\nfunction mountMemo(nextCreate, deps) {\n  var hook = mountWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var nextValue = nextCreate();\n  hook.memoizedState = [nextValue, nextDeps];\n  return nextValue;\n}\n\nfunction updateMemo(nextCreate, deps) {\n  var hook = updateWorkInProgressHook();\n  var nextDeps = deps === undefined ? null : deps;\n  var prevState = hook.memoizedState;\n\n  if (prevState !== null) {\n    // Assume these are defined. If they're not, areHookInputsEqual will warn.\n    if (nextDeps !== null) {\n      var prevDeps = prevState[1];\n\n      if (areHookInputsEqual(nextDeps, prevDeps)) {\n        return prevState[0];\n      }\n    }\n  }\n\n  var nextValue = nextCreate();\n  hook.memoizedState = [nextValue, nextDeps];\n  return nextValue;\n}\n\nfunction mountDeferredValue(value, config) {\n  var _mountState = mountState(value),\n      prevValue = _mountState[0],\n      setValue = _mountState[1];\n\n  mountEffect(function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setValue(value);\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  }, [value, config]);\n  return prevValue;\n}\n\nfunction updateDeferredValue(value, config) {\n  var _updateState = updateState(),\n      prevValue = _updateState[0],\n      setValue = _updateState[1];\n\n  updateEffect(function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setValue(value);\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  }, [value, config]);\n  return prevValue;\n}\n\nfunction rerenderDeferredValue(value, config) {\n  var _rerenderState = rerenderState(),\n      prevValue = _rerenderState[0],\n      setValue = _rerenderState[1];\n\n  updateEffect(function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setValue(value);\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  }, [value, config]);\n  return prevValue;\n}\n\nfunction startTransition(setPending, config, callback) {\n  var priorityLevel = getCurrentPriorityLevel();\n  runWithPriority$1(priorityLevel < UserBlockingPriority$1 ? UserBlockingPriority$1 : priorityLevel, function () {\n    setPending(true);\n  });\n  runWithPriority$1(priorityLevel > NormalPriority ? NormalPriority : priorityLevel, function () {\n    var previousConfig = ReactCurrentBatchConfig$1.suspense;\n    ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n    try {\n      setPending(false);\n      callback();\n    } finally {\n      ReactCurrentBatchConfig$1.suspense = previousConfig;\n    }\n  });\n}\n\nfunction mountTransition(config) {\n  var _mountState2 = mountState(false),\n      isPending = _mountState2[0],\n      setPending = _mountState2[1];\n\n  var start = mountCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n  return [start, isPending];\n}\n\nfunction updateTransition(config) {\n  var _updateState2 = updateState(),\n      isPending = _updateState2[0],\n      setPending = _updateState2[1];\n\n  var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n  return [start, isPending];\n}\n\nfunction rerenderTransition(config) {\n  var _rerenderState2 = rerenderState(),\n      isPending = _rerenderState2[0],\n      setPending = _rerenderState2[1];\n\n  var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n  return [start, isPending];\n}\n\nfunction dispatchAction(fiber, queue, action) {\n  {\n    if (typeof arguments[3] === 'function') {\n      error(\"State updates from the useState() and useReducer() Hooks don't support the \" + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().');\n    }\n  }\n\n  var currentTime = requestCurrentTimeForUpdate();\n  var suspenseConfig = requestCurrentSuspenseConfig();\n  var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n  var update = {\n    expirationTime: expirationTime,\n    suspenseConfig: suspenseConfig,\n    action: action,\n    eagerReducer: null,\n    eagerState: null,\n    next: null\n  };\n\n  {\n    update.priority = getCurrentPriorityLevel();\n  } // Append the update to the end of the list.\n\n\n  var pending = queue.pending;\n\n  if (pending === null) {\n    // This is the first update. Create a circular list.\n    update.next = update;\n  } else {\n    update.next = pending.next;\n    pending.next = update;\n  }\n\n  queue.pending = update;\n  var alternate = fiber.alternate;\n\n  if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {\n    // This is a render phase update. Stash it in a lazily-created map of\n    // queue -> linked list of updates. After this render pass, we'll restart\n    // and apply the stashed updates on top of the work-in-progress hook.\n    didScheduleRenderPhaseUpdate = true;\n    update.expirationTime = renderExpirationTime;\n    currentlyRenderingFiber$1.expirationTime = renderExpirationTime;\n  } else {\n    if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {\n      // The queue is currently empty, which means we can eagerly compute the\n      // next state before entering the render phase. If the new state is the\n      // same as the current state, we may be able to bail out entirely.\n      var lastRenderedReducer = queue.lastRenderedReducer;\n\n      if (lastRenderedReducer !== null) {\n        var prevDispatcher;\n\n        {\n          prevDispatcher = ReactCurrentDispatcher.current;\n          ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n        }\n\n        try {\n          var currentState = queue.lastRenderedState;\n          var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute\n          // it, on the update object. If the reducer hasn't changed by the\n          // time we enter the render phase, then the eager state can be used\n          // without calling the reducer again.\n\n          update.eagerReducer = lastRenderedReducer;\n          update.eagerState = eagerState;\n\n          if (objectIs(eagerState, currentState)) {\n            // Fast path. We can bail out without scheduling React to re-render.\n            // It's still possible that we'll need to rebase this update later,\n            // if the component re-renders for a different reason and by that\n            // time the reducer has changed.\n            return;\n          }\n        } catch (error) {// Suppress the error. It will throw again in the render phase.\n        } finally {\n          {\n            ReactCurrentDispatcher.current = prevDispatcher;\n          }\n        }\n      }\n    }\n\n    {\n      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n      if ('undefined' !== typeof jest) {\n        warnIfNotScopedWithMatchingAct(fiber);\n        warnIfNotCurrentlyActingUpdatesInDev(fiber);\n      }\n    }\n\n    scheduleWork(fiber, expirationTime);\n  }\n}\n\nvar ContextOnlyDispatcher = {\n  readContext: readContext,\n  useCallback: throwInvalidHookError,\n  useContext: throwInvalidHookError,\n  useEffect: throwInvalidHookError,\n  useImperativeHandle: throwInvalidHookError,\n  useLayoutEffect: throwInvalidHookError,\n  useMemo: throwInvalidHookError,\n  useReducer: throwInvalidHookError,\n  useRef: throwInvalidHookError,\n  useState: throwInvalidHookError,\n  useDebugValue: throwInvalidHookError,\n  useResponder: throwInvalidHookError,\n  useDeferredValue: throwInvalidHookError,\n  useTransition: throwInvalidHookError\n};\nvar HooksDispatcherOnMountInDEV = null;\nvar HooksDispatcherOnMountWithHookTypesInDEV = null;\nvar HooksDispatcherOnUpdateInDEV = null;\nvar HooksDispatcherOnRerenderInDEV = null;\nvar InvalidNestedHooksDispatcherOnMountInDEV = null;\nvar InvalidNestedHooksDispatcherOnUpdateInDEV = null;\nvar InvalidNestedHooksDispatcherOnRerenderInDEV = null;\n\n{\n  var warnInvalidContextAccess = function () {\n    error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');\n  };\n\n  var warnInvalidHookAccess = function () {\n    error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://fb.me/rules-of-hooks');\n  };\n\n  HooksDispatcherOnMountInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      mountHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      return mountLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      mountHookTypesDev();\n      checkDepsAreArrayDev(deps);\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      mountHookTypesDev();\n      return mountRef(initialValue);\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      mountHookTypesDev();\n      return mountDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      mountHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      mountHookTypesDev();\n      return mountDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      mountHookTypesDev();\n      return mountTransition(config);\n    }\n  };\n  HooksDispatcherOnMountWithHookTypesInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      updateHookTypesDev();\n      return mountCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      updateHookTypesDev();\n      return mountEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      updateHookTypesDev();\n      return mountImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      updateHookTypesDev();\n      return mountLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      updateHookTypesDev();\n      return mountRef(initialValue);\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      updateHookTypesDev();\n      return mountDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      updateHookTypesDev();\n      return mountDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      updateHookTypesDev();\n      return mountTransition(config);\n    }\n  };\n  HooksDispatcherOnUpdateInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      updateHookTypesDev();\n      return updateDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      updateHookTypesDev();\n      return updateTransition(config);\n    }\n  };\n  HooksDispatcherOnRerenderInDEV = {\n    readContext: function (context, observedBits) {\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n      try {\n        return rerenderReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n      try {\n        return rerenderState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      updateHookTypesDev();\n      return rerenderDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      updateHookTypesDev();\n      return rerenderTransition(config);\n    }\n  };\n  InvalidNestedHooksDispatcherOnMountInDEV = {\n    readContext: function (context, observedBits) {\n      warnInvalidContextAccess();\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountRef(initialValue);\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n      try {\n        return mountState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      warnInvalidHookAccess();\n      mountHookTypesDev();\n      return mountTransition(config);\n    }\n  };\n  InvalidNestedHooksDispatcherOnUpdateInDEV = {\n    readContext: function (context, observedBits) {\n      warnInvalidContextAccess();\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateTransition(config);\n    }\n  };\n  InvalidNestedHooksDispatcherOnRerenderInDEV = {\n    readContext: function (context, observedBits) {\n      warnInvalidContextAccess();\n      return readContext(context, observedBits);\n    },\n    useCallback: function (callback, deps) {\n      currentHookNameInDev = 'useCallback';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateCallback(callback, deps);\n    },\n    useContext: function (context, observedBits) {\n      currentHookNameInDev = 'useContext';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return readContext(context, observedBits);\n    },\n    useEffect: function (create, deps) {\n      currentHookNameInDev = 'useEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateEffect(create, deps);\n    },\n    useImperativeHandle: function (ref, create, deps) {\n      currentHookNameInDev = 'useImperativeHandle';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateImperativeHandle(ref, create, deps);\n    },\n    useLayoutEffect: function (create, deps) {\n      currentHookNameInDev = 'useLayoutEffect';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateLayoutEffect(create, deps);\n    },\n    useMemo: function (create, deps) {\n      currentHookNameInDev = 'useMemo';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return updateMemo(create, deps);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useReducer: function (reducer, initialArg, init) {\n      currentHookNameInDev = 'useReducer';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return rerenderReducer(reducer, initialArg, init);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useRef: function (initialValue) {\n      currentHookNameInDev = 'useRef';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateRef();\n    },\n    useState: function (initialState) {\n      currentHookNameInDev = 'useState';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      var prevDispatcher = ReactCurrentDispatcher.current;\n      ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n      try {\n        return rerenderState(initialState);\n      } finally {\n        ReactCurrentDispatcher.current = prevDispatcher;\n      }\n    },\n    useDebugValue: function (value, formatterFn) {\n      currentHookNameInDev = 'useDebugValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return updateDebugValue();\n    },\n    useResponder: function (responder, props) {\n      currentHookNameInDev = 'useResponder';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return createDeprecatedResponderListener(responder, props);\n    },\n    useDeferredValue: function (value, config) {\n      currentHookNameInDev = 'useDeferredValue';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return rerenderDeferredValue(value, config);\n    },\n    useTransition: function (config) {\n      currentHookNameInDev = 'useTransition';\n      warnInvalidHookAccess();\n      updateHookTypesDev();\n      return rerenderTransition(config);\n    }\n  };\n}\n\nvar now$1 = Scheduler.unstable_now;\nvar commitTime = 0;\nvar profilerStartTime = -1;\n\nfunction getCommitTime() {\n  return commitTime;\n}\n\nfunction recordCommitTime() {\n\n  commitTime = now$1();\n}\n\nfunction startProfilerTimer(fiber) {\n\n  profilerStartTime = now$1();\n\n  if (fiber.actualStartTime < 0) {\n    fiber.actualStartTime = now$1();\n  }\n}\n\nfunction stopProfilerTimerIfRunning(fiber) {\n\n  profilerStartTime = -1;\n}\n\nfunction stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {\n\n  if (profilerStartTime >= 0) {\n    var elapsedTime = now$1() - profilerStartTime;\n    fiber.actualDuration += elapsedTime;\n\n    if (overrideBaseTime) {\n      fiber.selfBaseDuration = elapsedTime;\n    }\n\n    profilerStartTime = -1;\n  }\n}\n\n// This may have been an insertion or a hydration.\n\nvar hydrationParentFiber = null;\nvar nextHydratableInstance = null;\nvar isHydrating = false;\n\nfunction enterHydrationState(fiber) {\n\n  var parentInstance = fiber.stateNode.containerInfo;\n  nextHydratableInstance = getFirstHydratableChild(parentInstance);\n  hydrationParentFiber = fiber;\n  isHydrating = true;\n  return true;\n}\n\nfunction deleteHydratableInstance(returnFiber, instance) {\n  {\n    switch (returnFiber.tag) {\n      case HostRoot:\n        didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);\n        break;\n\n      case HostComponent:\n        didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);\n        break;\n    }\n  }\n\n  var childToDelete = createFiberFromHostInstanceForDeletion();\n  childToDelete.stateNode = instance;\n  childToDelete.return = returnFiber;\n  childToDelete.effectTag = Deletion; // This might seem like it belongs on progressedFirstDeletion. However,\n  // these children are not part of the reconciliation list of children.\n  // Even if we abort and rereconcile the children, that will try to hydrate\n  // again and the nodes are still in the host tree so these will be\n  // recreated.\n\n  if (returnFiber.lastEffect !== null) {\n    returnFiber.lastEffect.nextEffect = childToDelete;\n    returnFiber.lastEffect = childToDelete;\n  } else {\n    returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n  }\n}\n\nfunction insertNonHydratedInstance(returnFiber, fiber) {\n  fiber.effectTag = fiber.effectTag & ~Hydrating | Placement;\n\n  {\n    switch (returnFiber.tag) {\n      case HostRoot:\n        {\n          var parentContainer = returnFiber.stateNode.containerInfo;\n\n          switch (fiber.tag) {\n            case HostComponent:\n              var type = fiber.type;\n              var props = fiber.pendingProps;\n              didNotFindHydratableContainerInstance(parentContainer, type);\n              break;\n\n            case HostText:\n              var text = fiber.pendingProps;\n              didNotFindHydratableContainerTextInstance(parentContainer, text);\n              break;\n          }\n\n          break;\n        }\n\n      case HostComponent:\n        {\n          var parentType = returnFiber.type;\n          var parentProps = returnFiber.memoizedProps;\n          var parentInstance = returnFiber.stateNode;\n\n          switch (fiber.tag) {\n            case HostComponent:\n              var _type = fiber.type;\n              var _props = fiber.pendingProps;\n              didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type);\n              break;\n\n            case HostText:\n              var _text = fiber.pendingProps;\n              didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);\n              break;\n\n            case SuspenseComponent:\n              didNotFindHydratableSuspenseInstance(parentType, parentProps);\n              break;\n          }\n\n          break;\n        }\n\n      default:\n        return;\n    }\n  }\n}\n\nfunction tryHydrate(fiber, nextInstance) {\n  switch (fiber.tag) {\n    case HostComponent:\n      {\n        var type = fiber.type;\n        var props = fiber.pendingProps;\n        var instance = canHydrateInstance(nextInstance, type);\n\n        if (instance !== null) {\n          fiber.stateNode = instance;\n          return true;\n        }\n\n        return false;\n      }\n\n    case HostText:\n      {\n        var text = fiber.pendingProps;\n        var textInstance = canHydrateTextInstance(nextInstance, text);\n\n        if (textInstance !== null) {\n          fiber.stateNode = textInstance;\n          return true;\n        }\n\n        return false;\n      }\n\n    case SuspenseComponent:\n      {\n\n        return false;\n      }\n\n    default:\n      return false;\n  }\n}\n\nfunction tryToClaimNextHydratableInstance(fiber) {\n  if (!isHydrating) {\n    return;\n  }\n\n  var nextInstance = nextHydratableInstance;\n\n  if (!nextInstance) {\n    // Nothing to hydrate. Make it an insertion.\n    insertNonHydratedInstance(hydrationParentFiber, fiber);\n    isHydrating = false;\n    hydrationParentFiber = fiber;\n    return;\n  }\n\n  var firstAttemptedInstance = nextInstance;\n\n  if (!tryHydrate(fiber, nextInstance)) {\n    // If we can't hydrate this instance let's try the next one.\n    // We use this as a heuristic. It's based on intuition and not data so it\n    // might be flawed or unnecessary.\n    nextInstance = getNextHydratableSibling(firstAttemptedInstance);\n\n    if (!nextInstance || !tryHydrate(fiber, nextInstance)) {\n      // Nothing to hydrate. Make it an insertion.\n      insertNonHydratedInstance(hydrationParentFiber, fiber);\n      isHydrating = false;\n      hydrationParentFiber = fiber;\n      return;\n    } // We matched the next one, we'll now assume that the first one was\n    // superfluous and we'll delete it. Since we can't eagerly delete it\n    // we'll have to schedule a deletion. To do that, this node needs a dummy\n    // fiber associated with it.\n\n\n    deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);\n  }\n\n  hydrationParentFiber = fiber;\n  nextHydratableInstance = getFirstHydratableChild(nextInstance);\n}\n\nfunction prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {\n\n  var instance = fiber.stateNode;\n  var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component.\n\n  fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there\n  // is a new ref we mark this as an update.\n\n  if (updatePayload !== null) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction prepareToHydrateHostTextInstance(fiber) {\n\n  var textInstance = fiber.stateNode;\n  var textContent = fiber.memoizedProps;\n  var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);\n\n  {\n    if (shouldUpdate) {\n      // We assume that prepareToHydrateHostTextInstance is called in a context where the\n      // hydration parent is the parent host component of this host text.\n      var returnFiber = hydrationParentFiber;\n\n      if (returnFiber !== null) {\n        switch (returnFiber.tag) {\n          case HostRoot:\n            {\n              var parentContainer = returnFiber.stateNode.containerInfo;\n              didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);\n              break;\n            }\n\n          case HostComponent:\n            {\n              var parentType = returnFiber.type;\n              var parentProps = returnFiber.memoizedProps;\n              var parentInstance = returnFiber.stateNode;\n              didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);\n              break;\n            }\n        }\n      }\n    }\n  }\n\n  return shouldUpdate;\n}\n\nfunction skipPastDehydratedSuspenseInstance(fiber) {\n\n  var suspenseState = fiber.memoizedState;\n  var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;\n\n  if (!suspenseInstance) {\n    {\n      throw Error( \"Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);\n}\n\nfunction popToNextHostParent(fiber) {\n  var parent = fiber.return;\n\n  while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {\n    parent = parent.return;\n  }\n\n  hydrationParentFiber = parent;\n}\n\nfunction popHydrationState(fiber) {\n\n  if (fiber !== hydrationParentFiber) {\n    // We're deeper than the current hydration context, inside an inserted\n    // tree.\n    return false;\n  }\n\n  if (!isHydrating) {\n    // If we're not currently hydrating but we're in a hydration context, then\n    // we were an insertion and now need to pop up reenter hydration of our\n    // siblings.\n    popToNextHostParent(fiber);\n    isHydrating = true;\n    return false;\n  }\n\n  var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now.\n  // We only do this deeper than head and body since they tend to have random\n  // other nodes in them. We also ignore components with pure text content in\n  // side of them.\n  // TODO: Better heuristic.\n\n  if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {\n    var nextInstance = nextHydratableInstance;\n\n    while (nextInstance) {\n      deleteHydratableInstance(fiber, nextInstance);\n      nextInstance = getNextHydratableSibling(nextInstance);\n    }\n  }\n\n  popToNextHostParent(fiber);\n\n  if (fiber.tag === SuspenseComponent) {\n    nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);\n  } else {\n    nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;\n  }\n\n  return true;\n}\n\nfunction resetHydrationState() {\n\n  hydrationParentFiber = null;\n  nextHydratableInstance = null;\n  isHydrating = false;\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar didReceiveUpdate = false;\nvar didWarnAboutBadClass;\nvar didWarnAboutModulePatternComponent;\nvar didWarnAboutContextTypeOnFunctionComponent;\nvar didWarnAboutGetDerivedStateOnFunctionComponent;\nvar didWarnAboutFunctionRefs;\nvar didWarnAboutReassigningProps;\nvar didWarnAboutRevealOrder;\nvar didWarnAboutTailOptions;\n\n{\n  didWarnAboutBadClass = {};\n  didWarnAboutModulePatternComponent = {};\n  didWarnAboutContextTypeOnFunctionComponent = {};\n  didWarnAboutGetDerivedStateOnFunctionComponent = {};\n  didWarnAboutFunctionRefs = {};\n  didWarnAboutReassigningProps = false;\n  didWarnAboutRevealOrder = {};\n  didWarnAboutTailOptions = {};\n}\n\nfunction reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime) {\n  if (current === null) {\n    // If this is a fresh new component that hasn't been rendered yet, we\n    // won't update its child set by applying minimal side-effects. Instead,\n    // we will add them all to the child before it gets rendered. That means\n    // we can optimize this reconciliation pass by not tracking side-effects.\n    workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n  } else {\n    // If the current child is the same as the work in progress, it means that\n    // we haven't yet started any work on these children. Therefore, we use\n    // the clone algorithm to create a copy of all the current children.\n    // If we had any progressed work already, that is invalid at this point so\n    // let's throw it out.\n    workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderExpirationTime);\n  }\n}\n\nfunction forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime) {\n  // This function is fork of reconcileChildren. It's used in cases where we\n  // want to reconcile without matching against the existing set. This has the\n  // effect of all current children being unmounted; even if the type and key\n  // are the same, the old child is unmounted and a new child is created.\n  //\n  // To do this, we're going to go through the reconcile algorithm twice. In\n  // the first pass, we schedule a deletion for all the current children by\n  // passing null.\n  workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderExpirationTime); // In the second pass, we mount the new children. The trick here is that we\n  // pass null in place of where we usually pass the current child set. This has\n  // the effect of remounting all children regardless of whether their\n  // identities match.\n\n  workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n}\n\nfunction updateForwardRef(current, workInProgress, Component, nextProps, renderExpirationTime) {\n  // TODO: current can be non-null here even if the component\n  // hasn't yet mounted. This happens after the first render suspends.\n  // We'll need to figure out if this is fine or can cause issues.\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var innerPropTypes = Component.propTypes;\n\n      if (innerPropTypes) {\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(Component), getCurrentFiberStackInDev);\n      }\n    }\n  }\n\n  var render = Component.render;\n  var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent\n\n  var nextChildren;\n  prepareToReadContext(workInProgress, renderExpirationTime);\n\n  {\n    ReactCurrentOwner$1.current = workInProgress;\n    setIsRendering(true);\n    nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);\n\n    if ( workInProgress.mode & StrictMode) {\n      // Only double-render components with Hooks\n      if (workInProgress.memoizedState !== null) {\n        nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);\n      }\n    }\n\n    setIsRendering(false);\n  }\n\n  if (current !== null && !didReceiveUpdate) {\n    bailoutHooks(current, workInProgress, renderExpirationTime);\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {\n  if (current === null) {\n    var type = Component.type;\n\n    if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either.\n    Component.defaultProps === undefined) {\n      var resolvedType = type;\n\n      {\n        resolvedType = resolveFunctionForHotReloading(type);\n      } // If this is a plain function component without default props,\n      // and with only the default shallow comparison, we upgrade it\n      // to a SimpleMemoComponent to allow fast path updates.\n\n\n      workInProgress.tag = SimpleMemoComponent;\n      workInProgress.type = resolvedType;\n\n      {\n        validateFunctionComponentInDev(workInProgress, type);\n      }\n\n      return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, updateExpirationTime, renderExpirationTime);\n    }\n\n    {\n      var innerPropTypes = type.propTypes;\n\n      if (innerPropTypes) {\n        // Inner memo component props aren't currently validated in createElement.\n        // We could move it there, but we'd still need this for lazy code path.\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(type), getCurrentFiberStackInDev);\n      }\n    }\n\n    var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);\n    child.ref = workInProgress.ref;\n    child.return = workInProgress;\n    workInProgress.child = child;\n    return child;\n  }\n\n  {\n    var _type = Component.type;\n    var _innerPropTypes = _type.propTypes;\n\n    if (_innerPropTypes) {\n      // Inner memo component props aren't currently validated in createElement.\n      // We could move it there, but we'd still need this for lazy code path.\n      checkPropTypes(_innerPropTypes, nextProps, // Resolved props\n      'prop', getComponentName(_type), getCurrentFiberStackInDev);\n    }\n  }\n\n  var currentChild = current.child; // This is always exactly one child\n\n  if (updateExpirationTime < renderExpirationTime) {\n    // This will be the props with resolved defaultProps,\n    // unlike current.memoizedProps which will be the unresolved ones.\n    var prevProps = currentChild.memoizedProps; // Default to shallow comparison\n\n    var compare = Component.compare;\n    compare = compare !== null ? compare : shallowEqual;\n\n    if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) {\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    }\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  var newChild = createWorkInProgress(currentChild, nextProps);\n  newChild.ref = workInProgress.ref;\n  newChild.return = workInProgress;\n  workInProgress.child = newChild;\n  return newChild;\n}\n\nfunction updateSimpleMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {\n  // TODO: current can be non-null here even if the component\n  // hasn't yet mounted. This happens when the inner render suspends.\n  // We'll need to figure out if this is fine or can cause issues.\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var outerMemoType = workInProgress.elementType;\n\n      if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {\n        // We warn when you define propTypes on lazy()\n        // so let's just skip over it to find memo() outer wrapper.\n        // Inner props for memo are validated later.\n        outerMemoType = refineResolvedLazyComponent(outerMemoType);\n      }\n\n      var outerPropTypes = outerMemoType && outerMemoType.propTypes;\n\n      if (outerPropTypes) {\n        checkPropTypes(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)\n        'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);\n      } // Inner propTypes will be validated in the function component path.\n\n    }\n  }\n\n  if (current !== null) {\n    var prevProps = current.memoizedProps;\n\n    if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload.\n     workInProgress.type === current.type )) {\n      didReceiveUpdate = false;\n\n      if (updateExpirationTime < renderExpirationTime) {\n        // The pending update priority was cleared at the beginning of\n        // beginWork. We're about to bail out, but there might be additional\n        // updates at a lower priority. Usually, the priority level of the\n        // remaining updates is accumlated during the evaluation of the\n        // component (i.e. when processing the update queue). But since since\n        // we're bailing out early *without* evaluating the component, we need\n        // to account for it here, too. Reset to the value of the current fiber.\n        // NOTE: This only applies to SimpleMemoComponent, not MemoComponent,\n        // because a MemoComponent fiber does not have hooks or an update queue;\n        // rather, it wraps around an inner component, which may or may not\n        // contains hooks.\n        // TODO: Move the reset at in beginWork out of the common path so that\n        // this is no longer necessary.\n        workInProgress.expirationTime = current.expirationTime;\n        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n      }\n    }\n  }\n\n  return updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime);\n}\n\nfunction updateFragment(current, workInProgress, renderExpirationTime) {\n  var nextChildren = workInProgress.pendingProps;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateMode(current, workInProgress, renderExpirationTime) {\n  var nextChildren = workInProgress.pendingProps.children;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateProfiler(current, workInProgress, renderExpirationTime) {\n  {\n    workInProgress.effectTag |= Update;\n  }\n\n  var nextProps = workInProgress.pendingProps;\n  var nextChildren = nextProps.children;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction markRef(current, workInProgress) {\n  var ref = workInProgress.ref;\n\n  if (current === null && ref !== null || current !== null && current.ref !== ref) {\n    // Schedule a Ref effect\n    workInProgress.effectTag |= Ref;\n  }\n}\n\nfunction updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var innerPropTypes = Component.propTypes;\n\n      if (innerPropTypes) {\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(Component), getCurrentFiberStackInDev);\n      }\n    }\n  }\n\n  var context;\n\n  {\n    var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);\n    context = getMaskedContext(workInProgress, unmaskedContext);\n  }\n\n  var nextChildren;\n  prepareToReadContext(workInProgress, renderExpirationTime);\n\n  {\n    ReactCurrentOwner$1.current = workInProgress;\n    setIsRendering(true);\n    nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);\n\n    if ( workInProgress.mode & StrictMode) {\n      // Only double-render components with Hooks\n      if (workInProgress.memoizedState !== null) {\n        nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);\n      }\n    }\n\n    setIsRendering(false);\n  }\n\n  if (current !== null && !didReceiveUpdate) {\n    bailoutHooks(current, workInProgress, renderExpirationTime);\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateClassComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {\n  {\n    if (workInProgress.type !== workInProgress.elementType) {\n      // Lazy component props can't be validated in createElement\n      // because they're only guaranteed to be resolved here.\n      var innerPropTypes = Component.propTypes;\n\n      if (innerPropTypes) {\n        checkPropTypes(innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(Component), getCurrentFiberStackInDev);\n      }\n    }\n  } // Push context providers early to prevent context stack mismatches.\n  // During mounting we don't know the child context yet as the instance doesn't exist.\n  // We will invalidate the child context in finishClassComponent() right after rendering.\n\n\n  var hasContext;\n\n  if (isContextProvider(Component)) {\n    hasContext = true;\n    pushContextProvider(workInProgress);\n  } else {\n    hasContext = false;\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  var instance = workInProgress.stateNode;\n  var shouldUpdate;\n\n  if (instance === null) {\n    if (current !== null) {\n      // A class component without an instance only mounts if it suspended\n      // inside a non-concurrent tree, in an inconsistent state. We want to\n      // treat it like a new mount, even though an empty version of it already\n      // committed. Disconnect the alternate pointers.\n      current.alternate = null;\n      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n      workInProgress.effectTag |= Placement;\n    } // In the initial pass we might need to construct the instance.\n\n\n    constructClassInstance(workInProgress, Component, nextProps);\n    mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n    shouldUpdate = true;\n  } else if (current === null) {\n    // In a resume, we'll already have an instance we can reuse.\n    shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n  } else {\n    shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderExpirationTime);\n  }\n\n  var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);\n\n  {\n    var inst = workInProgress.stateNode;\n\n    if (inst.props !== nextProps) {\n      if (!didWarnAboutReassigningProps) {\n        error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component');\n      }\n\n      didWarnAboutReassigningProps = true;\n    }\n  }\n\n  return nextUnitOfWork;\n}\n\nfunction finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {\n  // Refs should update even if shouldComponentUpdate returns false\n  markRef(current, workInProgress);\n  var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;\n\n  if (!shouldUpdate && !didCaptureError) {\n    // Context providers should defer to sCU for rendering\n    if (hasContext) {\n      invalidateContextProvider(workInProgress, Component, false);\n    }\n\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  }\n\n  var instance = workInProgress.stateNode; // Rerender\n\n  ReactCurrentOwner$1.current = workInProgress;\n  var nextChildren;\n\n  if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {\n    // If we captured an error, but getDerivedStateFromError is not defined,\n    // unmount all the children. componentDidCatch will schedule an update to\n    // re-render a fallback. This is temporary until we migrate everyone to\n    // the new API.\n    // TODO: Warn in a future release.\n    nextChildren = null;\n\n    {\n      stopProfilerTimerIfRunning();\n    }\n  } else {\n    {\n      setIsRendering(true);\n      nextChildren = instance.render();\n\n      if ( workInProgress.mode & StrictMode) {\n        instance.render();\n      }\n\n      setIsRendering(false);\n    }\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n\n  if (current !== null && didCaptureError) {\n    // If we're recovering from an error, reconcile without reusing any of\n    // the existing children. Conceptually, the normal children and the children\n    // that are shown on error are two different sets, so we shouldn't reuse\n    // normal children even if their identities match.\n    forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime);\n  } else {\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  } // Memoize state using the values we just used to render.\n  // TODO: Restructure so we never read values from the instance.\n\n\n  workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it.\n\n  if (hasContext) {\n    invalidateContextProvider(workInProgress, Component, true);\n  }\n\n  return workInProgress.child;\n}\n\nfunction pushHostRootContext(workInProgress) {\n  var root = workInProgress.stateNode;\n\n  if (root.pendingContext) {\n    pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);\n  } else if (root.context) {\n    // Should always be set\n    pushTopLevelContextObject(workInProgress, root.context, false);\n  }\n\n  pushHostContainer(workInProgress, root.containerInfo);\n}\n\nfunction updateHostRoot(current, workInProgress, renderExpirationTime) {\n  pushHostRootContext(workInProgress);\n  var updateQueue = workInProgress.updateQueue;\n\n  if (!(current !== null && updateQueue !== null)) {\n    {\n      throw Error( \"If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n\n  var nextProps = workInProgress.pendingProps;\n  var prevState = workInProgress.memoizedState;\n  var prevChildren = prevState !== null ? prevState.element : null;\n  cloneUpdateQueue(current, workInProgress);\n  processUpdateQueue(workInProgress, nextProps, null, renderExpirationTime);\n  var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property\n  // being called \"element\".\n\n  var nextChildren = nextState.element;\n\n  if (nextChildren === prevChildren) {\n    // If the state is the same as before, that's a bailout because we had\n    // no work that expires at this time.\n    resetHydrationState();\n    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n  }\n\n  var root = workInProgress.stateNode;\n\n  if (root.hydrate && enterHydrationState(workInProgress)) {\n    // If we don't have any current children this might be the first pass.\n    // We always try to hydrate. If this isn't a hydration pass there won't\n    // be any children to hydrate which is effectively the same thing as\n    // not hydrating.\n    var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n    workInProgress.child = child;\n    var node = child;\n\n    while (node) {\n      // Mark each child as hydrating. This is a fast path to know whether this\n      // tree is part of a hydrating tree. This is used to determine if a child\n      // node has fully mounted yet, and for scheduling event replaying.\n      // Conceptually this is similar to Placement in that a new subtree is\n      // inserted into the React tree here. It just happens to not need DOM\n      // mutations because it already exists.\n      node.effectTag = node.effectTag & ~Placement | Hydrating;\n      node = node.sibling;\n    }\n  } else {\n    // Otherwise reset hydration state in case we aborted and resumed another\n    // root.\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    resetHydrationState();\n  }\n\n  return workInProgress.child;\n}\n\nfunction updateHostComponent(current, workInProgress, renderExpirationTime) {\n  pushHostContext(workInProgress);\n\n  if (current === null) {\n    tryToClaimNextHydratableInstance(workInProgress);\n  }\n\n  var type = workInProgress.type;\n  var nextProps = workInProgress.pendingProps;\n  var prevProps = current !== null ? current.memoizedProps : null;\n  var nextChildren = nextProps.children;\n  var isDirectTextChild = shouldSetTextContent(type, nextProps);\n\n  if (isDirectTextChild) {\n    // We special case a direct text child of a host node. This is a common\n    // case. We won't handle it as a reified child. We will instead handle\n    // this in the host environment that also has access to this prop. That\n    // avoids allocating another HostText fiber and traversing it.\n    nextChildren = null;\n  } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {\n    // If we're switching from a direct text child to a normal child, or to\n    // empty, we need to schedule the text content to be reset.\n    workInProgress.effectTag |= ContentReset;\n  }\n\n  markRef(current, workInProgress); // Check the host config to see if the children are offscreen/hidden.\n\n  if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(type, nextProps)) {\n    {\n      markSpawnedWork(Never);\n    } // Schedule this fiber to re-render at offscreen priority. Then bailout.\n\n\n    workInProgress.expirationTime = workInProgress.childExpirationTime = Never;\n    return null;\n  }\n\n  reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction updateHostText(current, workInProgress) {\n  if (current === null) {\n    tryToClaimNextHydratableInstance(workInProgress);\n  } // Nothing to do here. This is terminal. We'll do the completion step\n  // immediately after.\n\n\n  return null;\n}\n\nfunction mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {\n  if (_current !== null) {\n    // A lazy component only mounts if it suspended inside a non-\n    // concurrent tree, in an inconsistent state. We want to treat it like\n    // a new mount, even though an empty version of it already committed.\n    // Disconnect the alternate pointers.\n    _current.alternate = null;\n    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n    workInProgress.effectTag |= Placement;\n  }\n\n  var props = workInProgress.pendingProps; // We can't start a User Timing measurement with correct label yet.\n  // Cancel and resume right after we know the tag.\n\n  cancelWorkTimer(workInProgress);\n  var Component = readLazyComponentType(elementType); // Store the unwrapped component in the type.\n\n  workInProgress.type = Component;\n  var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);\n  startWorkTimer(workInProgress);\n  var resolvedProps = resolveDefaultProps(Component, props);\n  var child;\n\n  switch (resolvedTag) {\n    case FunctionComponent:\n      {\n        {\n          validateFunctionComponentInDev(workInProgress, Component);\n          workInProgress.type = Component = resolveFunctionForHotReloading(Component);\n        }\n\n        child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n        return child;\n      }\n\n    case ClassComponent:\n      {\n        {\n          workInProgress.type = Component = resolveClassForHotReloading(Component);\n        }\n\n        child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n        return child;\n      }\n\n    case ForwardRef:\n      {\n        {\n          workInProgress.type = Component = resolveForwardRefForHotReloading(Component);\n        }\n\n        child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n        return child;\n      }\n\n    case MemoComponent:\n      {\n        {\n          if (workInProgress.type !== workInProgress.elementType) {\n            var outerPropTypes = Component.propTypes;\n\n            if (outerPropTypes) {\n              checkPropTypes(outerPropTypes, resolvedProps, // Resolved for outer only\n              'prop', getComponentName(Component), getCurrentFiberStackInDev);\n            }\n          }\n        }\n\n        child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too\n        updateExpirationTime, renderExpirationTime);\n        return child;\n      }\n  }\n\n  var hint = '';\n\n  {\n    if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {\n      hint = ' Did you wrap a component in React.lazy() more than once?';\n    }\n  } // This message intentionally doesn't mention ForwardRef or MemoComponent\n  // because the fact that it's a separate type of work is an\n  // implementation detail.\n\n\n  {\n    {\n      throw Error( \"Element type is invalid. Received a promise that resolves to: \" + Component + \". Lazy element type must resolve to a class or function.\" + hint );\n    }\n  }\n}\n\nfunction mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {\n  if (_current !== null) {\n    // An incomplete component only mounts if it suspended inside a non-\n    // concurrent tree, in an inconsistent state. We want to treat it like\n    // a new mount, even though an empty version of it already committed.\n    // Disconnect the alternate pointers.\n    _current.alternate = null;\n    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n    workInProgress.effectTag |= Placement;\n  } // Promote the fiber to a class and try rendering again.\n\n\n  workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent`\n  // Push context providers early to prevent context stack mismatches.\n  // During mounting we don't know the child context yet as the instance doesn't exist.\n  // We will invalidate the child context in finishClassComponent() right after rendering.\n\n  var hasContext;\n\n  if (isContextProvider(Component)) {\n    hasContext = true;\n    pushContextProvider(workInProgress);\n  } else {\n    hasContext = false;\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  constructClassInstance(workInProgress, Component, nextProps);\n  mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n  return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);\n}\n\nfunction mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {\n  if (_current !== null) {\n    // An indeterminate component only mounts if it suspended inside a non-\n    // concurrent tree, in an inconsistent state. We want to treat it like\n    // a new mount, even though an empty version of it already committed.\n    // Disconnect the alternate pointers.\n    _current.alternate = null;\n    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n    workInProgress.effectTag |= Placement;\n  }\n\n  var props = workInProgress.pendingProps;\n  var context;\n\n  {\n    var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);\n    context = getMaskedContext(workInProgress, unmaskedContext);\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  var value;\n\n  {\n    if (Component.prototype && typeof Component.prototype.render === 'function') {\n      var componentName = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutBadClass[componentName]) {\n        error(\"The <%s /> component appears to have a render method, but doesn't extend React.Component. \" + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);\n\n        didWarnAboutBadClass[componentName] = true;\n      }\n    }\n\n    if (workInProgress.mode & StrictMode) {\n      ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);\n    }\n\n    setIsRendering(true);\n    ReactCurrentOwner$1.current = workInProgress;\n    value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);\n    setIsRendering(false);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n\n  if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {\n    {\n      var _componentName = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutModulePatternComponent[_componentName]) {\n        error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + \"If you can't use a class try assigning the prototype on the function as a workaround. \" + \"`%s.prototype = React.Component.prototype`. Don't use an arrow function since it \" + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName);\n\n        didWarnAboutModulePatternComponent[_componentName] = true;\n      }\n    } // Proceed under the assumption that this is a class instance\n\n\n    workInProgress.tag = ClassComponent; // Throw out any hooks that were used.\n\n    workInProgress.memoizedState = null;\n    workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches.\n    // During mounting we don't know the child context yet as the instance doesn't exist.\n    // We will invalidate the child context in finishClassComponent() right after rendering.\n\n    var hasContext = false;\n\n    if (isContextProvider(Component)) {\n      hasContext = true;\n      pushContextProvider(workInProgress);\n    } else {\n      hasContext = false;\n    }\n\n    workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;\n    initializeUpdateQueue(workInProgress);\n    var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n\n    if (typeof getDerivedStateFromProps === 'function') {\n      applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);\n    }\n\n    adoptClassInstance(workInProgress, value);\n    mountClassInstance(workInProgress, Component, props, renderExpirationTime);\n    return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);\n  } else {\n    // Proceed under the assumption that this is a function component\n    workInProgress.tag = FunctionComponent;\n\n    {\n\n      if ( workInProgress.mode & StrictMode) {\n        // Only double-render components with Hooks\n        if (workInProgress.memoizedState !== null) {\n          value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);\n        }\n      }\n    }\n\n    reconcileChildren(null, workInProgress, value, renderExpirationTime);\n\n    {\n      validateFunctionComponentInDev(workInProgress, Component);\n    }\n\n    return workInProgress.child;\n  }\n}\n\nfunction validateFunctionComponentInDev(workInProgress, Component) {\n  {\n    if (Component) {\n      if (Component.childContextTypes) {\n        error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');\n      }\n    }\n\n    if (workInProgress.ref !== null) {\n      var info = '';\n      var ownerName = getCurrentFiberOwnerNameInDevOrNull();\n\n      if (ownerName) {\n        info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n      }\n\n      var warningKey = ownerName || workInProgress._debugID || '';\n      var debugSource = workInProgress._debugSource;\n\n      if (debugSource) {\n        warningKey = debugSource.fileName + ':' + debugSource.lineNumber;\n      }\n\n      if (!didWarnAboutFunctionRefs[warningKey]) {\n        didWarnAboutFunctionRefs[warningKey] = true;\n\n        error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);\n      }\n    }\n\n    if (typeof Component.getDerivedStateFromProps === 'function') {\n      var _componentName2 = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2]) {\n        error('%s: Function components do not support getDerivedStateFromProps.', _componentName2);\n\n        didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2] = true;\n      }\n    }\n\n    if (typeof Component.contextType === 'object' && Component.contextType !== null) {\n      var _componentName3 = getComponentName(Component) || 'Unknown';\n\n      if (!didWarnAboutContextTypeOnFunctionComponent[_componentName3]) {\n        error('%s: Function components do not support contextType.', _componentName3);\n\n        didWarnAboutContextTypeOnFunctionComponent[_componentName3] = true;\n      }\n    }\n  }\n}\n\nvar SUSPENDED_MARKER = {\n  dehydrated: null,\n  retryTime: NoWork\n};\n\nfunction shouldRemainOnFallback(suspenseContext, current, workInProgress) {\n  // If the context is telling us that we should show a fallback, and we're not\n  // already showing content, then we should show the fallback instead.\n  return hasSuspenseContext(suspenseContext, ForceSuspenseFallback) && (current === null || current.memoizedState !== null);\n}\n\nfunction updateSuspenseComponent(current, workInProgress, renderExpirationTime) {\n  var mode = workInProgress.mode;\n  var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend.\n\n  {\n    if (shouldSuspend(workInProgress)) {\n      workInProgress.effectTag |= DidCapture;\n    }\n  }\n\n  var suspenseContext = suspenseStackCursor.current;\n  var nextDidTimeout = false;\n  var didSuspend = (workInProgress.effectTag & DidCapture) !== NoEffect;\n\n  if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) {\n    // Something in this boundary's subtree already suspended. Switch to\n    // rendering the fallback children.\n    nextDidTimeout = true;\n    workInProgress.effectTag &= ~DidCapture;\n  } else {\n    // Attempting the main content\n    if (current === null || current.memoizedState !== null) {\n      // This is a new mount or this boundary is already showing a fallback state.\n      // Mark this subtree context as having at least one invisible parent that could\n      // handle the fallback state.\n      // Boundaries without fallbacks or should be avoided are not considered since\n      // they cannot handle preferred fallback states.\n      if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) {\n        suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);\n      }\n    }\n  }\n\n  suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n  pushSuspenseContext(workInProgress, suspenseContext); // This next part is a bit confusing. If the children timeout, we switch to\n  // showing the fallback children in place of the \"primary\" children.\n  // However, we don't want to delete the primary children because then their\n  // state will be lost (both the React state and the host state, e.g.\n  // uncontrolled form inputs). Instead we keep them mounted and hide them.\n  // Both the fallback children AND the primary children are rendered at the\n  // same time. Once the primary children are un-suspended, we can delete\n  // the fallback children — don't need to preserve their state.\n  //\n  // The two sets of children are siblings in the host environment, but\n  // semantically, for purposes of reconciliation, they are two separate sets.\n  // So we store them using two fragment fibers.\n  //\n  // However, we want to avoid allocating extra fibers for every placeholder.\n  // They're only necessary when the children time out, because that's the\n  // only time when both sets are mounted.\n  //\n  // So, the extra fragment fibers are only used if the children time out.\n  // Otherwise, we render the primary children directly. This requires some\n  // custom reconciliation logic to preserve the state of the primary\n  // children. It's essentially a very basic form of re-parenting.\n\n  if (current === null) {\n    // If we're currently hydrating, try to hydrate this boundary.\n    // But only if this has a fallback.\n    if (nextProps.fallback !== undefined) {\n      tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component.\n    } // This is the initial mount. This branch is pretty simple because there's\n    // no previous state that needs to be preserved.\n\n\n    if (nextDidTimeout) {\n      // Mount separate fragments for primary and fallback children.\n      var nextFallbackChildren = nextProps.fallback;\n      var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);\n      primaryChildFragment.return = workInProgress;\n\n      if ((workInProgress.mode & BlockingMode) === NoMode) {\n        // Outside of blocking mode, we commit the effects from the\n        // partially completed, timed-out tree, too.\n        var progressedState = workInProgress.memoizedState;\n        var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;\n        primaryChildFragment.child = progressedPrimaryChild;\n        var progressedChild = progressedPrimaryChild;\n\n        while (progressedChild !== null) {\n          progressedChild.return = primaryChildFragment;\n          progressedChild = progressedChild.sibling;\n        }\n      }\n\n      var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);\n      fallbackChildFragment.return = workInProgress;\n      primaryChildFragment.sibling = fallbackChildFragment; // Skip the primary children, and continue working on the\n      // fallback children.\n\n      workInProgress.memoizedState = SUSPENDED_MARKER;\n      workInProgress.child = primaryChildFragment;\n      return fallbackChildFragment;\n    } else {\n      // Mount the primary children without an intermediate fragment fiber.\n      var nextPrimaryChildren = nextProps.children;\n      workInProgress.memoizedState = null;\n      return workInProgress.child = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);\n    }\n  } else {\n    // This is an update. This branch is more complicated because we need to\n    // ensure the state of the primary children is preserved.\n    var prevState = current.memoizedState;\n\n    if (prevState !== null) {\n      // wrapped in a fragment fiber.\n\n\n      var currentPrimaryChildFragment = current.child;\n      var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;\n\n      if (nextDidTimeout) {\n        // Still timed out. Reuse the current primary children by cloning\n        // its fragment. We're going to skip over these entirely.\n        var _nextFallbackChildren2 = nextProps.fallback;\n\n        var _primaryChildFragment2 = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps);\n\n        _primaryChildFragment2.return = workInProgress;\n\n        if ((workInProgress.mode & BlockingMode) === NoMode) {\n          // Outside of blocking mode, we commit the effects from the\n          // partially completed, timed-out tree, too.\n          var _progressedState = workInProgress.memoizedState;\n\n          var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;\n\n          if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {\n            _primaryChildFragment2.child = _progressedPrimaryChild;\n            var _progressedChild2 = _progressedPrimaryChild;\n\n            while (_progressedChild2 !== null) {\n              _progressedChild2.return = _primaryChildFragment2;\n              _progressedChild2 = _progressedChild2.sibling;\n            }\n          }\n        } // Because primaryChildFragment is a new fiber that we're inserting as the\n        // parent of a new tree, we need to set its treeBaseDuration.\n\n\n        if ( workInProgress.mode & ProfileMode) {\n          // treeBaseDuration is the sum of all the child tree base durations.\n          var _treeBaseDuration = 0;\n          var _hiddenChild = _primaryChildFragment2.child;\n\n          while (_hiddenChild !== null) {\n            _treeBaseDuration += _hiddenChild.treeBaseDuration;\n            _hiddenChild = _hiddenChild.sibling;\n          }\n\n          _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;\n        } // Clone the fallback child fragment, too. These we'll continue\n        // working on.\n\n\n        var _fallbackChildFragment2 = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren2);\n\n        _fallbackChildFragment2.return = workInProgress;\n        _primaryChildFragment2.sibling = _fallbackChildFragment2;\n        _primaryChildFragment2.childExpirationTime = NoWork; // Skip the primary children, and continue working on the\n        // fallback children.\n\n        workInProgress.memoizedState = SUSPENDED_MARKER;\n        workInProgress.child = _primaryChildFragment2;\n        return _fallbackChildFragment2;\n      } else {\n        // No longer suspended. Switch back to showing the primary children,\n        // and remove the intermediate fragment fiber.\n        var _nextPrimaryChildren = nextProps.children;\n        var currentPrimaryChild = currentPrimaryChildFragment.child;\n        var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime); // If this render doesn't suspend, we need to delete the fallback\n        // children. Wait until the complete phase, after we've confirmed the\n        // fallback is no longer needed.\n        // TODO: Would it be better to store the fallback fragment on\n        // the stateNode?\n        // Continue rendering the children, like we normally do.\n\n        workInProgress.memoizedState = null;\n        return workInProgress.child = primaryChild;\n      }\n    } else {\n      // The current tree has not already timed out. That means the primary\n      // children are not wrapped in a fragment fiber.\n      var _currentPrimaryChild = current.child;\n\n      if (nextDidTimeout) {\n        // Timed out. Wrap the children in a fragment fiber to keep them\n        // separate from the fallback children.\n        var _nextFallbackChildren3 = nextProps.fallback;\n\n        var _primaryChildFragment3 = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't\n        // going to render this fragment.\n        null, mode, NoWork, null);\n\n        _primaryChildFragment3.return = workInProgress;\n        _primaryChildFragment3.child = _currentPrimaryChild;\n\n        if (_currentPrimaryChild !== null) {\n          _currentPrimaryChild.return = _primaryChildFragment3;\n        } // Even though we're creating a new fiber, there are no new children,\n        // because we're reusing an already mounted tree. So we don't need to\n        // schedule a placement.\n        // primaryChildFragment.effectTag |= Placement;\n\n\n        if ((workInProgress.mode & BlockingMode) === NoMode) {\n          // Outside of blocking mode, we commit the effects from the\n          // partially completed, timed-out tree, too.\n          var _progressedState2 = workInProgress.memoizedState;\n\n          var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;\n\n          _primaryChildFragment3.child = _progressedPrimaryChild2;\n          var _progressedChild3 = _progressedPrimaryChild2;\n\n          while (_progressedChild3 !== null) {\n            _progressedChild3.return = _primaryChildFragment3;\n            _progressedChild3 = _progressedChild3.sibling;\n          }\n        } // Because primaryChildFragment is a new fiber that we're inserting as the\n        // parent of a new tree, we need to set its treeBaseDuration.\n\n\n        if ( workInProgress.mode & ProfileMode) {\n          // treeBaseDuration is the sum of all the child tree base durations.\n          var _treeBaseDuration2 = 0;\n          var _hiddenChild2 = _primaryChildFragment3.child;\n\n          while (_hiddenChild2 !== null) {\n            _treeBaseDuration2 += _hiddenChild2.treeBaseDuration;\n            _hiddenChild2 = _hiddenChild2.sibling;\n          }\n\n          _primaryChildFragment3.treeBaseDuration = _treeBaseDuration2;\n        } // Create a fragment from the fallback children, too.\n\n\n        var _fallbackChildFragment3 = createFiberFromFragment(_nextFallbackChildren3, mode, renderExpirationTime, null);\n\n        _fallbackChildFragment3.return = workInProgress;\n        _primaryChildFragment3.sibling = _fallbackChildFragment3;\n        _fallbackChildFragment3.effectTag |= Placement;\n        _primaryChildFragment3.childExpirationTime = NoWork; // Skip the primary children, and continue working on the\n        // fallback children.\n\n        workInProgress.memoizedState = SUSPENDED_MARKER;\n        workInProgress.child = _primaryChildFragment3;\n        return _fallbackChildFragment3;\n      } else {\n        // Still haven't timed out. Continue rendering the children, like we\n        // normally do.\n        workInProgress.memoizedState = null;\n        var _nextPrimaryChildren2 = nextProps.children;\n        return workInProgress.child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);\n      }\n    }\n  }\n}\n\nfunction scheduleWorkOnFiber(fiber, renderExpirationTime) {\n  if (fiber.expirationTime < renderExpirationTime) {\n    fiber.expirationTime = renderExpirationTime;\n  }\n\n  var alternate = fiber.alternate;\n\n  if (alternate !== null && alternate.expirationTime < renderExpirationTime) {\n    alternate.expirationTime = renderExpirationTime;\n  }\n\n  scheduleWorkOnParentPath(fiber.return, renderExpirationTime);\n}\n\nfunction propagateSuspenseContextChange(workInProgress, firstChild, renderExpirationTime) {\n  // Mark any Suspense boundaries with fallbacks as having work to do.\n  // If they were previously forced into fallbacks, they may now be able\n  // to unblock.\n  var node = firstChild;\n\n  while (node !== null) {\n    if (node.tag === SuspenseComponent) {\n      var state = node.memoizedState;\n\n      if (state !== null) {\n        scheduleWorkOnFiber(node, renderExpirationTime);\n      }\n    } else if (node.tag === SuspenseListComponent) {\n      // If the tail is hidden there might not be an Suspense boundaries\n      // to schedule work on. In this case we have to schedule it on the\n      // list itself.\n      // We don't have to traverse to the children of the list since\n      // the list will propagate the change when it rerenders.\n      scheduleWorkOnFiber(node, renderExpirationTime);\n    } else if (node.child !== null) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === workInProgress) {\n      return;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === workInProgress) {\n        return;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n}\n\nfunction findLastContentRow(firstChild) {\n  // This is going to find the last row among these children that is already\n  // showing content on the screen, as opposed to being in fallback state or\n  // new. If a row has multiple Suspense boundaries, any of them being in the\n  // fallback state, counts as the whole row being in a fallback state.\n  // Note that the \"rows\" will be workInProgress, but any nested children\n  // will still be current since we haven't rendered them yet. The mounted\n  // order may not be the same as the new order. We use the new order.\n  var row = firstChild;\n  var lastContentRow = null;\n\n  while (row !== null) {\n    var currentRow = row.alternate; // New rows can't be content rows.\n\n    if (currentRow !== null && findFirstSuspended(currentRow) === null) {\n      lastContentRow = row;\n    }\n\n    row = row.sibling;\n  }\n\n  return lastContentRow;\n}\n\nfunction validateRevealOrder(revealOrder) {\n  {\n    if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) {\n      didWarnAboutRevealOrder[revealOrder] = true;\n\n      if (typeof revealOrder === 'string') {\n        switch (revealOrder.toLowerCase()) {\n          case 'together':\n          case 'forwards':\n          case 'backwards':\n            {\n              error('\"%s\" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase \"%s\" instead.', revealOrder, revealOrder.toLowerCase());\n\n              break;\n            }\n\n          case 'forward':\n          case 'backward':\n            {\n              error('\"%s\" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use \"%ss\" instead.', revealOrder, revealOrder.toLowerCase());\n\n              break;\n            }\n\n          default:\n            error('\"%s\" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean \"together\", \"forwards\" or \"backwards\"?', revealOrder);\n\n            break;\n        }\n      } else {\n        error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean \"together\", \"forwards\" or \"backwards\"?', revealOrder);\n      }\n    }\n  }\n}\n\nfunction validateTailOptions(tailMode, revealOrder) {\n  {\n    if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) {\n      if (tailMode !== 'collapsed' && tailMode !== 'hidden') {\n        didWarnAboutTailOptions[tailMode] = true;\n\n        error('\"%s\" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean \"collapsed\" or \"hidden\"?', tailMode);\n      } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') {\n        didWarnAboutTailOptions[tailMode] = true;\n\n        error('<SuspenseList tail=\"%s\" /> is only valid if revealOrder is ' + '\"forwards\" or \"backwards\". ' + 'Did you mean to specify revealOrder=\"forwards\"?', tailMode);\n      }\n    }\n  }\n}\n\nfunction validateSuspenseListNestedChild(childSlot, index) {\n  {\n    var isArray = Array.isArray(childSlot);\n    var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function';\n\n    if (isArray || isIterable) {\n      var type = isArray ? 'array' : 'iterable';\n\n      error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type);\n\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction validateSuspenseListChildren(children, revealOrder) {\n  {\n    if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) {\n      if (Array.isArray(children)) {\n        for (var i = 0; i < children.length; i++) {\n          if (!validateSuspenseListNestedChild(children[i], i)) {\n            return;\n          }\n        }\n      } else {\n        var iteratorFn = getIteratorFn(children);\n\n        if (typeof iteratorFn === 'function') {\n          var childrenIterator = iteratorFn.call(children);\n\n          if (childrenIterator) {\n            var step = childrenIterator.next();\n            var _i = 0;\n\n            for (; !step.done; step = childrenIterator.next()) {\n              if (!validateSuspenseListNestedChild(step.value, _i)) {\n                return;\n              }\n\n              _i++;\n            }\n          }\n        } else {\n          error('A single row was passed to a <SuspenseList revealOrder=\"%s\" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder);\n        }\n      }\n    }\n  }\n}\n\nfunction initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) {\n  var renderState = workInProgress.memoizedState;\n\n  if (renderState === null) {\n    workInProgress.memoizedState = {\n      isBackwards: isBackwards,\n      rendering: null,\n      renderingStartTime: 0,\n      last: lastContentRow,\n      tail: tail,\n      tailExpiration: 0,\n      tailMode: tailMode,\n      lastEffect: lastEffectBeforeRendering\n    };\n  } else {\n    // We can reuse the existing object from previous renders.\n    renderState.isBackwards = isBackwards;\n    renderState.rendering = null;\n    renderState.renderingStartTime = 0;\n    renderState.last = lastContentRow;\n    renderState.tail = tail;\n    renderState.tailExpiration = 0;\n    renderState.tailMode = tailMode;\n    renderState.lastEffect = lastEffectBeforeRendering;\n  }\n} // This can end up rendering this component multiple passes.\n// The first pass splits the children fibers into two sets. A head and tail.\n// We first render the head. If anything is in fallback state, we do another\n// pass through beginWork to rerender all children (including the tail) with\n// the force suspend context. If the first render didn't have anything in\n// in fallback state. Then we render each row in the tail one-by-one.\n// That happens in the completeWork phase without going back to beginWork.\n\n\nfunction updateSuspenseListComponent(current, workInProgress, renderExpirationTime) {\n  var nextProps = workInProgress.pendingProps;\n  var revealOrder = nextProps.revealOrder;\n  var tailMode = nextProps.tail;\n  var newChildren = nextProps.children;\n  validateRevealOrder(revealOrder);\n  validateTailOptions(tailMode, revealOrder);\n  validateSuspenseListChildren(newChildren, revealOrder);\n  reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n  var suspenseContext = suspenseStackCursor.current;\n  var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);\n\n  if (shouldForceFallback) {\n    suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);\n    workInProgress.effectTag |= DidCapture;\n  } else {\n    var didSuspendBefore = current !== null && (current.effectTag & DidCapture) !== NoEffect;\n\n    if (didSuspendBefore) {\n      // If we previously forced a fallback, we need to schedule work\n      // on any nested boundaries to let them know to try to render\n      // again. This is the same as context updating.\n      propagateSuspenseContextChange(workInProgress, workInProgress.child, renderExpirationTime);\n    }\n\n    suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n  }\n\n  pushSuspenseContext(workInProgress, suspenseContext);\n\n  if ((workInProgress.mode & BlockingMode) === NoMode) {\n    // Outside of blocking mode, SuspenseList doesn't work so we just\n    // use make it a noop by treating it as the default revealOrder.\n    workInProgress.memoizedState = null;\n  } else {\n    switch (revealOrder) {\n      case 'forwards':\n        {\n          var lastContentRow = findLastContentRow(workInProgress.child);\n          var tail;\n\n          if (lastContentRow === null) {\n            // The whole list is part of the tail.\n            // TODO: We could fast path by just rendering the tail now.\n            tail = workInProgress.child;\n            workInProgress.child = null;\n          } else {\n            // Disconnect the tail rows after the content row.\n            // We're going to render them separately later.\n            tail = lastContentRow.sibling;\n            lastContentRow.sibling = null;\n          }\n\n          initSuspenseListRenderState(workInProgress, false, // isBackwards\n          tail, lastContentRow, tailMode, workInProgress.lastEffect);\n          break;\n        }\n\n      case 'backwards':\n        {\n          // We're going to find the first row that has existing content.\n          // At the same time we're going to reverse the list of everything\n          // we pass in the meantime. That's going to be our tail in reverse\n          // order.\n          var _tail = null;\n          var row = workInProgress.child;\n          workInProgress.child = null;\n\n          while (row !== null) {\n            var currentRow = row.alternate; // New rows can't be content rows.\n\n            if (currentRow !== null && findFirstSuspended(currentRow) === null) {\n              // This is the beginning of the main content.\n              workInProgress.child = row;\n              break;\n            }\n\n            var nextRow = row.sibling;\n            row.sibling = _tail;\n            _tail = row;\n            row = nextRow;\n          } // TODO: If workInProgress.child is null, we can continue on the tail immediately.\n\n\n          initSuspenseListRenderState(workInProgress, true, // isBackwards\n          _tail, null, // last\n          tailMode, workInProgress.lastEffect);\n          break;\n        }\n\n      case 'together':\n        {\n          initSuspenseListRenderState(workInProgress, false, // isBackwards\n          null, // tail\n          null, // last\n          undefined, workInProgress.lastEffect);\n          break;\n        }\n\n      default:\n        {\n          // The default reveal order is the same as not having\n          // a boundary.\n          workInProgress.memoizedState = null;\n        }\n    }\n  }\n\n  return workInProgress.child;\n}\n\nfunction updatePortalComponent(current, workInProgress, renderExpirationTime) {\n  pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n  var nextChildren = workInProgress.pendingProps;\n\n  if (current === null) {\n    // Portals are special because we don't append the children during mount\n    // but at commit. Therefore we need to track insertions which the normal\n    // flow doesn't do during mount. This doesn't happen at the root because\n    // the root always starts with a \"current\" with a null child.\n    // TODO: Consider unifying this with how the root works.\n    workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n  } else {\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n  }\n\n  return workInProgress.child;\n}\n\nfunction updateContextProvider(current, workInProgress, renderExpirationTime) {\n  var providerType = workInProgress.type;\n  var context = providerType._context;\n  var newProps = workInProgress.pendingProps;\n  var oldProps = workInProgress.memoizedProps;\n  var newValue = newProps.value;\n\n  {\n    var providerPropTypes = workInProgress.type.propTypes;\n\n    if (providerPropTypes) {\n      checkPropTypes(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);\n    }\n  }\n\n  pushProvider(workInProgress, newValue);\n\n  if (oldProps !== null) {\n    var oldValue = oldProps.value;\n    var changedBits = calculateChangedBits(context, newValue, oldValue);\n\n    if (changedBits === 0) {\n      // No change. Bailout early if children are the same.\n      if (oldProps.children === newProps.children && !hasContextChanged()) {\n        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n      }\n    } else {\n      // The context value changed. Search for matching consumers and schedule\n      // them to update.\n      propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);\n    }\n  }\n\n  var newChildren = newProps.children;\n  reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nvar hasWarnedAboutUsingContextAsConsumer = false;\n\nfunction updateContextConsumer(current, workInProgress, renderExpirationTime) {\n  var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In\n  // DEV mode, we create a separate object for Context.Consumer that acts\n  // like a proxy to Context. This proxy object adds unnecessary code in PROD\n  // so we use the old behaviour (Context.Consumer references Context) to\n  // reduce size and overhead. The separate object references context via\n  // a property called \"_context\", which also gives us the ability to check\n  // in DEV mode if this property exists or not and warn if it does not.\n\n  {\n    if (context._context === undefined) {\n      // This may be because it's a Context (rather than a Consumer).\n      // Or it may be because it's older React where they're the same thing.\n      // We only want to warn if we're sure it's a new React.\n      if (context !== context.Consumer) {\n        if (!hasWarnedAboutUsingContextAsConsumer) {\n          hasWarnedAboutUsingContextAsConsumer = true;\n\n          error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');\n        }\n      }\n    } else {\n      context = context._context;\n    }\n  }\n\n  var newProps = workInProgress.pendingProps;\n  var render = newProps.children;\n\n  {\n    if (typeof render !== 'function') {\n      error('A context consumer was rendered with multiple children, or a child ' + \"that isn't a function. A context consumer expects a single child \" + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.');\n    }\n  }\n\n  prepareToReadContext(workInProgress, renderExpirationTime);\n  var newValue = readContext(context, newProps.unstable_observedBits);\n  var newChildren;\n\n  {\n    ReactCurrentOwner$1.current = workInProgress;\n    setIsRendering(true);\n    newChildren = render(newValue);\n    setIsRendering(false);\n  } // React DevTools reads this flag.\n\n\n  workInProgress.effectTag |= PerformedWork;\n  reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n  return workInProgress.child;\n}\n\nfunction markWorkInProgressReceivedUpdate() {\n  didReceiveUpdate = true;\n}\n\nfunction bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime) {\n  cancelWorkTimer(workInProgress);\n\n  if (current !== null) {\n    // Reuse previous dependencies\n    workInProgress.dependencies = current.dependencies;\n  }\n\n  {\n    // Don't update \"base\" render times for bailouts.\n    stopProfilerTimerIfRunning();\n  }\n\n  var updateExpirationTime = workInProgress.expirationTime;\n\n  if (updateExpirationTime !== NoWork) {\n    markUnprocessedUpdateTime(updateExpirationTime);\n  } // Check if the children have any pending work.\n\n\n  var childExpirationTime = workInProgress.childExpirationTime;\n\n  if (childExpirationTime < renderExpirationTime) {\n    // The children don't have any work either. We can skip them.\n    // TODO: Once we add back resuming, we should check if the children are\n    // a work-in-progress set. If so, we need to transfer their effects.\n    return null;\n  } else {\n    // This fiber doesn't have work, but its subtree does. Clone the child\n    // fibers and continue.\n    cloneChildFibers(current, workInProgress);\n    return workInProgress.child;\n  }\n}\n\nfunction remountFiber(current, oldWorkInProgress, newWorkInProgress) {\n  {\n    var returnFiber = oldWorkInProgress.return;\n\n    if (returnFiber === null) {\n      throw new Error('Cannot swap the root fiber.');\n    } // Disconnect from the old current.\n    // It will get deleted.\n\n\n    current.alternate = null;\n    oldWorkInProgress.alternate = null; // Connect to the new tree.\n\n    newWorkInProgress.index = oldWorkInProgress.index;\n    newWorkInProgress.sibling = oldWorkInProgress.sibling;\n    newWorkInProgress.return = oldWorkInProgress.return;\n    newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it.\n\n    if (oldWorkInProgress === returnFiber.child) {\n      returnFiber.child = newWorkInProgress;\n    } else {\n      var prevSibling = returnFiber.child;\n\n      if (prevSibling === null) {\n        throw new Error('Expected parent to have a child.');\n      }\n\n      while (prevSibling.sibling !== oldWorkInProgress) {\n        prevSibling = prevSibling.sibling;\n\n        if (prevSibling === null) {\n          throw new Error('Expected to find the previous sibling.');\n        }\n      }\n\n      prevSibling.sibling = newWorkInProgress;\n    } // Delete the old fiber and place the new one.\n    // Since the old fiber is disconnected, we have to schedule it manually.\n\n\n    var last = returnFiber.lastEffect;\n\n    if (last !== null) {\n      last.nextEffect = current;\n      returnFiber.lastEffect = current;\n    } else {\n      returnFiber.firstEffect = returnFiber.lastEffect = current;\n    }\n\n    current.nextEffect = null;\n    current.effectTag = Deletion;\n    newWorkInProgress.effectTag |= Placement; // Restart work from the new fiber.\n\n    return newWorkInProgress;\n  }\n}\n\nfunction beginWork(current, workInProgress, renderExpirationTime) {\n  var updateExpirationTime = workInProgress.expirationTime;\n\n  {\n    if (workInProgress._debugNeedsRemount && current !== null) {\n      // This will restart the begin phase with a new fiber.\n      return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.expirationTime));\n    }\n  }\n\n  if (current !== null) {\n    var oldProps = current.memoizedProps;\n    var newProps = workInProgress.pendingProps;\n\n    if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload:\n     workInProgress.type !== current.type )) {\n      // If props or context changed, mark the fiber as having performed work.\n      // This may be unset if the props are determined to be equal later (memo).\n      didReceiveUpdate = true;\n    } else if (updateExpirationTime < renderExpirationTime) {\n      didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering\n      // the begin phase. There's still some bookkeeping we that needs to be done\n      // in this optimized path, mostly pushing stuff onto the stack.\n\n      switch (workInProgress.tag) {\n        case HostRoot:\n          pushHostRootContext(workInProgress);\n          resetHydrationState();\n          break;\n\n        case HostComponent:\n          pushHostContext(workInProgress);\n\n          if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(workInProgress.type, newProps)) {\n            {\n              markSpawnedWork(Never);\n            } // Schedule this fiber to re-render at offscreen priority. Then bailout.\n\n\n            workInProgress.expirationTime = workInProgress.childExpirationTime = Never;\n            return null;\n          }\n\n          break;\n\n        case ClassComponent:\n          {\n            var Component = workInProgress.type;\n\n            if (isContextProvider(Component)) {\n              pushContextProvider(workInProgress);\n            }\n\n            break;\n          }\n\n        case HostPortal:\n          pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n          break;\n\n        case ContextProvider:\n          {\n            var newValue = workInProgress.memoizedProps.value;\n            pushProvider(workInProgress, newValue);\n            break;\n          }\n\n        case Profiler:\n          {\n            // Profiler should only call onRender when one of its descendants actually rendered.\n            var hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;\n\n            if (hasChildWork) {\n              workInProgress.effectTag |= Update;\n            }\n          }\n\n          break;\n\n        case SuspenseComponent:\n          {\n            var state = workInProgress.memoizedState;\n\n            if (state !== null) {\n              // whether to retry the primary children, or to skip over it and\n              // go straight to the fallback. Check the priority of the primary\n              // child fragment.\n\n\n              var primaryChildFragment = workInProgress.child;\n              var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;\n\n              if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {\n                // The primary children have pending work. Use the normal path\n                // to attempt to render the primary children again.\n                return updateSuspenseComponent(current, workInProgress, renderExpirationTime);\n              } else {\n                pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient\n                // priority. Bailout.\n\n                var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n\n                if (child !== null) {\n                  // The fallback children have pending work. Skip over the\n                  // primary children and work on the fallback.\n                  return child.sibling;\n                } else {\n                  return null;\n                }\n              }\n            } else {\n              pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current));\n            }\n\n            break;\n          }\n\n        case SuspenseListComponent:\n          {\n            var didSuspendBefore = (current.effectTag & DidCapture) !== NoEffect;\n\n            var _hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;\n\n            if (didSuspendBefore) {\n              if (_hasChildWork) {\n                // If something was in fallback state last time, and we have all the\n                // same children then we're still in progressive loading state.\n                // Something might get unblocked by state updates or retries in the\n                // tree which will affect the tail. So we need to use the normal\n                // path to compute the correct tail.\n                return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);\n              } // If none of the children had any work, that means that none of\n              // them got retried so they'll still be blocked in the same way\n              // as before. We can fast bail out.\n\n\n              workInProgress.effectTag |= DidCapture;\n            } // If nothing suspended before and we're rendering the same children,\n            // then the tail doesn't matter. Anything new that suspends will work\n            // in the \"together\" mode, so we can continue from the state we had.\n\n\n            var renderState = workInProgress.memoizedState;\n\n            if (renderState !== null) {\n              // Reset to the \"together\" mode in case we've started a different\n              // update in the past but didn't complete it.\n              renderState.rendering = null;\n              renderState.tail = null;\n            }\n\n            pushSuspenseContext(workInProgress, suspenseStackCursor.current);\n\n            if (_hasChildWork) {\n              break;\n            } else {\n              // If none of the children had any work, that means that none of\n              // them got retried so they'll still be blocked in the same way\n              // as before. We can fast bail out.\n              return null;\n            }\n          }\n      }\n\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    } else {\n      // An update was scheduled on this fiber, but there are no new props\n      // nor legacy context. Set this to false. If an update queue or context\n      // consumer produces a changed value, it will set this to true. Otherwise,\n      // the component will assume the children have not changed and bail out.\n      didReceiveUpdate = false;\n    }\n  } else {\n    didReceiveUpdate = false;\n  } // Before entering the begin phase, clear pending update priority.\n  // TODO: This assumes that we're about to evaluate the component and process\n  // the update queue. However, there's an exception: SimpleMemoComponent\n  // sometimes bails out later in the begin phase. This indicates that we should\n  // move this assignment out of the common path and into each branch.\n\n\n  workInProgress.expirationTime = NoWork;\n\n  switch (workInProgress.tag) {\n    case IndeterminateComponent:\n      {\n        return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderExpirationTime);\n      }\n\n    case LazyComponent:\n      {\n        var elementType = workInProgress.elementType;\n        return mountLazyComponent(current, workInProgress, elementType, updateExpirationTime, renderExpirationTime);\n      }\n\n    case FunctionComponent:\n      {\n        var _Component = workInProgress.type;\n        var unresolvedProps = workInProgress.pendingProps;\n        var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);\n        return updateFunctionComponent(current, workInProgress, _Component, resolvedProps, renderExpirationTime);\n      }\n\n    case ClassComponent:\n      {\n        var _Component2 = workInProgress.type;\n        var _unresolvedProps = workInProgress.pendingProps;\n\n        var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);\n\n        return updateClassComponent(current, workInProgress, _Component2, _resolvedProps, renderExpirationTime);\n      }\n\n    case HostRoot:\n      return updateHostRoot(current, workInProgress, renderExpirationTime);\n\n    case HostComponent:\n      return updateHostComponent(current, workInProgress, renderExpirationTime);\n\n    case HostText:\n      return updateHostText(current, workInProgress);\n\n    case SuspenseComponent:\n      return updateSuspenseComponent(current, workInProgress, renderExpirationTime);\n\n    case HostPortal:\n      return updatePortalComponent(current, workInProgress, renderExpirationTime);\n\n    case ForwardRef:\n      {\n        var type = workInProgress.type;\n        var _unresolvedProps2 = workInProgress.pendingProps;\n\n        var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);\n\n        return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderExpirationTime);\n      }\n\n    case Fragment:\n      return updateFragment(current, workInProgress, renderExpirationTime);\n\n    case Mode:\n      return updateMode(current, workInProgress, renderExpirationTime);\n\n    case Profiler:\n      return updateProfiler(current, workInProgress, renderExpirationTime);\n\n    case ContextProvider:\n      return updateContextProvider(current, workInProgress, renderExpirationTime);\n\n    case ContextConsumer:\n      return updateContextConsumer(current, workInProgress, renderExpirationTime);\n\n    case MemoComponent:\n      {\n        var _type2 = workInProgress.type;\n        var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.\n\n        var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);\n\n        {\n          if (workInProgress.type !== workInProgress.elementType) {\n            var outerPropTypes = _type2.propTypes;\n\n            if (outerPropTypes) {\n              checkPropTypes(outerPropTypes, _resolvedProps3, // Resolved for outer only\n              'prop', getComponentName(_type2), getCurrentFiberStackInDev);\n            }\n          }\n        }\n\n        _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);\n        return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);\n      }\n\n    case SimpleMemoComponent:\n      {\n        return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);\n      }\n\n    case IncompleteClassComponent:\n      {\n        var _Component3 = workInProgress.type;\n        var _unresolvedProps4 = workInProgress.pendingProps;\n\n        var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);\n\n        return mountIncompleteClassComponent(current, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);\n      }\n\n    case SuspenseListComponent:\n      {\n        return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);\n      }\n  }\n\n  {\n    {\n      throw Error( \"Unknown unit of work tag (\" + workInProgress.tag + \"). This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction markUpdate(workInProgress) {\n  // Tag the fiber with an update effect. This turns a Placement into\n  // a PlacementAndUpdate.\n  workInProgress.effectTag |= Update;\n}\n\nfunction markRef$1(workInProgress) {\n  workInProgress.effectTag |= Ref;\n}\n\nvar appendAllChildren;\nvar updateHostContainer;\nvar updateHostComponent$1;\nvar updateHostText$1;\n\n{\n  // Mutation mode\n  appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {\n    // We only have the top Fiber that was created but we need recurse down its\n    // children to find all the terminal nodes.\n    var node = workInProgress.child;\n\n    while (node !== null) {\n      if (node.tag === HostComponent || node.tag === HostText) {\n        appendInitialChild(parent, node.stateNode);\n      } else if (node.tag === HostPortal) ; else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === workInProgress) {\n        return;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === workInProgress) {\n          return;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  };\n\n  updateHostContainer = function (workInProgress) {// Noop\n  };\n\n  updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {\n    // If we have an alternate, that means this is an update and we need to\n    // schedule a side-effect to do the updates.\n    var oldProps = current.memoizedProps;\n\n    if (oldProps === newProps) {\n      // In mutation mode, this is sufficient for a bailout because\n      // we won't touch this node even if children changed.\n      return;\n    } // If we get updated because one of our children updated, we don't\n    // have newProps so we'll have to reuse them.\n    // TODO: Split the update API as separate for the props vs. children.\n    // Even better would be if children weren't special cased at all tho.\n\n\n    var instance = workInProgress.stateNode;\n    var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host\n    // component is hitting the resume path. Figure out why. Possibly\n    // related to `hidden`.\n\n    var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component.\n\n    workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there\n    // is a new ref we mark this as an update. All the work is done in commitWork.\n\n    if (updatePayload) {\n      markUpdate(workInProgress);\n    }\n  };\n\n  updateHostText$1 = function (current, workInProgress, oldText, newText) {\n    // If the text differs, mark it as an update. All the work in done in commitWork.\n    if (oldText !== newText) {\n      markUpdate(workInProgress);\n    }\n  };\n}\n\nfunction cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n  switch (renderState.tailMode) {\n    case 'hidden':\n      {\n        // Any insertions at the end of the tail list after this point\n        // should be invisible. If there are already mounted boundaries\n        // anything before them are not considered for collapsing.\n        // Therefore we need to go through the whole tail to find if\n        // there are any.\n        var tailNode = renderState.tail;\n        var lastTailNode = null;\n\n        while (tailNode !== null) {\n          if (tailNode.alternate !== null) {\n            lastTailNode = tailNode;\n          }\n\n          tailNode = tailNode.sibling;\n        } // Next we're simply going to delete all insertions after the\n        // last rendered item.\n\n\n        if (lastTailNode === null) {\n          // All remaining items in the tail are insertions.\n          renderState.tail = null;\n        } else {\n          // Detach the insertion after the last node that was already\n          // inserted.\n          lastTailNode.sibling = null;\n        }\n\n        break;\n      }\n\n    case 'collapsed':\n      {\n        // Any insertions at the end of the tail list after this point\n        // should be invisible. If there are already mounted boundaries\n        // anything before them are not considered for collapsing.\n        // Therefore we need to go through the whole tail to find if\n        // there are any.\n        var _tailNode = renderState.tail;\n        var _lastTailNode = null;\n\n        while (_tailNode !== null) {\n          if (_tailNode.alternate !== null) {\n            _lastTailNode = _tailNode;\n          }\n\n          _tailNode = _tailNode.sibling;\n        } // Next we're simply going to delete all insertions after the\n        // last rendered item.\n\n\n        if (_lastTailNode === null) {\n          // All remaining items in the tail are insertions.\n          if (!hasRenderedATailFallback && renderState.tail !== null) {\n            // We suspended during the head. We want to show at least one\n            // row at the tail. So we'll keep on and cut off the rest.\n            renderState.tail.sibling = null;\n          } else {\n            renderState.tail = null;\n          }\n        } else {\n          // Detach the insertion after the last node that was already\n          // inserted.\n          _lastTailNode.sibling = null;\n        }\n\n        break;\n      }\n  }\n}\n\nfunction completeWork(current, workInProgress, renderExpirationTime) {\n  var newProps = workInProgress.pendingProps;\n\n  switch (workInProgress.tag) {\n    case IndeterminateComponent:\n    case LazyComponent:\n    case SimpleMemoComponent:\n    case FunctionComponent:\n    case ForwardRef:\n    case Fragment:\n    case Mode:\n    case Profiler:\n    case ContextConsumer:\n    case MemoComponent:\n      return null;\n\n    case ClassComponent:\n      {\n        var Component = workInProgress.type;\n\n        if (isContextProvider(Component)) {\n          popContext(workInProgress);\n        }\n\n        return null;\n      }\n\n    case HostRoot:\n      {\n        popHostContainer(workInProgress);\n        popTopLevelContextObject(workInProgress);\n        var fiberRoot = workInProgress.stateNode;\n\n        if (fiberRoot.pendingContext) {\n          fiberRoot.context = fiberRoot.pendingContext;\n          fiberRoot.pendingContext = null;\n        }\n\n        if (current === null || current.child === null) {\n          // If we hydrated, pop so that we can delete any remaining children\n          // that weren't hydrated.\n          var wasHydrated = popHydrationState(workInProgress);\n\n          if (wasHydrated) {\n            // If we hydrated, then we'll need to schedule an update for\n            // the commit side-effects on the root.\n            markUpdate(workInProgress);\n          }\n        }\n\n        updateHostContainer(workInProgress);\n        return null;\n      }\n\n    case HostComponent:\n      {\n        popHostContext(workInProgress);\n        var rootContainerInstance = getRootHostContainer();\n        var type = workInProgress.type;\n\n        if (current !== null && workInProgress.stateNode != null) {\n          updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);\n\n          if (current.ref !== workInProgress.ref) {\n            markRef$1(workInProgress);\n          }\n        } else {\n          if (!newProps) {\n            if (!(workInProgress.stateNode !== null)) {\n              {\n                throw Error( \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\" );\n              }\n            } // This can happen when we abort work.\n\n\n            return null;\n          }\n\n          var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context\n          // \"stack\" as the parent. Then append children as we go in beginWork\n          // or completeWork depending on whether we want to add them top->down or\n          // bottom->up. Top->down is faster in IE11.\n\n          var _wasHydrated = popHydrationState(workInProgress);\n\n          if (_wasHydrated) {\n            // TODO: Move this and createInstance step into the beginPhase\n            // to consolidate.\n            if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {\n              // If changes to the hydrated node need to be applied at the\n              // commit-phase we mark this as such.\n              markUpdate(workInProgress);\n            }\n          } else {\n            var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);\n            appendAllChildren(instance, workInProgress, false, false); // This needs to be set before we mount Flare event listeners\n\n            workInProgress.stateNode = instance;\n            // (eg DOM renderer supports auto-focus for certain elements).\n            // Make sure such renderers get scheduled for later work.\n\n\n            if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) {\n              markUpdate(workInProgress);\n            }\n          }\n\n          if (workInProgress.ref !== null) {\n            // If there is a ref on a host node we need to schedule a callback\n            markRef$1(workInProgress);\n          }\n        }\n\n        return null;\n      }\n\n    case HostText:\n      {\n        var newText = newProps;\n\n        if (current && workInProgress.stateNode != null) {\n          var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need\n          // to schedule a side-effect to do the updates.\n\n          updateHostText$1(current, workInProgress, oldText, newText);\n        } else {\n          if (typeof newText !== 'string') {\n            if (!(workInProgress.stateNode !== null)) {\n              {\n                throw Error( \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\" );\n              }\n            } // This can happen when we abort work.\n\n          }\n\n          var _rootContainerInstance = getRootHostContainer();\n\n          var _currentHostContext = getHostContext();\n\n          var _wasHydrated2 = popHydrationState(workInProgress);\n\n          if (_wasHydrated2) {\n            if (prepareToHydrateHostTextInstance(workInProgress)) {\n              markUpdate(workInProgress);\n            }\n          } else {\n            workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);\n          }\n        }\n\n        return null;\n      }\n\n    case SuspenseComponent:\n      {\n        popSuspenseContext(workInProgress);\n        var nextState = workInProgress.memoizedState;\n\n        if ((workInProgress.effectTag & DidCapture) !== NoEffect) {\n          // Something suspended. Re-render with the fallback children.\n          workInProgress.expirationTime = renderExpirationTime; // Do not reset the effect list.\n\n          return workInProgress;\n        }\n\n        var nextDidTimeout = nextState !== null;\n        var prevDidTimeout = false;\n\n        if (current === null) {\n          if (workInProgress.memoizedProps.fallback !== undefined) {\n            popHydrationState(workInProgress);\n          }\n        } else {\n          var prevState = current.memoizedState;\n          prevDidTimeout = prevState !== null;\n\n          if (!nextDidTimeout && prevState !== null) {\n            // We just switched from the fallback to the normal children.\n            // Delete the fallback.\n            // TODO: Would it be better to store the fallback fragment on\n            // the stateNode during the begin phase?\n            var currentFallbackChild = current.child.sibling;\n\n            if (currentFallbackChild !== null) {\n              // Deletions go at the beginning of the return fiber's effect list\n              var first = workInProgress.firstEffect;\n\n              if (first !== null) {\n                workInProgress.firstEffect = currentFallbackChild;\n                currentFallbackChild.nextEffect = first;\n              } else {\n                workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;\n                currentFallbackChild.nextEffect = null;\n              }\n\n              currentFallbackChild.effectTag = Deletion;\n            }\n          }\n        }\n\n        if (nextDidTimeout && !prevDidTimeout) {\n          // If this subtreee is running in blocking mode we can suspend,\n          // otherwise we won't suspend.\n          // TODO: This will still suspend a synchronous tree if anything\n          // in the concurrent tree already suspended during this render.\n          // This is a known bug.\n          if ((workInProgress.mode & BlockingMode) !== NoMode) {\n            // TODO: Move this back to throwException because this is too late\n            // if this is a large tree which is common for initial loads. We\n            // don't know if we should restart a render or not until we get\n            // this marker, and this is too late.\n            // If this render already had a ping or lower pri updates,\n            // and this is the first time we know we're going to suspend we\n            // should be able to immediately restart from within throwException.\n            var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true;\n\n            if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {\n              // If this was in an invisible tree or a new render, then showing\n              // this boundary is ok.\n              renderDidSuspend();\n            } else {\n              // Otherwise, we're going to have to hide content so we should\n              // suspend for longer if possible.\n              renderDidSuspendDelayIfPossible();\n            }\n          }\n        }\n\n        {\n          // TODO: Only schedule updates if these values are non equal, i.e. it changed.\n          if (nextDidTimeout || prevDidTimeout) {\n            // If this boundary just timed out, schedule an effect to attach a\n            // retry listener to the promise. This flag is also used to hide the\n            // primary children. In mutation mode, we also need the flag to\n            // *unhide* children that were previously hidden, so check if this\n            // is currently timed out, too.\n            workInProgress.effectTag |= Update;\n          }\n        }\n\n        return null;\n      }\n\n    case HostPortal:\n      popHostContainer(workInProgress);\n      updateHostContainer(workInProgress);\n      return null;\n\n    case ContextProvider:\n      // Pop provider fiber\n      popProvider(workInProgress);\n      return null;\n\n    case IncompleteClassComponent:\n      {\n        // Same as class component case. I put it down here so that the tags are\n        // sequential to ensure this switch is compiled to a jump table.\n        var _Component = workInProgress.type;\n\n        if (isContextProvider(_Component)) {\n          popContext(workInProgress);\n        }\n\n        return null;\n      }\n\n    case SuspenseListComponent:\n      {\n        popSuspenseContext(workInProgress);\n        var renderState = workInProgress.memoizedState;\n\n        if (renderState === null) {\n          // We're running in the default, \"independent\" mode.\n          // We don't do anything in this mode.\n          return null;\n        }\n\n        var didSuspendAlready = (workInProgress.effectTag & DidCapture) !== NoEffect;\n        var renderedTail = renderState.rendering;\n\n        if (renderedTail === null) {\n          // We just rendered the head.\n          if (!didSuspendAlready) {\n            // This is the first pass. We need to figure out if anything is still\n            // suspended in the rendered set.\n            // If new content unsuspended, but there's still some content that\n            // didn't. Then we need to do a second pass that forces everything\n            // to keep showing their fallbacks.\n            // We might be suspended if something in this render pass suspended, or\n            // something in the previous committed pass suspended. Otherwise,\n            // there's no chance so we can skip the expensive call to\n            // findFirstSuspended.\n            var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.effectTag & DidCapture) === NoEffect);\n\n            if (!cannotBeSuspended) {\n              var row = workInProgress.child;\n\n              while (row !== null) {\n                var suspended = findFirstSuspended(row);\n\n                if (suspended !== null) {\n                  didSuspendAlready = true;\n                  workInProgress.effectTag |= DidCapture;\n                  cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as\n                  // part of the second pass. In that case nothing will subscribe to\n                  // its thennables. Instead, we'll transfer its thennables to the\n                  // SuspenseList so that it can retry if they resolve.\n                  // There might be multiple of these in the list but since we're\n                  // going to wait for all of them anyway, it doesn't really matter\n                  // which ones gets to ping. In theory we could get clever and keep\n                  // track of how many dependencies remain but it gets tricky because\n                  // in the meantime, we can add/remove/change items and dependencies.\n                  // We might bail out of the loop before finding any but that\n                  // doesn't matter since that means that the other boundaries that\n                  // we did find already has their listeners attached.\n\n                  var newThennables = suspended.updateQueue;\n\n                  if (newThennables !== null) {\n                    workInProgress.updateQueue = newThennables;\n                    workInProgress.effectTag |= Update;\n                  } // Rerender the whole list, but this time, we'll force fallbacks\n                  // to stay in place.\n                  // Reset the effect list before doing the second pass since that's now invalid.\n\n\n                  if (renderState.lastEffect === null) {\n                    workInProgress.firstEffect = null;\n                  }\n\n                  workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state.\n\n                  resetChildFibers(workInProgress, renderExpirationTime); // Set up the Suspense Context to force suspense and immediately\n                  // rerender the children.\n\n                  pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback));\n                  return workInProgress.child;\n                }\n\n                row = row.sibling;\n              }\n            }\n          } else {\n            cutOffTailIfNeeded(renderState, false);\n          } // Next we're going to render the tail.\n\n        } else {\n          // Append the rendered row to the child list.\n          if (!didSuspendAlready) {\n            var _suspended = findFirstSuspended(renderedTail);\n\n            if (_suspended !== null) {\n              workInProgress.effectTag |= DidCapture;\n              didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't\n              // get lost if this row ends up dropped during a second pass.\n\n              var _newThennables = _suspended.updateQueue;\n\n              if (_newThennables !== null) {\n                workInProgress.updateQueue = _newThennables;\n                workInProgress.effectTag |= Update;\n              }\n\n              cutOffTailIfNeeded(renderState, true); // This might have been modified.\n\n              if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate) {\n                // We need to delete the row we just rendered.\n                // Reset the effect list to what it was before we rendered this\n                // child. The nested children have already appended themselves.\n                var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point.\n\n                if (lastEffect !== null) {\n                  lastEffect.nextEffect = null;\n                } // We're done.\n\n\n                return null;\n              }\n            } else if ( // The time it took to render last row is greater than time until\n            // the expiration.\n            now() * 2 - renderState.renderingStartTime > renderState.tailExpiration && renderExpirationTime > Never) {\n              // We have now passed our CPU deadline and we'll just give up further\n              // attempts to render the main content and only render fallbacks.\n              // The assumption is that this is usually faster.\n              workInProgress.effectTag |= DidCapture;\n              didSuspendAlready = true;\n              cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this\n              // to get it started back up to attempt the next item. If we can show\n              // them, then they really have the same priority as this render.\n              // So we'll pick it back up the very next render pass once we've had\n              // an opportunity to yield for paint.\n\n              var nextPriority = renderExpirationTime - 1;\n              workInProgress.expirationTime = workInProgress.childExpirationTime = nextPriority;\n\n              {\n                markSpawnedWork(nextPriority);\n              }\n            }\n          }\n\n          if (renderState.isBackwards) {\n            // The effect list of the backwards tail will have been added\n            // to the end. This breaks the guarantee that life-cycles fire in\n            // sibling order but that isn't a strong guarantee promised by React.\n            // Especially since these might also just pop in during future commits.\n            // Append to the beginning of the list.\n            renderedTail.sibling = workInProgress.child;\n            workInProgress.child = renderedTail;\n          } else {\n            var previousSibling = renderState.last;\n\n            if (previousSibling !== null) {\n              previousSibling.sibling = renderedTail;\n            } else {\n              workInProgress.child = renderedTail;\n            }\n\n            renderState.last = renderedTail;\n          }\n        }\n\n        if (renderState.tail !== null) {\n          // We still have tail rows to render.\n          if (renderState.tailExpiration === 0) {\n            // Heuristic for how long we're willing to spend rendering rows\n            // until we just give up and show what we have so far.\n            var TAIL_EXPIRATION_TIMEOUT_MS = 500;\n            renderState.tailExpiration = now() + TAIL_EXPIRATION_TIMEOUT_MS; // TODO: This is meant to mimic the train model or JND but this\n            // is a per component value. It should really be since the start\n            // of the total render or last commit. Consider using something like\n            // globalMostRecentFallbackTime. That doesn't account for being\n            // suspended for part of the time or when it's a new render.\n            // It should probably use a global start time value instead.\n          } // Pop a row.\n\n\n          var next = renderState.tail;\n          renderState.rendering = next;\n          renderState.tail = next.sibling;\n          renderState.lastEffect = workInProgress.lastEffect;\n          renderState.renderingStartTime = now();\n          next.sibling = null; // Restore the context.\n          // TODO: We can probably just avoid popping it instead and only\n          // setting it the first time we go from not suspended to suspended.\n\n          var suspenseContext = suspenseStackCursor.current;\n\n          if (didSuspendAlready) {\n            suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);\n          } else {\n            suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n          }\n\n          pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row.\n\n          return next;\n        }\n\n        return null;\n      }\n  }\n\n  {\n    {\n      throw Error( \"Unknown unit of work tag (\" + workInProgress.tag + \"). This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction unwindWork(workInProgress, renderExpirationTime) {\n  switch (workInProgress.tag) {\n    case ClassComponent:\n      {\n        var Component = workInProgress.type;\n\n        if (isContextProvider(Component)) {\n          popContext(workInProgress);\n        }\n\n        var effectTag = workInProgress.effectTag;\n\n        if (effectTag & ShouldCapture) {\n          workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;\n          return workInProgress;\n        }\n\n        return null;\n      }\n\n    case HostRoot:\n      {\n        popHostContainer(workInProgress);\n        popTopLevelContextObject(workInProgress);\n        var _effectTag = workInProgress.effectTag;\n\n        if (!((_effectTag & DidCapture) === NoEffect)) {\n          {\n            throw Error( \"The root failed to unmount after an error. This is likely a bug in React. Please file an issue.\" );\n          }\n        }\n\n        workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;\n        return workInProgress;\n      }\n\n    case HostComponent:\n      {\n        // TODO: popHydrationState\n        popHostContext(workInProgress);\n        return null;\n      }\n\n    case SuspenseComponent:\n      {\n        popSuspenseContext(workInProgress);\n\n        var _effectTag2 = workInProgress.effectTag;\n\n        if (_effectTag2 & ShouldCapture) {\n          workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary.\n\n          return workInProgress;\n        }\n\n        return null;\n      }\n\n    case SuspenseListComponent:\n      {\n        popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been\n        // caught by a nested boundary. If not, it should bubble through.\n\n        return null;\n      }\n\n    case HostPortal:\n      popHostContainer(workInProgress);\n      return null;\n\n    case ContextProvider:\n      popProvider(workInProgress);\n      return null;\n\n    default:\n      return null;\n  }\n}\n\nfunction unwindInterruptedWork(interruptedWork) {\n  switch (interruptedWork.tag) {\n    case ClassComponent:\n      {\n        var childContextTypes = interruptedWork.type.childContextTypes;\n\n        if (childContextTypes !== null && childContextTypes !== undefined) {\n          popContext(interruptedWork);\n        }\n\n        break;\n      }\n\n    case HostRoot:\n      {\n        popHostContainer(interruptedWork);\n        popTopLevelContextObject(interruptedWork);\n        break;\n      }\n\n    case HostComponent:\n      {\n        popHostContext(interruptedWork);\n        break;\n      }\n\n    case HostPortal:\n      popHostContainer(interruptedWork);\n      break;\n\n    case SuspenseComponent:\n      popSuspenseContext(interruptedWork);\n      break;\n\n    case SuspenseListComponent:\n      popSuspenseContext(interruptedWork);\n      break;\n\n    case ContextProvider:\n      popProvider(interruptedWork);\n      break;\n  }\n}\n\nfunction createCapturedValue(value, source) {\n  // If the value is an error, call this function immediately after it is thrown\n  // so the stack is accurate.\n  return {\n    value: value,\n    source: source,\n    stack: getStackByFiberInDevAndProd(source)\n  };\n}\n\nfunction logCapturedError(capturedError) {\n\n  var error = capturedError.error;\n\n  {\n    var componentName = capturedError.componentName,\n        componentStack = capturedError.componentStack,\n        errorBoundaryName = capturedError.errorBoundaryName,\n        errorBoundaryFound = capturedError.errorBoundaryFound,\n        willRetry = capturedError.willRetry; // Browsers support silencing uncaught errors by calling\n    // `preventDefault()` in window `error` handler.\n    // We record this information as an expando on the error.\n\n    if (error != null && error._suppressLogging) {\n      if (errorBoundaryFound && willRetry) {\n        // The error is recoverable and was silenced.\n        // Ignore it and don't print the stack addendum.\n        // This is handy for testing error boundaries without noise.\n        return;\n      } // The error is fatal. Since the silencing might have\n      // been accidental, we'll surface it anyway.\n      // However, the browser would have silenced the original error\n      // so we'll print it first, and then print the stack addendum.\n\n\n      console['error'](error); // Don't transform to our wrapper\n      // For a more detailed description of this block, see:\n      // https://github.com/facebook/react/pull/13384\n    }\n\n    var componentNameMessage = componentName ? \"The above error occurred in the <\" + componentName + \"> component:\" : 'The above error occurred in one of your React components:';\n    var errorBoundaryMessage; // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.\n\n    if (errorBoundaryFound && errorBoundaryName) {\n      if (willRetry) {\n        errorBoundaryMessage = \"React will try to recreate this component tree from scratch \" + (\"using the error boundary you provided, \" + errorBoundaryName + \".\");\n      } else {\n        errorBoundaryMessage = \"This error was initially handled by the error boundary \" + errorBoundaryName + \".\\n\" + \"Recreating the tree from scratch failed so React will unmount the tree.\";\n      }\n    } else {\n      errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.';\n    }\n\n    var combinedMessage = \"\" + componentNameMessage + componentStack + \"\\n\\n\" + (\"\" + errorBoundaryMessage); // In development, we provide our own message with just the component stack.\n    // We don't include the original error message and JS stack because the browser\n    // has already printed it. Even if the application swallows the error, it is still\n    // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.\n\n    console['error'](combinedMessage); // Don't transform to our wrapper\n  }\n}\n\nvar didWarnAboutUndefinedSnapshotBeforeUpdate = null;\n\n{\n  didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();\n}\n\nvar PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;\nfunction logError(boundary, errorInfo) {\n  var source = errorInfo.source;\n  var stack = errorInfo.stack;\n\n  if (stack === null && source !== null) {\n    stack = getStackByFiberInDevAndProd(source);\n  }\n\n  var capturedError = {\n    componentName: source !== null ? getComponentName(source.type) : null,\n    componentStack: stack !== null ? stack : '',\n    error: errorInfo.value,\n    errorBoundary: null,\n    errorBoundaryName: null,\n    errorBoundaryFound: false,\n    willRetry: false\n  };\n\n  if (boundary !== null && boundary.tag === ClassComponent) {\n    capturedError.errorBoundary = boundary.stateNode;\n    capturedError.errorBoundaryName = getComponentName(boundary.type);\n    capturedError.errorBoundaryFound = true;\n    capturedError.willRetry = true;\n  }\n\n  try {\n    logCapturedError(capturedError);\n  } catch (e) {\n    // This method must not throw, or React internal state will get messed up.\n    // If console.error is overridden, or logCapturedError() shows a dialog that throws,\n    // we want to report this error outside of the normal stack as a last resort.\n    // https://github.com/facebook/react/issues/13188\n    setTimeout(function () {\n      throw e;\n    });\n  }\n}\n\nvar callComponentWillUnmountWithTimer = function (current, instance) {\n  startPhaseTimer(current, 'componentWillUnmount');\n  instance.props = current.memoizedProps;\n  instance.state = current.memoizedState;\n  instance.componentWillUnmount();\n  stopPhaseTimer();\n}; // Capture errors so they don't interrupt unmounting.\n\n\nfunction safelyCallComponentWillUnmount(current, instance) {\n  {\n    invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current, instance);\n\n    if (hasCaughtError()) {\n      var unmountError = clearCaughtError();\n      captureCommitPhaseError(current, unmountError);\n    }\n  }\n}\n\nfunction safelyDetachRef(current) {\n  var ref = current.ref;\n\n  if (ref !== null) {\n    if (typeof ref === 'function') {\n      {\n        invokeGuardedCallback(null, ref, null, null);\n\n        if (hasCaughtError()) {\n          var refError = clearCaughtError();\n          captureCommitPhaseError(current, refError);\n        }\n      }\n    } else {\n      ref.current = null;\n    }\n  }\n}\n\nfunction safelyCallDestroy(current, destroy) {\n  {\n    invokeGuardedCallback(null, destroy, null);\n\n    if (hasCaughtError()) {\n      var error = clearCaughtError();\n      captureCommitPhaseError(current, error);\n    }\n  }\n}\n\nfunction commitBeforeMutationLifeCycles(current, finishedWork) {\n  switch (finishedWork.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        return;\n      }\n\n    case ClassComponent:\n      {\n        if (finishedWork.effectTag & Snapshot) {\n          if (current !== null) {\n            var prevProps = current.memoizedProps;\n            var prevState = current.memoizedState;\n            startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');\n            var instance = finishedWork.stateNode; // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            }\n\n            var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);\n\n            {\n              var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;\n\n              if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {\n                didWarnSet.add(finishedWork.type);\n\n                error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));\n              }\n            }\n\n            instance.__reactInternalSnapshotBeforeUpdate = snapshot;\n            stopPhaseTimer();\n          }\n        }\n\n        return;\n      }\n\n    case HostRoot:\n    case HostComponent:\n    case HostText:\n    case HostPortal:\n    case IncompleteClassComponent:\n      // Nothing to do for these component types\n      return;\n  }\n\n  {\n    {\n      throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction commitHookEffectListUnmount(tag, finishedWork) {\n  var updateQueue = finishedWork.updateQueue;\n  var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;\n\n  if (lastEffect !== null) {\n    var firstEffect = lastEffect.next;\n    var effect = firstEffect;\n\n    do {\n      if ((effect.tag & tag) === tag) {\n        // Unmount\n        var destroy = effect.destroy;\n        effect.destroy = undefined;\n\n        if (destroy !== undefined) {\n          destroy();\n        }\n      }\n\n      effect = effect.next;\n    } while (effect !== firstEffect);\n  }\n}\n\nfunction commitHookEffectListMount(tag, finishedWork) {\n  var updateQueue = finishedWork.updateQueue;\n  var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;\n\n  if (lastEffect !== null) {\n    var firstEffect = lastEffect.next;\n    var effect = firstEffect;\n\n    do {\n      if ((effect.tag & tag) === tag) {\n        // Mount\n        var create = effect.create;\n        effect.destroy = create();\n\n        {\n          var destroy = effect.destroy;\n\n          if (destroy !== undefined && typeof destroy !== 'function') {\n            var addendum = void 0;\n\n            if (destroy === null) {\n              addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';\n            } else if (typeof destroy.then === 'function') {\n              addendum = '\\n\\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\\n\\n' + 'useEffect(() => {\\n' + '  async function fetchData() {\\n' + '    // You can await here\\n' + '    const response = await MyAPI.getData(someId);\\n' + '    // ...\\n' + '  }\\n' + '  fetchData();\\n' + \"}, [someId]); // Or [] if effect doesn't need props or state\\n\\n\" + 'Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching';\n            } else {\n              addendum = ' You returned: ' + destroy;\n            }\n\n            error('An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));\n          }\n        }\n      }\n\n      effect = effect.next;\n    } while (effect !== firstEffect);\n  }\n}\n\nfunction commitPassiveHookEffects(finishedWork) {\n  if ((finishedWork.effectTag & Passive) !== NoEffect) {\n    switch (finishedWork.tag) {\n      case FunctionComponent:\n      case ForwardRef:\n      case SimpleMemoComponent:\n      case Block:\n        {\n          // TODO (#17945) We should call all passive destroy functions (for all fibers)\n          // before calling any create functions. The current approach only serializes\n          // these for a single fiber.\n          commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork);\n          commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);\n          break;\n        }\n    }\n  }\n}\n\nfunction commitLifeCycles(finishedRoot, current, finishedWork, committedExpirationTime) {\n  switch (finishedWork.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        // At this point layout effects have already been destroyed (during mutation phase).\n        // This is done to prevent sibling component effects from interfering with each other,\n        // e.g. a destroy function in one component should never override a ref set\n        // by a create function in another component during the same commit.\n        commitHookEffectListMount(Layout | HasEffect, finishedWork);\n\n        return;\n      }\n\n    case ClassComponent:\n      {\n        var instance = finishedWork.stateNode;\n\n        if (finishedWork.effectTag & Update) {\n          if (current === null) {\n            startPhaseTimer(finishedWork, 'componentDidMount'); // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            }\n\n            instance.componentDidMount();\n            stopPhaseTimer();\n          } else {\n            var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps);\n            var prevState = current.memoizedState;\n            startPhaseTimer(finishedWork, 'componentDidUpdate'); // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            }\n\n            instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);\n            stopPhaseTimer();\n          }\n        }\n\n        var updateQueue = finishedWork.updateQueue;\n\n        if (updateQueue !== null) {\n          {\n            if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n              if (instance.props !== finishedWork.memoizedProps) {\n                error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n              }\n\n              if (instance.state !== finishedWork.memoizedState) {\n                error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n              }\n            }\n          } // We could update instance props and state here,\n          // but instead we rely on them being set during last render.\n          // TODO: revisit this when we implement resuming.\n\n\n          commitUpdateQueue(finishedWork, updateQueue, instance);\n        }\n\n        return;\n      }\n\n    case HostRoot:\n      {\n        var _updateQueue = finishedWork.updateQueue;\n\n        if (_updateQueue !== null) {\n          var _instance = null;\n\n          if (finishedWork.child !== null) {\n            switch (finishedWork.child.tag) {\n              case HostComponent:\n                _instance = getPublicInstance(finishedWork.child.stateNode);\n                break;\n\n              case ClassComponent:\n                _instance = finishedWork.child.stateNode;\n                break;\n            }\n          }\n\n          commitUpdateQueue(finishedWork, _updateQueue, _instance);\n        }\n\n        return;\n      }\n\n    case HostComponent:\n      {\n        var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted\n        // (eg DOM renderer may schedule auto-focus for inputs and form controls).\n        // These effects should only be committed when components are first mounted,\n        // aka when there is no current/alternate.\n\n        if (current === null && finishedWork.effectTag & Update) {\n          var type = finishedWork.type;\n          var props = finishedWork.memoizedProps;\n          commitMount(_instance2, type, props);\n        }\n\n        return;\n      }\n\n    case HostText:\n      {\n        // We have no life-cycles associated with text.\n        return;\n      }\n\n    case HostPortal:\n      {\n        // We have no life-cycles associated with portals.\n        return;\n      }\n\n    case Profiler:\n      {\n        {\n          var onRender = finishedWork.memoizedProps.onRender;\n\n          if (typeof onRender === 'function') {\n            {\n              onRender(finishedWork.memoizedProps.id, current === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);\n            }\n          }\n        }\n\n        return;\n      }\n\n    case SuspenseComponent:\n      {\n        commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n        return;\n      }\n\n    case SuspenseListComponent:\n    case IncompleteClassComponent:\n    case FundamentalComponent:\n    case ScopeComponent:\n      return;\n  }\n\n  {\n    {\n      throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction hideOrUnhideAllChildren(finishedWork, isHidden) {\n  {\n    // We only have the top Fiber that was inserted but we need to recurse down its\n    // children to find all the terminal nodes.\n    var node = finishedWork;\n\n    while (true) {\n      if (node.tag === HostComponent) {\n        var instance = node.stateNode;\n\n        if (isHidden) {\n          hideInstance(instance);\n        } else {\n          unhideInstance(node.stateNode, node.memoizedProps);\n        }\n      } else if (node.tag === HostText) {\n        var _instance3 = node.stateNode;\n\n        if (isHidden) {\n          hideTextInstance(_instance3);\n        } else {\n          unhideTextInstance(_instance3, node.memoizedProps);\n        }\n      } else if (node.tag === SuspenseComponent && node.memoizedState !== null && node.memoizedState.dehydrated === null) {\n        // Found a nested Suspense component that timed out. Skip over the\n        // primary child fragment, which should remain hidden.\n        var fallbackChildFragment = node.child.sibling;\n        fallbackChildFragment.return = node;\n        node = fallbackChildFragment;\n        continue;\n      } else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === finishedWork) {\n        return;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === finishedWork) {\n          return;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n}\n\nfunction commitAttachRef(finishedWork) {\n  var ref = finishedWork.ref;\n\n  if (ref !== null) {\n    var instance = finishedWork.stateNode;\n    var instanceToUse;\n\n    switch (finishedWork.tag) {\n      case HostComponent:\n        instanceToUse = getPublicInstance(instance);\n        break;\n\n      default:\n        instanceToUse = instance;\n    } // Moved outside to ensure DCE works with this flag\n\n    if (typeof ref === 'function') {\n      ref(instanceToUse);\n    } else {\n      {\n        if (!ref.hasOwnProperty('current')) {\n          error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));\n        }\n      }\n\n      ref.current = instanceToUse;\n    }\n  }\n}\n\nfunction commitDetachRef(current) {\n  var currentRef = current.ref;\n\n  if (currentRef !== null) {\n    if (typeof currentRef === 'function') {\n      currentRef(null);\n    } else {\n      currentRef.current = null;\n    }\n  }\n} // User-originating errors (lifecycles and refs) should not interrupt\n// deletion, so don't let them throw. Host-originating errors should\n// interrupt deletion, so it's okay\n\n\nfunction commitUnmount(finishedRoot, current, renderPriorityLevel) {\n  onCommitUnmount(current);\n\n  switch (current.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case MemoComponent:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        var updateQueue = current.updateQueue;\n\n        if (updateQueue !== null) {\n          var lastEffect = updateQueue.lastEffect;\n\n          if (lastEffect !== null) {\n            var firstEffect = lastEffect.next;\n\n            {\n              // When the owner fiber is deleted, the destroy function of a passive\n              // effect hook is called during the synchronous commit phase. This is\n              // a concession to implementation complexity. Calling it in the\n              // passive effect phase (like they usually are, when dependencies\n              // change during an update) would require either traversing the\n              // children of the deleted fiber again, or including unmount effects\n              // as part of the fiber effect list.\n              //\n              // Because this is during the sync commit phase, we need to change\n              // the priority.\n              //\n              // TODO: Reconsider this implementation trade off.\n              var priorityLevel = renderPriorityLevel > NormalPriority ? NormalPriority : renderPriorityLevel;\n              runWithPriority$1(priorityLevel, function () {\n                var effect = firstEffect;\n\n                do {\n                  var _destroy = effect.destroy;\n\n                  if (_destroy !== undefined) {\n                    safelyCallDestroy(current, _destroy);\n                  }\n\n                  effect = effect.next;\n                } while (effect !== firstEffect);\n              });\n            }\n          }\n        }\n\n        return;\n      }\n\n    case ClassComponent:\n      {\n        safelyDetachRef(current);\n        var instance = current.stateNode;\n\n        if (typeof instance.componentWillUnmount === 'function') {\n          safelyCallComponentWillUnmount(current, instance);\n        }\n\n        return;\n      }\n\n    case HostComponent:\n      {\n\n        safelyDetachRef(current);\n        return;\n      }\n\n    case HostPortal:\n      {\n        // TODO: this is recursive.\n        // We are also not using this parent because\n        // the portal will get pushed immediately.\n        {\n          unmountHostComponents(finishedRoot, current, renderPriorityLevel);\n        }\n\n        return;\n      }\n\n    case FundamentalComponent:\n      {\n\n        return;\n      }\n\n    case DehydratedFragment:\n      {\n\n        return;\n      }\n\n    case ScopeComponent:\n      {\n\n        return;\n      }\n  }\n}\n\nfunction commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) {\n  // While we're inside a removed host node we don't want to call\n  // removeChild on the inner nodes because they're removed by the top\n  // call anyway. We also want to call componentWillUnmount on all\n  // composites before this host node is removed from the tree. Therefore\n  // we do an inner loop while we're still inside the host node.\n  var node = root;\n\n  while (true) {\n    commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because they may contain more composite or host nodes.\n    // Skip portals because commitUnmount() currently visits them recursively.\n\n    if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above.\n    // If we don't use mutation we drill down into portals here instead.\n     node.tag !== HostPortal)) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n\n    if (node === root) {\n      return;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === root) {\n        return;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n}\n\nfunction detachFiber(current) {\n  var alternate = current.alternate; // Cut off the return pointers to disconnect it from the tree. Ideally, we\n  // should clear the child pointer of the parent alternate to let this\n  // get GC:ed but we don't know which for sure which parent is the current\n  // one so we'll settle for GC:ing the subtree of this child. This child\n  // itself will be GC:ed when the parent updates the next time.\n\n  current.return = null;\n  current.child = null;\n  current.memoizedState = null;\n  current.updateQueue = null;\n  current.dependencies = null;\n  current.alternate = null;\n  current.firstEffect = null;\n  current.lastEffect = null;\n  current.pendingProps = null;\n  current.memoizedProps = null;\n  current.stateNode = null;\n\n  if (alternate !== null) {\n    detachFiber(alternate);\n  }\n}\n\nfunction getHostParentFiber(fiber) {\n  var parent = fiber.return;\n\n  while (parent !== null) {\n    if (isHostParent(parent)) {\n      return parent;\n    }\n\n    parent = parent.return;\n  }\n\n  {\n    {\n      throw Error( \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction isHostParent(fiber) {\n  return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;\n}\n\nfunction getHostSibling(fiber) {\n  // We're going to search forward into the tree until we find a sibling host\n  // node. Unfortunately, if multiple insertions are done in a row we have to\n  // search past them. This leads to exponential search for the next sibling.\n  // TODO: Find a more efficient way to do this.\n  var node = fiber;\n\n  siblings: while (true) {\n    // If we didn't find anything, let's try the next sibling.\n    while (node.sibling === null) {\n      if (node.return === null || isHostParent(node.return)) {\n        // If we pop out of the root or hit the parent the fiber we are the\n        // last sibling.\n        return null;\n      }\n\n      node = node.return;\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n\n    while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {\n      // If it is not host node and, we might have a host node inside it.\n      // Try to search down until we find one.\n      if (node.effectTag & Placement) {\n        // If we don't have a child, try the siblings instead.\n        continue siblings;\n      } // If we don't have a child, try the siblings instead.\n      // We also skip portals because they are not part of this host tree.\n\n\n      if (node.child === null || node.tag === HostPortal) {\n        continue siblings;\n      } else {\n        node.child.return = node;\n        node = node.child;\n      }\n    } // Check if this host node is stable or about to be placed.\n\n\n    if (!(node.effectTag & Placement)) {\n      // Found it!\n      return node.stateNode;\n    }\n  }\n}\n\nfunction commitPlacement(finishedWork) {\n\n\n  var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together.\n\n  var parent;\n  var isContainer;\n  var parentStateNode = parentFiber.stateNode;\n\n  switch (parentFiber.tag) {\n    case HostComponent:\n      parent = parentStateNode;\n      isContainer = false;\n      break;\n\n    case HostRoot:\n      parent = parentStateNode.containerInfo;\n      isContainer = true;\n      break;\n\n    case HostPortal:\n      parent = parentStateNode.containerInfo;\n      isContainer = true;\n      break;\n\n    case FundamentalComponent:\n\n    // eslint-disable-next-line-no-fallthrough\n\n    default:\n      {\n        {\n          throw Error( \"Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n  }\n\n  if (parentFiber.effectTag & ContentReset) {\n    // Reset the text content of the parent before doing any insertions\n    resetTextContent(parent); // Clear ContentReset from the effect tag\n\n    parentFiber.effectTag &= ~ContentReset;\n  }\n\n  var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its\n  // children to find all the terminal nodes.\n\n  if (isContainer) {\n    insertOrAppendPlacementNodeIntoContainer(finishedWork, before, parent);\n  } else {\n    insertOrAppendPlacementNode(finishedWork, before, parent);\n  }\n}\n\nfunction insertOrAppendPlacementNodeIntoContainer(node, before, parent) {\n  var tag = node.tag;\n  var isHost = tag === HostComponent || tag === HostText;\n\n  if (isHost || enableFundamentalAPI ) {\n    var stateNode = isHost ? node.stateNode : node.stateNode.instance;\n\n    if (before) {\n      insertInContainerBefore(parent, stateNode, before);\n    } else {\n      appendChildToContainer(parent, stateNode);\n    }\n  } else if (tag === HostPortal) ; else {\n    var child = node.child;\n\n    if (child !== null) {\n      insertOrAppendPlacementNodeIntoContainer(child, before, parent);\n      var sibling = child.sibling;\n\n      while (sibling !== null) {\n        insertOrAppendPlacementNodeIntoContainer(sibling, before, parent);\n        sibling = sibling.sibling;\n      }\n    }\n  }\n}\n\nfunction insertOrAppendPlacementNode(node, before, parent) {\n  var tag = node.tag;\n  var isHost = tag === HostComponent || tag === HostText;\n\n  if (isHost || enableFundamentalAPI ) {\n    var stateNode = isHost ? node.stateNode : node.stateNode.instance;\n\n    if (before) {\n      insertBefore(parent, stateNode, before);\n    } else {\n      appendChild(parent, stateNode);\n    }\n  } else if (tag === HostPortal) ; else {\n    var child = node.child;\n\n    if (child !== null) {\n      insertOrAppendPlacementNode(child, before, parent);\n      var sibling = child.sibling;\n\n      while (sibling !== null) {\n        insertOrAppendPlacementNode(sibling, before, parent);\n        sibling = sibling.sibling;\n      }\n    }\n  }\n}\n\nfunction unmountHostComponents(finishedRoot, current, renderPriorityLevel) {\n  // We only have the top Fiber that was deleted but we need to recurse down its\n  // children to find all the terminal nodes.\n  var node = current; // Each iteration, currentParent is populated with node's host parent if not\n  // currentParentIsValid.\n\n  var currentParentIsValid = false; // Note: these two variables *must* always be updated together.\n\n  var currentParent;\n  var currentParentIsContainer;\n\n  while (true) {\n    if (!currentParentIsValid) {\n      var parent = node.return;\n\n      findParent: while (true) {\n        if (!(parent !== null)) {\n          {\n            throw Error( \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\" );\n          }\n        }\n\n        var parentStateNode = parent.stateNode;\n\n        switch (parent.tag) {\n          case HostComponent:\n            currentParent = parentStateNode;\n            currentParentIsContainer = false;\n            break findParent;\n\n          case HostRoot:\n            currentParent = parentStateNode.containerInfo;\n            currentParentIsContainer = true;\n            break findParent;\n\n          case HostPortal:\n            currentParent = parentStateNode.containerInfo;\n            currentParentIsContainer = true;\n            break findParent;\n\n        }\n\n        parent = parent.return;\n      }\n\n      currentParentIsValid = true;\n    }\n\n    if (node.tag === HostComponent || node.tag === HostText) {\n      commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the\n      // node from the tree.\n\n      if (currentParentIsContainer) {\n        removeChildFromContainer(currentParent, node.stateNode);\n      } else {\n        removeChild(currentParent, node.stateNode);\n      } // Don't visit children because we already visited them.\n\n    } else if (node.tag === HostPortal) {\n      if (node.child !== null) {\n        // When we go into a portal, it becomes the parent to remove from.\n        // We will reassign it back when we pop the portal on the way up.\n        currentParent = node.stateNode.containerInfo;\n        currentParentIsContainer = true; // Visit children because portals might contain host components.\n\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n    } else {\n      commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because we may find more host components below.\n\n      if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n    }\n\n    if (node === current) {\n      return;\n    }\n\n    while (node.sibling === null) {\n      if (node.return === null || node.return === current) {\n        return;\n      }\n\n      node = node.return;\n\n      if (node.tag === HostPortal) {\n        // When we go out of the portal, we need to restore the parent.\n        // Since we don't keep a stack of them, we will search for it.\n        currentParentIsValid = false;\n      }\n    }\n\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n}\n\nfunction commitDeletion(finishedRoot, current, renderPriorityLevel) {\n  {\n    // Recursively delete all host nodes from the parent.\n    // Detach refs and call componentWillUnmount() on the whole subtree.\n    unmountHostComponents(finishedRoot, current, renderPriorityLevel);\n  }\n\n  detachFiber(current);\n}\n\nfunction commitWork(current, finishedWork) {\n\n  switch (finishedWork.tag) {\n    case FunctionComponent:\n    case ForwardRef:\n    case MemoComponent:\n    case SimpleMemoComponent:\n    case Block:\n      {\n        // Layout effects are destroyed during the mutation phase so that all\n        // destroy functions for all fibers are called before any create functions.\n        // This prevents sibling component effects from interfering with each other,\n        // e.g. a destroy function in one component should never override a ref set\n        // by a create function in another component during the same commit.\n        commitHookEffectListUnmount(Layout | HasEffect, finishedWork);\n        return;\n      }\n\n    case ClassComponent:\n      {\n        return;\n      }\n\n    case HostComponent:\n      {\n        var instance = finishedWork.stateNode;\n\n        if (instance != null) {\n          // Commit the work prepared earlier.\n          var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps\n          // as the newProps. The updatePayload will contain the real change in\n          // this case.\n\n          var oldProps = current !== null ? current.memoizedProps : newProps;\n          var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components.\n\n          var updatePayload = finishedWork.updateQueue;\n          finishedWork.updateQueue = null;\n\n          if (updatePayload !== null) {\n            commitUpdate(instance, updatePayload, type, oldProps, newProps);\n          }\n        }\n\n        return;\n      }\n\n    case HostText:\n      {\n        if (!(finishedWork.stateNode !== null)) {\n          {\n            throw Error( \"This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.\" );\n          }\n        }\n\n        var textInstance = finishedWork.stateNode;\n        var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps\n        // as the newProps. The updatePayload will contain the real change in\n        // this case.\n\n        var oldText = current !== null ? current.memoizedProps : newText;\n        commitTextUpdate(textInstance, oldText, newText);\n        return;\n      }\n\n    case HostRoot:\n      {\n        {\n          var _root = finishedWork.stateNode;\n\n          if (_root.hydrate) {\n            // We've just hydrated. No need to hydrate again.\n            _root.hydrate = false;\n            commitHydratedContainer(_root.containerInfo);\n          }\n        }\n\n        return;\n      }\n\n    case Profiler:\n      {\n        return;\n      }\n\n    case SuspenseComponent:\n      {\n        commitSuspenseComponent(finishedWork);\n        attachSuspenseRetryListeners(finishedWork);\n        return;\n      }\n\n    case SuspenseListComponent:\n      {\n        attachSuspenseRetryListeners(finishedWork);\n        return;\n      }\n\n    case IncompleteClassComponent:\n      {\n        return;\n      }\n  }\n\n  {\n    {\n      throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  }\n}\n\nfunction commitSuspenseComponent(finishedWork) {\n  var newState = finishedWork.memoizedState;\n  var newDidTimeout;\n  var primaryChildParent = finishedWork;\n\n  if (newState === null) {\n    newDidTimeout = false;\n  } else {\n    newDidTimeout = true;\n    primaryChildParent = finishedWork.child;\n    markCommitTimeOfFallback();\n  }\n\n  if ( primaryChildParent !== null) {\n    hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);\n  }\n}\n\nfunction commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {\n\n  var newState = finishedWork.memoizedState;\n\n  if (newState === null) {\n    var current = finishedWork.alternate;\n\n    if (current !== null) {\n      var prevState = current.memoizedState;\n\n      if (prevState !== null) {\n        var suspenseInstance = prevState.dehydrated;\n\n        if (suspenseInstance !== null) {\n          commitHydratedSuspenseInstance(suspenseInstance);\n        }\n      }\n    }\n  }\n}\n\nfunction attachSuspenseRetryListeners(finishedWork) {\n  // If this boundary just timed out, then it will have a set of thenables.\n  // For each thenable, attach a listener so that when it resolves, React\n  // attempts to re-render the boundary in the primary (pre-timeout) state.\n  var thenables = finishedWork.updateQueue;\n\n  if (thenables !== null) {\n    finishedWork.updateQueue = null;\n    var retryCache = finishedWork.stateNode;\n\n    if (retryCache === null) {\n      retryCache = finishedWork.stateNode = new PossiblyWeakSet();\n    }\n\n    thenables.forEach(function (thenable) {\n      // Memoize using the boundary fiber to prevent redundant listeners.\n      var retry = resolveRetryThenable.bind(null, finishedWork, thenable);\n\n      if (!retryCache.has(thenable)) {\n        {\n          if (thenable.__reactDoNotTraceInteractions !== true) {\n            retry = tracing.unstable_wrap(retry);\n          }\n        }\n\n        retryCache.add(thenable);\n        thenable.then(retry, retry);\n      }\n    });\n  }\n}\n\nfunction commitResetTextContent(current) {\n\n  resetTextContent(current.stateNode);\n}\n\nvar PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map;\n\nfunction createRootErrorUpdate(fiber, errorInfo, expirationTime) {\n  var update = createUpdate(expirationTime, null); // Unmount the root by rendering null.\n\n  update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property\n  // being called \"element\".\n\n  update.payload = {\n    element: null\n  };\n  var error = errorInfo.value;\n\n  update.callback = function () {\n    onUncaughtError(error);\n    logError(fiber, errorInfo);\n  };\n\n  return update;\n}\n\nfunction createClassErrorUpdate(fiber, errorInfo, expirationTime) {\n  var update = createUpdate(expirationTime, null);\n  update.tag = CaptureUpdate;\n  var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n\n  if (typeof getDerivedStateFromError === 'function') {\n    var error$1 = errorInfo.value;\n\n    update.payload = function () {\n      logError(fiber, errorInfo);\n      return getDerivedStateFromError(error$1);\n    };\n  }\n\n  var inst = fiber.stateNode;\n\n  if (inst !== null && typeof inst.componentDidCatch === 'function') {\n    update.callback = function callback() {\n      {\n        markFailedErrorBoundaryForHotReloading(fiber);\n      }\n\n      if (typeof getDerivedStateFromError !== 'function') {\n        // To preserve the preexisting retry behavior of error boundaries,\n        // we keep track of which ones already failed during this batch.\n        // This gets reset before we yield back to the browser.\n        // TODO: Warn in strict mode if getDerivedStateFromError is\n        // not defined.\n        markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined\n\n        logError(fiber, errorInfo);\n      }\n\n      var error$1 = errorInfo.value;\n      var stack = errorInfo.stack;\n      this.componentDidCatch(error$1, {\n        componentStack: stack !== null ? stack : ''\n      });\n\n      {\n        if (typeof getDerivedStateFromError !== 'function') {\n          // If componentDidCatch is the only error boundary method defined,\n          // then it needs to call setState to recover from errors.\n          // If no state update is scheduled then the boundary will swallow the error.\n          if (fiber.expirationTime !== Sync) {\n            error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown');\n          }\n        }\n      }\n    };\n  } else {\n    update.callback = function () {\n      markFailedErrorBoundaryForHotReloading(fiber);\n    };\n  }\n\n  return update;\n}\n\nfunction attachPingListener(root, renderExpirationTime, thenable) {\n  // Attach a listener to the promise to \"ping\" the root and retry. But\n  // only if one does not already exist for the current render expiration\n  // time (which acts like a \"thread ID\" here).\n  var pingCache = root.pingCache;\n  var threadIDs;\n\n  if (pingCache === null) {\n    pingCache = root.pingCache = new PossiblyWeakMap$1();\n    threadIDs = new Set();\n    pingCache.set(thenable, threadIDs);\n  } else {\n    threadIDs = pingCache.get(thenable);\n\n    if (threadIDs === undefined) {\n      threadIDs = new Set();\n      pingCache.set(thenable, threadIDs);\n    }\n  }\n\n  if (!threadIDs.has(renderExpirationTime)) {\n    // Memoize using the thread ID to prevent redundant listeners.\n    threadIDs.add(renderExpirationTime);\n    var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);\n    thenable.then(ping, ping);\n  }\n}\n\nfunction throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {\n  // The source fiber did not complete.\n  sourceFiber.effectTag |= Incomplete; // Its effect list is no longer valid.\n\n  sourceFiber.firstEffect = sourceFiber.lastEffect = null;\n\n  if (value !== null && typeof value === 'object' && typeof value.then === 'function') {\n    // This is a thenable.\n    var thenable = value;\n\n    if ((sourceFiber.mode & BlockingMode) === NoMode) {\n      // Reset the memoizedState to what it was before we attempted\n      // to render it.\n      var currentSource = sourceFiber.alternate;\n\n      if (currentSource) {\n        sourceFiber.updateQueue = currentSource.updateQueue;\n        sourceFiber.memoizedState = currentSource.memoizedState;\n        sourceFiber.expirationTime = currentSource.expirationTime;\n      } else {\n        sourceFiber.updateQueue = null;\n        sourceFiber.memoizedState = null;\n      }\n    }\n\n    var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view.\n\n    var _workInProgress = returnFiber;\n\n    do {\n      if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) {\n        // Found the nearest boundary.\n        // Stash the promise on the boundary fiber. If the boundary times out, we'll\n        // attach another listener to flip the boundary back to its normal state.\n        var thenables = _workInProgress.updateQueue;\n\n        if (thenables === null) {\n          var updateQueue = new Set();\n          updateQueue.add(thenable);\n          _workInProgress.updateQueue = updateQueue;\n        } else {\n          thenables.add(thenable);\n        } // If the boundary is outside of blocking mode, we should *not*\n        // suspend the commit. Pretend as if the suspended component rendered\n        // null and keep rendering. In the commit phase, we'll schedule a\n        // subsequent synchronous update to re-render the Suspense.\n        //\n        // Note: It doesn't matter whether the component that suspended was\n        // inside a blocking mode tree. If the Suspense is outside of it, we\n        // should *not* suspend the commit.\n\n\n        if ((_workInProgress.mode & BlockingMode) === NoMode) {\n          _workInProgress.effectTag |= DidCapture; // We're going to commit this fiber even though it didn't complete.\n          // But we shouldn't call any lifecycle methods or callbacks. Remove\n          // all lifecycle effect tags.\n\n          sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);\n\n          if (sourceFiber.tag === ClassComponent) {\n            var currentSourceFiber = sourceFiber.alternate;\n\n            if (currentSourceFiber === null) {\n              // This is a new mount. Change the tag so it's not mistaken for a\n              // completed class component. For example, we should not call\n              // componentWillUnmount if it is deleted.\n              sourceFiber.tag = IncompleteClassComponent;\n            } else {\n              // When we try rendering again, we should not reuse the current fiber,\n              // since it's known to be in an inconsistent state. Use a force update to\n              // prevent a bail out.\n              var update = createUpdate(Sync, null);\n              update.tag = ForceUpdate;\n              enqueueUpdate(sourceFiber, update);\n            }\n          } // The source fiber did not complete. Mark it with Sync priority to\n          // indicate that it still has pending work.\n\n\n          sourceFiber.expirationTime = Sync; // Exit without suspending.\n\n          return;\n        } // Confirmed that the boundary is in a concurrent mode tree. Continue\n        // with the normal suspend path.\n        //\n        // After this we'll use a set of heuristics to determine whether this\n        // render pass will run to completion or restart or \"suspend\" the commit.\n        // The actual logic for this is spread out in different places.\n        //\n        // This first principle is that if we're going to suspend when we complete\n        // a root, then we should also restart if we get an update or ping that\n        // might unsuspend it, and vice versa. The only reason to suspend is\n        // because you think you might want to restart before committing. However,\n        // it doesn't make sense to restart only while in the period we're suspended.\n        //\n        // Restarting too aggressively is also not good because it starves out any\n        // intermediate loading state. So we use heuristics to determine when.\n        // Suspense Heuristics\n        //\n        // If nothing threw a Promise or all the same fallbacks are already showing,\n        // then don't suspend/restart.\n        //\n        // If this is an initial render of a new tree of Suspense boundaries and\n        // those trigger a fallback, then don't suspend/restart. We want to ensure\n        // that we can show the initial loading state as quickly as possible.\n        //\n        // If we hit a \"Delayed\" case, such as when we'd switch from content back into\n        // a fallback, then we should always suspend/restart. SuspenseConfig applies to\n        // this case. If none is defined, JND is used instead.\n        //\n        // If we're already showing a fallback and it gets \"retried\", allowing us to show\n        // another level, but there's still an inner boundary that would show a fallback,\n        // then we suspend/restart for 500ms since the last time we showed a fallback\n        // anywhere in the tree. This effectively throttles progressive loading into a\n        // consistent train of commits. This also gives us an opportunity to restart to\n        // get to the completed state slightly earlier.\n        //\n        // If there's ambiguity due to batching it's resolved in preference of:\n        // 1) \"delayed\", 2) \"initial render\", 3) \"retry\".\n        //\n        // We want to ensure that a \"busy\" state doesn't get force committed. We want to\n        // ensure that new initial loading states can commit as soon as possible.\n\n\n        attachPingListener(root, renderExpirationTime, thenable);\n        _workInProgress.effectTag |= ShouldCapture;\n        _workInProgress.expirationTime = renderExpirationTime;\n        return;\n      } // This boundary already captured during this render. Continue to the next\n      // boundary.\n\n\n      _workInProgress = _workInProgress.return;\n    } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode.\n    // TODO: Use invariant so the message is stripped in prod?\n\n\n    value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\\n' + '\\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.' + getStackByFiberInDevAndProd(sourceFiber));\n  } // We didn't find a boundary that could handle this type of exception. Start\n  // over and traverse parent path again, this time treating the exception\n  // as an error.\n\n\n  renderDidError();\n  value = createCapturedValue(value, sourceFiber);\n  var workInProgress = returnFiber;\n\n  do {\n    switch (workInProgress.tag) {\n      case HostRoot:\n        {\n          var _errorInfo = value;\n          workInProgress.effectTag |= ShouldCapture;\n          workInProgress.expirationTime = renderExpirationTime;\n\n          var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);\n\n          enqueueCapturedUpdate(workInProgress, _update);\n          return;\n        }\n\n      case ClassComponent:\n        // Capture and retry\n        var errorInfo = value;\n        var ctor = workInProgress.type;\n        var instance = workInProgress.stateNode;\n\n        if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {\n          workInProgress.effectTag |= ShouldCapture;\n          workInProgress.expirationTime = renderExpirationTime; // Schedule the error boundary to re-render using updated state\n\n          var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);\n\n          enqueueCapturedUpdate(workInProgress, _update2);\n          return;\n        }\n\n        break;\n    }\n\n    workInProgress = workInProgress.return;\n  } while (workInProgress !== null);\n}\n\nvar ceil = Math.ceil;\nvar ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher,\n    ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner,\n    IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing;\nvar NoContext =\n/*                    */\n0;\nvar BatchedContext =\n/*               */\n1;\nvar EventContext =\n/*                 */\n2;\nvar DiscreteEventContext =\n/*         */\n4;\nvar LegacyUnbatchedContext =\n/*       */\n8;\nvar RenderContext =\n/*                */\n16;\nvar CommitContext =\n/*                */\n32;\nvar RootIncomplete = 0;\nvar RootFatalErrored = 1;\nvar RootErrored = 2;\nvar RootSuspended = 3;\nvar RootSuspendedWithDelay = 4;\nvar RootCompleted = 5;\n// Describes where we are in the React execution stack\nvar executionContext = NoContext; // The root we're working on\n\nvar workInProgressRoot = null; // The fiber we're working on\n\nvar workInProgress = null; // The expiration time we're rendering\n\nvar renderExpirationTime$1 = NoWork; // Whether to root completed, errored, suspended, etc.\n\nvar workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown\n\nvar workInProgressRootFatalError = null; // Most recent event time among processed updates during this render.\n// This is conceptually a time stamp but expressed in terms of an ExpirationTime\n// because we deal mostly with expiration times in the hot path, so this avoids\n// the conversion happening in the hot path.\n\nvar workInProgressRootLatestProcessedExpirationTime = Sync;\nvar workInProgressRootLatestSuspenseTimeout = Sync;\nvar workInProgressRootCanSuspendUsingConfig = null; // The work left over by components that were visited during this render. Only\n// includes unprocessed updates, not work in bailed out children.\n\nvar workInProgressRootNextUnprocessedUpdateTime = NoWork; // If we're pinged while rendering we don't always restart immediately.\n// This flag determines if it might be worthwhile to restart if an opportunity\n// happens latere.\n\nvar workInProgressRootHasPendingPing = false; // The most recent time we committed a fallback. This lets us ensure a train\n// model where we don't commit new loading states in too quick succession.\n\nvar globalMostRecentFallbackTime = 0;\nvar FALLBACK_THROTTLE_MS = 500;\nvar nextEffect = null;\nvar hasUncaughtError = false;\nvar firstUncaughtError = null;\nvar legacyErrorBoundariesThatAlreadyFailed = null;\nvar rootDoesHavePassiveEffects = false;\nvar rootWithPendingPassiveEffects = null;\nvar pendingPassiveEffectsRenderPriority = NoPriority;\nvar pendingPassiveEffectsExpirationTime = NoWork;\nvar rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates\n\nvar NESTED_UPDATE_LIMIT = 50;\nvar nestedUpdateCount = 0;\nvar rootWithNestedUpdates = null;\nvar NESTED_PASSIVE_UPDATE_LIMIT = 50;\nvar nestedPassiveUpdateCount = 0;\nvar interruptedBy = null; // Marks the need to reschedule pending interactions at these expiration times\n// during the commit phase. This enables them to be traced across components\n// that spawn new work during render. E.g. hidden boundaries, suspended SSR\n// hydration or SuspenseList.\n\nvar spawnedWorkDuringRender = null; // Expiration times are computed by adding to the current time (the start\n// time). However, if two updates are scheduled within the same event, we\n// should treat their start times as simultaneous, even if the actual clock\n// time has advanced between the first and second call.\n// In other words, because expiration times determine how updates are batched,\n// we want all updates of like priority that occur within the same event to\n// receive the same expiration time. Otherwise we get tearing.\n\nvar currentEventTime = NoWork;\nfunction requestCurrentTimeForUpdate() {\n  if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {\n    // We're inside React, so it's fine to read the actual time.\n    return msToExpirationTime(now());\n  } // We're not inside React, so we may be in the middle of a browser event.\n\n\n  if (currentEventTime !== NoWork) {\n    // Use the same start time for all updates until we enter React again.\n    return currentEventTime;\n  } // This is the first update since React yielded. Compute a new start time.\n\n\n  currentEventTime = msToExpirationTime(now());\n  return currentEventTime;\n}\nfunction getCurrentTime() {\n  return msToExpirationTime(now());\n}\nfunction computeExpirationForFiber(currentTime, fiber, suspenseConfig) {\n  var mode = fiber.mode;\n\n  if ((mode & BlockingMode) === NoMode) {\n    return Sync;\n  }\n\n  var priorityLevel = getCurrentPriorityLevel();\n\n  if ((mode & ConcurrentMode) === NoMode) {\n    return priorityLevel === ImmediatePriority ? Sync : Batched;\n  }\n\n  if ((executionContext & RenderContext) !== NoContext) {\n    // Use whatever time we're already rendering\n    // TODO: Should there be a way to opt out, like with `runWithPriority`?\n    return renderExpirationTime$1;\n  }\n\n  var expirationTime;\n\n  if (suspenseConfig !== null) {\n    // Compute an expiration time based on the Suspense timeout.\n    expirationTime = computeSuspenseExpiration(currentTime, suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);\n  } else {\n    // Compute an expiration time based on the Scheduler priority.\n    switch (priorityLevel) {\n      case ImmediatePriority:\n        expirationTime = Sync;\n        break;\n\n      case UserBlockingPriority$1:\n        // TODO: Rename this to computeUserBlockingExpiration\n        expirationTime = computeInteractiveExpiration(currentTime);\n        break;\n\n      case NormalPriority:\n      case LowPriority:\n        // TODO: Handle LowPriority\n        // TODO: Rename this to... something better.\n        expirationTime = computeAsyncExpiration(currentTime);\n        break;\n\n      case IdlePriority:\n        expirationTime = Idle;\n        break;\n\n      default:\n        {\n          {\n            throw Error( \"Expected a valid priority level\" );\n          }\n        }\n\n    }\n  } // If we're in the middle of rendering a tree, do not update at the same\n  // expiration time that is already rendering.\n  // TODO: We shouldn't have to do this if the update is on a different root.\n  // Refactor computeExpirationForFiber + scheduleUpdate so we have access to\n  // the root when we check for this condition.\n\n\n  if (workInProgressRoot !== null && expirationTime === renderExpirationTime$1) {\n    // This is a trick to move this update into a separate batch\n    expirationTime -= 1;\n  }\n\n  return expirationTime;\n}\nfunction scheduleUpdateOnFiber(fiber, expirationTime) {\n  checkForNestedUpdates();\n  warnAboutRenderPhaseUpdatesInDEV(fiber);\n  var root = markUpdateTimeFromFiberToRoot(fiber, expirationTime);\n\n  if (root === null) {\n    warnAboutUpdateOnUnmountedFiberInDEV(fiber);\n    return;\n  }\n\n  checkForInterruption(fiber, expirationTime);\n  recordScheduleUpdate(); // TODO: computeExpirationForFiber also reads the priority. Pass the\n  // priority as an argument to that function and this one.\n\n  var priorityLevel = getCurrentPriorityLevel();\n\n  if (expirationTime === Sync) {\n    if ( // Check if we're inside unbatchedUpdates\n    (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering\n    (executionContext & (RenderContext | CommitContext)) === NoContext) {\n      // Register pending interactions on the root to avoid losing traced interaction data.\n      schedulePendingInteractions(root, expirationTime); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed\n      // root inside of batchedUpdates should be synchronous, but layout updates\n      // should be deferred until the end of the batch.\n\n      performSyncWorkOnRoot(root);\n    } else {\n      ensureRootIsScheduled(root);\n      schedulePendingInteractions(root, expirationTime);\n\n      if (executionContext === NoContext) {\n        // Flush the synchronous work now, unless we're already working or inside\n        // a batch. This is intentionally inside scheduleUpdateOnFiber instead of\n        // scheduleCallbackForFiber to preserve the ability to schedule a callback\n        // without immediately flushing it. We only do this for user-initiated\n        // updates, to preserve historical behavior of legacy mode.\n        flushSyncCallbackQueue();\n      }\n    }\n  } else {\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, expirationTime);\n  }\n\n  if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered\n  // discrete, even inside a discrete event.\n  priorityLevel === UserBlockingPriority$1 || priorityLevel === ImmediatePriority)) {\n    // This is the result of a discrete event. Track the lowest priority\n    // discrete update per root so we can flush them early, if needed.\n    if (rootsWithPendingDiscreteUpdates === null) {\n      rootsWithPendingDiscreteUpdates = new Map([[root, expirationTime]]);\n    } else {\n      var lastDiscreteTime = rootsWithPendingDiscreteUpdates.get(root);\n\n      if (lastDiscreteTime === undefined || lastDiscreteTime > expirationTime) {\n        rootsWithPendingDiscreteUpdates.set(root, expirationTime);\n      }\n    }\n  }\n}\nvar scheduleWork = scheduleUpdateOnFiber; // This is split into a separate function so we can mark a fiber with pending\n// work without treating it as a typical update that originates from an event;\n// e.g. retrying a Suspense boundary isn't an update, but it does schedule work\n// on a fiber.\n\nfunction markUpdateTimeFromFiberToRoot(fiber, expirationTime) {\n  // Update the source fiber's expiration time\n  if (fiber.expirationTime < expirationTime) {\n    fiber.expirationTime = expirationTime;\n  }\n\n  var alternate = fiber.alternate;\n\n  if (alternate !== null && alternate.expirationTime < expirationTime) {\n    alternate.expirationTime = expirationTime;\n  } // Walk the parent path to the root and update the child expiration time.\n\n\n  var node = fiber.return;\n  var root = null;\n\n  if (node === null && fiber.tag === HostRoot) {\n    root = fiber.stateNode;\n  } else {\n    while (node !== null) {\n      alternate = node.alternate;\n\n      if (node.childExpirationTime < expirationTime) {\n        node.childExpirationTime = expirationTime;\n\n        if (alternate !== null && alternate.childExpirationTime < expirationTime) {\n          alternate.childExpirationTime = expirationTime;\n        }\n      } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {\n        alternate.childExpirationTime = expirationTime;\n      }\n\n      if (node.return === null && node.tag === HostRoot) {\n        root = node.stateNode;\n        break;\n      }\n\n      node = node.return;\n    }\n  }\n\n  if (root !== null) {\n    if (workInProgressRoot === root) {\n      // Received an update to a tree that's in the middle of rendering. Mark\n      // that's unprocessed work on this root.\n      markUnprocessedUpdateTime(expirationTime);\n\n      if (workInProgressRootExitStatus === RootSuspendedWithDelay) {\n        // The root already suspended with a delay, which means this render\n        // definitely won't finish. Since we have a new update, let's mark it as\n        // suspended now, right before marking the incoming update. This has the\n        // effect of interrupting the current render and switching to the update.\n        // TODO: This happens to work when receiving an update during the render\n        // phase, because of the trick inside computeExpirationForFiber to\n        // subtract 1 from `renderExpirationTime` to move it into a\n        // separate bucket. But we should probably model it with an exception,\n        // using the same mechanism we use to force hydration of a subtree.\n        // TODO: This does not account for low pri updates that were already\n        // scheduled before the root started rendering. Need to track the next\n        // pending expiration time (perhaps by backtracking the return path) and\n        // then trigger a restart in the `renderDidSuspendDelayIfPossible` path.\n        markRootSuspendedAtTime(root, renderExpirationTime$1);\n      }\n    } // Mark that the root has a pending update.\n\n\n    markRootUpdatedAtTime(root, expirationTime);\n  }\n\n  return root;\n}\n\nfunction getNextRootExpirationTimeToWorkOn(root) {\n  // Determines the next expiration time that the root should render, taking\n  // into account levels that may be suspended, or levels that may have\n  // received a ping.\n  var lastExpiredTime = root.lastExpiredTime;\n\n  if (lastExpiredTime !== NoWork) {\n    return lastExpiredTime;\n  } // \"Pending\" refers to any update that hasn't committed yet, including if it\n  // suspended. The \"suspended\" range is therefore a subset.\n\n\n  var firstPendingTime = root.firstPendingTime;\n\n  if (!isRootSuspendedAtTime(root, firstPendingTime)) {\n    // The highest priority pending time is not suspended. Let's work on that.\n    return firstPendingTime;\n  } // If the first pending time is suspended, check if there's a lower priority\n  // pending level that we know about. Or check if we received a ping. Work\n  // on whichever is higher priority.\n\n\n  var lastPingedTime = root.lastPingedTime;\n  var nextKnownPendingLevel = root.nextKnownPendingLevel;\n  var nextLevel = lastPingedTime > nextKnownPendingLevel ? lastPingedTime : nextKnownPendingLevel;\n\n  if ( nextLevel <= Idle && firstPendingTime !== nextLevel) {\n    // Don't work on Idle/Never priority unless everything else is committed.\n    return NoWork;\n  }\n\n  return nextLevel;\n} // Use this function to schedule a task for a root. There's only one task per\n// root; if a task was already scheduled, we'll check to make sure the\n// expiration time of the existing task is the same as the expiration time of\n// the next level that the root has work on. This function is called on every\n// update, and right before exiting a task.\n\n\nfunction ensureRootIsScheduled(root) {\n  var lastExpiredTime = root.lastExpiredTime;\n\n  if (lastExpiredTime !== NoWork) {\n    // Special case: Expired work should flush synchronously.\n    root.callbackExpirationTime = Sync;\n    root.callbackPriority = ImmediatePriority;\n    root.callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));\n    return;\n  }\n\n  var expirationTime = getNextRootExpirationTimeToWorkOn(root);\n  var existingCallbackNode = root.callbackNode;\n\n  if (expirationTime === NoWork) {\n    // There's nothing to work on.\n    if (existingCallbackNode !== null) {\n      root.callbackNode = null;\n      root.callbackExpirationTime = NoWork;\n      root.callbackPriority = NoPriority;\n    }\n\n    return;\n  } // TODO: If this is an update, we already read the current time. Pass the\n  // time as an argument.\n\n\n  var currentTime = requestCurrentTimeForUpdate();\n  var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); // If there's an existing render task, confirm it has the correct priority and\n  // expiration time. Otherwise, we'll cancel it and schedule a new one.\n\n  if (existingCallbackNode !== null) {\n    var existingCallbackPriority = root.callbackPriority;\n    var existingCallbackExpirationTime = root.callbackExpirationTime;\n\n    if ( // Callback must have the exact same expiration time.\n    existingCallbackExpirationTime === expirationTime && // Callback must have greater or equal priority.\n    existingCallbackPriority >= priorityLevel) {\n      // Existing callback is sufficient.\n      return;\n    } // Need to schedule a new task.\n    // TODO: Instead of scheduling a new task, we should be able to change the\n    // priority of the existing one.\n\n\n    cancelCallback(existingCallbackNode);\n  }\n\n  root.callbackExpirationTime = expirationTime;\n  root.callbackPriority = priorityLevel;\n  var callbackNode;\n\n  if (expirationTime === Sync) {\n    // Sync React callbacks are scheduled on a special internal queue\n    callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));\n  } else {\n    callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root), // Compute a task timeout based on the expiration time. This also affects\n    // ordering because tasks are processed in timeout order.\n    {\n      timeout: expirationTimeToMs(expirationTime) - now()\n    });\n  }\n\n  root.callbackNode = callbackNode;\n} // This is the entry point for every concurrent task, i.e. anything that\n// goes through Scheduler.\n\n\nfunction performConcurrentWorkOnRoot(root, didTimeout) {\n  // Since we know we're in a React event, we can clear the current\n  // event time. The next update will compute a new event time.\n  currentEventTime = NoWork;\n\n  if (didTimeout) {\n    // The render task took too long to complete. Mark the current time as\n    // expired to synchronously render all expired work in a single batch.\n    var currentTime = requestCurrentTimeForUpdate();\n    markRootExpiredAtTime(root, currentTime); // This will schedule a synchronous callback.\n\n    ensureRootIsScheduled(root);\n    return null;\n  } // Determine the next expiration time to work on, using the fields stored\n  // on the root.\n\n\n  var expirationTime = getNextRootExpirationTimeToWorkOn(root);\n\n  if (expirationTime !== NoWork) {\n    var originalCallbackNode = root.callbackNode;\n\n    if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n      {\n        throw Error( \"Should not already be working.\" );\n      }\n    }\n\n    flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack\n    // and prepare a fresh one. Otherwise we'll continue where we left off.\n\n    if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {\n      prepareFreshStack(root, expirationTime);\n      startWorkOnPendingInteractions(root, expirationTime);\n    } // If we have a work-in-progress fiber, it means there's still work to do\n    // in this root.\n\n\n    if (workInProgress !== null) {\n      var prevExecutionContext = executionContext;\n      executionContext |= RenderContext;\n      var prevDispatcher = pushDispatcher();\n      var prevInteractions = pushInteractions(root);\n      startWorkLoopTimer(workInProgress);\n\n      do {\n        try {\n          workLoopConcurrent();\n          break;\n        } catch (thrownValue) {\n          handleError(root, thrownValue);\n        }\n      } while (true);\n\n      resetContextDependencies();\n      executionContext = prevExecutionContext;\n      popDispatcher(prevDispatcher);\n\n      {\n        popInteractions(prevInteractions);\n      }\n\n      if (workInProgressRootExitStatus === RootFatalErrored) {\n        var fatalError = workInProgressRootFatalError;\n        stopInterruptedWorkLoopTimer();\n        prepareFreshStack(root, expirationTime);\n        markRootSuspendedAtTime(root, expirationTime);\n        ensureRootIsScheduled(root);\n        throw fatalError;\n      }\n\n      if (workInProgress !== null) {\n        // There's still work left over. Exit without committing.\n        stopInterruptedWorkLoopTimer();\n      } else {\n        // We now have a consistent tree. The next step is either to commit it,\n        // or, if something suspended, wait to commit it after a timeout.\n        stopFinishedWorkLoopTimer();\n        var finishedWork = root.finishedWork = root.current.alternate;\n        root.finishedExpirationTime = expirationTime;\n        finishConcurrentRender(root, finishedWork, workInProgressRootExitStatus, expirationTime);\n      }\n\n      ensureRootIsScheduled(root);\n\n      if (root.callbackNode === originalCallbackNode) {\n        // The task node scheduled for this root is the same one that's\n        // currently executed. Need to return a continuation.\n        return performConcurrentWorkOnRoot.bind(null, root);\n      }\n    }\n  }\n\n  return null;\n}\n\nfunction finishConcurrentRender(root, finishedWork, exitStatus, expirationTime) {\n  // Set this to null to indicate there's no in-progress render.\n  workInProgressRoot = null;\n\n  switch (exitStatus) {\n    case RootIncomplete:\n    case RootFatalErrored:\n      {\n        {\n          {\n            throw Error( \"Root did not complete. This is a bug in React.\" );\n          }\n        }\n      }\n    // Flow knows about invariant, so it complains if I add a break\n    // statement, but eslint doesn't know about invariant, so it complains\n    // if I do. eslint-disable-next-line no-fallthrough\n\n    case RootErrored:\n      {\n        // If this was an async render, the error may have happened due to\n        // a mutation in a concurrent event. Try rendering one more time,\n        // synchronously, to see if the error goes away. If there are\n        // lower priority updates, let's include those, too, in case they\n        // fix the inconsistency. Render at Idle to include all updates.\n        // If it was Idle or Never or some not-yet-invented time, render\n        // at that time.\n        markRootExpiredAtTime(root, expirationTime > Idle ? Idle : expirationTime); // We assume that this second render pass will be synchronous\n        // and therefore not hit this path again.\n\n        break;\n      }\n\n    case RootSuspended:\n      {\n        markRootSuspendedAtTime(root, expirationTime);\n        var lastSuspendedTime = root.lastSuspendedTime;\n\n        if (expirationTime === lastSuspendedTime) {\n          root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);\n        } // We have an acceptable loading state. We need to figure out if we\n        // should immediately commit it or wait a bit.\n        // If we have processed new updates during this render, we may now\n        // have a new loading state ready. We want to ensure that we commit\n        // that as soon as possible.\n\n\n        var hasNotProcessedNewUpdates = workInProgressRootLatestProcessedExpirationTime === Sync;\n\n        if (hasNotProcessedNewUpdates && // do not delay if we're inside an act() scope\n        !( IsThisRendererActing.current)) {\n          // If we have not processed any new updates during this pass, then\n          // this is either a retry of an existing fallback state or a\n          // hidden tree. Hidden trees shouldn't be batched with other work\n          // and after that's fixed it can only be a retry. We're going to\n          // throttle committing retries so that we don't show too many\n          // loading states too quickly.\n          var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.\n\n          if (msUntilTimeout > 10) {\n            if (workInProgressRootHasPendingPing) {\n              var lastPingedTime = root.lastPingedTime;\n\n              if (lastPingedTime === NoWork || lastPingedTime >= expirationTime) {\n                // This render was pinged but we didn't get to restart\n                // earlier so try restarting now instead.\n                root.lastPingedTime = expirationTime;\n                prepareFreshStack(root, expirationTime);\n                break;\n              }\n            }\n\n            var nextTime = getNextRootExpirationTimeToWorkOn(root);\n\n            if (nextTime !== NoWork && nextTime !== expirationTime) {\n              // There's additional work on this root.\n              break;\n            }\n\n            if (lastSuspendedTime !== NoWork && lastSuspendedTime !== expirationTime) {\n              // We should prefer to render the fallback of at the last\n              // suspended level. Ping the last suspended level to try\n              // rendering it again.\n              root.lastPingedTime = lastSuspendedTime;\n              break;\n            } // The render is suspended, it hasn't timed out, and there's no\n            // lower priority work to do. Instead of committing the fallback\n            // immediately, wait for more data to arrive.\n\n\n            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout);\n            break;\n          }\n        } // The work expired. Commit immediately.\n\n\n        commitRoot(root);\n        break;\n      }\n\n    case RootSuspendedWithDelay:\n      {\n        markRootSuspendedAtTime(root, expirationTime);\n        var _lastSuspendedTime = root.lastSuspendedTime;\n\n        if (expirationTime === _lastSuspendedTime) {\n          root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);\n        }\n\n        if ( // do not delay if we're inside an act() scope\n        !( IsThisRendererActing.current)) {\n          // We're suspended in a state that should be avoided. We'll try to\n          // avoid committing it for as long as the timeouts let us.\n          if (workInProgressRootHasPendingPing) {\n            var _lastPingedTime = root.lastPingedTime;\n\n            if (_lastPingedTime === NoWork || _lastPingedTime >= expirationTime) {\n              // This render was pinged but we didn't get to restart earlier\n              // so try restarting now instead.\n              root.lastPingedTime = expirationTime;\n              prepareFreshStack(root, expirationTime);\n              break;\n            }\n          }\n\n          var _nextTime = getNextRootExpirationTimeToWorkOn(root);\n\n          if (_nextTime !== NoWork && _nextTime !== expirationTime) {\n            // There's additional work on this root.\n            break;\n          }\n\n          if (_lastSuspendedTime !== NoWork && _lastSuspendedTime !== expirationTime) {\n            // We should prefer to render the fallback of at the last\n            // suspended level. Ping the last suspended level to try\n            // rendering it again.\n            root.lastPingedTime = _lastSuspendedTime;\n            break;\n          }\n\n          var _msUntilTimeout;\n\n          if (workInProgressRootLatestSuspenseTimeout !== Sync) {\n            // We have processed a suspense config whose expiration time we\n            // can use as the timeout.\n            _msUntilTimeout = expirationTimeToMs(workInProgressRootLatestSuspenseTimeout) - now();\n          } else if (workInProgressRootLatestProcessedExpirationTime === Sync) {\n            // This should never normally happen because only new updates\n            // cause delayed states, so we should have processed something.\n            // However, this could also happen in an offscreen tree.\n            _msUntilTimeout = 0;\n          } else {\n            // If we don't have a suspense config, we're going to use a\n            // heuristic to determine how long we can suspend.\n            var eventTimeMs = inferTimeFromExpirationTime(workInProgressRootLatestProcessedExpirationTime);\n            var currentTimeMs = now();\n            var timeUntilExpirationMs = expirationTimeToMs(expirationTime) - currentTimeMs;\n            var timeElapsed = currentTimeMs - eventTimeMs;\n\n            if (timeElapsed < 0) {\n              // We get this wrong some time since we estimate the time.\n              timeElapsed = 0;\n            }\n\n            _msUntilTimeout = jnd(timeElapsed) - timeElapsed; // Clamp the timeout to the expiration time. TODO: Once the\n            // event time is exact instead of inferred from expiration time\n            // we don't need this.\n\n            if (timeUntilExpirationMs < _msUntilTimeout) {\n              _msUntilTimeout = timeUntilExpirationMs;\n            }\n          } // Don't bother with a very short suspense time.\n\n\n          if (_msUntilTimeout > 10) {\n            // The render is suspended, it hasn't timed out, and there's no\n            // lower priority work to do. Instead of committing the fallback\n            // immediately, wait for more data to arrive.\n            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout);\n            break;\n          }\n        } // The work expired. Commit immediately.\n\n\n        commitRoot(root);\n        break;\n      }\n\n    case RootCompleted:\n      {\n        // The work completed. Ready to commit.\n        if ( // do not delay if we're inside an act() scope\n        !( IsThisRendererActing.current) && workInProgressRootLatestProcessedExpirationTime !== Sync && workInProgressRootCanSuspendUsingConfig !== null) {\n          // If we have exceeded the minimum loading delay, which probably\n          // means we have shown a spinner already, we might have to suspend\n          // a bit longer to ensure that the spinner is shown for\n          // enough time.\n          var _msUntilTimeout2 = computeMsUntilSuspenseLoadingDelay(workInProgressRootLatestProcessedExpirationTime, expirationTime, workInProgressRootCanSuspendUsingConfig);\n\n          if (_msUntilTimeout2 > 10) {\n            markRootSuspendedAtTime(root, expirationTime);\n            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout2);\n            break;\n          }\n        }\n\n        commitRoot(root);\n        break;\n      }\n\n    default:\n      {\n        {\n          {\n            throw Error( \"Unknown root exit status.\" );\n          }\n        }\n      }\n  }\n} // This is the entry point for synchronous tasks that don't go\n// through Scheduler\n\n\nfunction performSyncWorkOnRoot(root) {\n  // Check if there's expired work on this root. Otherwise, render at Sync.\n  var lastExpiredTime = root.lastExpiredTime;\n  var expirationTime = lastExpiredTime !== NoWork ? lastExpiredTime : Sync;\n\n  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n    {\n      throw Error( \"Should not already be working.\" );\n    }\n  }\n\n  flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack\n  // and prepare a fresh one. Otherwise we'll continue where we left off.\n\n  if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {\n    prepareFreshStack(root, expirationTime);\n    startWorkOnPendingInteractions(root, expirationTime);\n  } // If we have a work-in-progress fiber, it means there's still work to do\n  // in this root.\n\n\n  if (workInProgress !== null) {\n    var prevExecutionContext = executionContext;\n    executionContext |= RenderContext;\n    var prevDispatcher = pushDispatcher();\n    var prevInteractions = pushInteractions(root);\n    startWorkLoopTimer(workInProgress);\n\n    do {\n      try {\n        workLoopSync();\n        break;\n      } catch (thrownValue) {\n        handleError(root, thrownValue);\n      }\n    } while (true);\n\n    resetContextDependencies();\n    executionContext = prevExecutionContext;\n    popDispatcher(prevDispatcher);\n\n    {\n      popInteractions(prevInteractions);\n    }\n\n    if (workInProgressRootExitStatus === RootFatalErrored) {\n      var fatalError = workInProgressRootFatalError;\n      stopInterruptedWorkLoopTimer();\n      prepareFreshStack(root, expirationTime);\n      markRootSuspendedAtTime(root, expirationTime);\n      ensureRootIsScheduled(root);\n      throw fatalError;\n    }\n\n    if (workInProgress !== null) {\n      // This is a sync render, so we should have finished the whole tree.\n      {\n        {\n          throw Error( \"Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n    } else {\n      // We now have a consistent tree. Because this is a sync render, we\n      // will commit it even if something suspended.\n      stopFinishedWorkLoopTimer();\n      root.finishedWork = root.current.alternate;\n      root.finishedExpirationTime = expirationTime;\n      finishSyncRender(root);\n    } // Before exiting, make sure there's a callback scheduled for the next\n    // pending level.\n\n\n    ensureRootIsScheduled(root);\n  }\n\n  return null;\n}\n\nfunction finishSyncRender(root) {\n  // Set this to null to indicate there's no in-progress render.\n  workInProgressRoot = null;\n  commitRoot(root);\n}\nfunction flushDiscreteUpdates() {\n  // TODO: Should be able to flush inside batchedUpdates, but not inside `act`.\n  // However, `act` uses `batchedUpdates`, so there's no way to distinguish\n  // those two cases. Need to fix this before exposing flushDiscreteUpdates\n  // as a public API.\n  if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) {\n    {\n      if ((executionContext & RenderContext) !== NoContext) {\n        error('unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.');\n      }\n    } // We're already rendering, so we can't synchronously flush pending work.\n    // This is probably a nested event dispatch triggered by a lifecycle/effect,\n    // like `el.focus()`. Exit.\n\n\n    return;\n  }\n\n  flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that\n  // they fire before the next serial event.\n\n  flushPassiveEffects();\n}\nfunction syncUpdates(fn, a, b, c) {\n  return runWithPriority$1(ImmediatePriority, fn.bind(null, a, b, c));\n}\n\nfunction flushPendingDiscreteUpdates() {\n  if (rootsWithPendingDiscreteUpdates !== null) {\n    // For each root with pending discrete updates, schedule a callback to\n    // immediately flush them.\n    var roots = rootsWithPendingDiscreteUpdates;\n    rootsWithPendingDiscreteUpdates = null;\n    roots.forEach(function (expirationTime, root) {\n      markRootExpiredAtTime(root, expirationTime);\n      ensureRootIsScheduled(root);\n    }); // Now flush the immediate queue.\n\n    flushSyncCallbackQueue();\n  }\n}\n\nfunction batchedUpdates$1(fn, a) {\n  var prevExecutionContext = executionContext;\n  executionContext |= BatchedContext;\n\n  try {\n    return fn(a);\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction batchedEventUpdates$1(fn, a) {\n  var prevExecutionContext = executionContext;\n  executionContext |= EventContext;\n\n  try {\n    return fn(a);\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction discreteUpdates$1(fn, a, b, c, d) {\n  var prevExecutionContext = executionContext;\n  executionContext |= DiscreteEventContext;\n\n  try {\n    // Should this\n    return runWithPriority$1(UserBlockingPriority$1, fn.bind(null, a, b, c, d));\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction unbatchedUpdates(fn, a) {\n  var prevExecutionContext = executionContext;\n  executionContext &= ~BatchedContext;\n  executionContext |= LegacyUnbatchedContext;\n\n  try {\n    return fn(a);\n  } finally {\n    executionContext = prevExecutionContext;\n\n    if (executionContext === NoContext) {\n      // Flush the immediate callbacks that were scheduled during this batch\n      flushSyncCallbackQueue();\n    }\n  }\n}\nfunction flushSync(fn, a) {\n  if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {\n    {\n      {\n        throw Error( \"flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.\" );\n      }\n    }\n  }\n\n  var prevExecutionContext = executionContext;\n  executionContext |= BatchedContext;\n\n  try {\n    return runWithPriority$1(ImmediatePriority, fn.bind(null, a));\n  } finally {\n    executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch.\n    // Note that this will happen even if batchedUpdates is higher up\n    // the stack.\n\n    flushSyncCallbackQueue();\n  }\n}\n\nfunction prepareFreshStack(root, expirationTime) {\n  root.finishedWork = null;\n  root.finishedExpirationTime = NoWork;\n  var timeoutHandle = root.timeoutHandle;\n\n  if (timeoutHandle !== noTimeout) {\n    // The root previous suspended and scheduled a timeout to commit a fallback\n    // state. Now that we have additional work, cancel the timeout.\n    root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above\n\n    cancelTimeout(timeoutHandle);\n  }\n\n  if (workInProgress !== null) {\n    var interruptedWork = workInProgress.return;\n\n    while (interruptedWork !== null) {\n      unwindInterruptedWork(interruptedWork);\n      interruptedWork = interruptedWork.return;\n    }\n  }\n\n  workInProgressRoot = root;\n  workInProgress = createWorkInProgress(root.current, null);\n  renderExpirationTime$1 = expirationTime;\n  workInProgressRootExitStatus = RootIncomplete;\n  workInProgressRootFatalError = null;\n  workInProgressRootLatestProcessedExpirationTime = Sync;\n  workInProgressRootLatestSuspenseTimeout = Sync;\n  workInProgressRootCanSuspendUsingConfig = null;\n  workInProgressRootNextUnprocessedUpdateTime = NoWork;\n  workInProgressRootHasPendingPing = false;\n\n  {\n    spawnedWorkDuringRender = null;\n  }\n\n  {\n    ReactStrictModeWarnings.discardPendingWarnings();\n  }\n}\n\nfunction handleError(root, thrownValue) {\n  do {\n    try {\n      // Reset module-level state that was set during the render phase.\n      resetContextDependencies();\n      resetHooksAfterThrow();\n      resetCurrentFiber();\n\n      if (workInProgress === null || workInProgress.return === null) {\n        // Expected to be working on a non-root fiber. This is a fatal error\n        // because there's no ancestor that can handle it; the root is\n        // supposed to capture all errors that weren't caught by an error\n        // boundary.\n        workInProgressRootExitStatus = RootFatalErrored;\n        workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next\n        // sibling, or the parent if there are no siblings. But since the root\n        // has no siblings nor a parent, we set it to null. Usually this is\n        // handled by `completeUnitOfWork` or `unwindWork`, but since we're\n        // interntionally not calling those, we need set it here.\n        // TODO: Consider calling `unwindWork` to pop the contexts.\n\n        workInProgress = null;\n        return null;\n      }\n\n      if (enableProfilerTimer && workInProgress.mode & ProfileMode) {\n        // Record the time spent rendering before an error was thrown. This\n        // avoids inaccurate Profiler durations in the case of a\n        // suspended render.\n        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);\n      }\n\n      throwException(root, workInProgress.return, workInProgress, thrownValue, renderExpirationTime$1);\n      workInProgress = completeUnitOfWork(workInProgress);\n    } catch (yetAnotherThrownValue) {\n      // Something in the return path also threw.\n      thrownValue = yetAnotherThrownValue;\n      continue;\n    } // Return to the normal work loop.\n\n\n    return;\n  } while (true);\n}\n\nfunction pushDispatcher(root) {\n  var prevDispatcher = ReactCurrentDispatcher$1.current;\n  ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;\n\n  if (prevDispatcher === null) {\n    // The React isomorphic package does not include a default dispatcher.\n    // Instead the first renderer will lazily attach one, in order to give\n    // nicer error messages.\n    return ContextOnlyDispatcher;\n  } else {\n    return prevDispatcher;\n  }\n}\n\nfunction popDispatcher(prevDispatcher) {\n  ReactCurrentDispatcher$1.current = prevDispatcher;\n}\n\nfunction pushInteractions(root) {\n  {\n    var prevInteractions = tracing.__interactionsRef.current;\n    tracing.__interactionsRef.current = root.memoizedInteractions;\n    return prevInteractions;\n  }\n}\n\nfunction popInteractions(prevInteractions) {\n  {\n    tracing.__interactionsRef.current = prevInteractions;\n  }\n}\n\nfunction markCommitTimeOfFallback() {\n  globalMostRecentFallbackTime = now();\n}\nfunction markRenderEventTimeAndConfig(expirationTime, suspenseConfig) {\n  if (expirationTime < workInProgressRootLatestProcessedExpirationTime && expirationTime > Idle) {\n    workInProgressRootLatestProcessedExpirationTime = expirationTime;\n  }\n\n  if (suspenseConfig !== null) {\n    if (expirationTime < workInProgressRootLatestSuspenseTimeout && expirationTime > Idle) {\n      workInProgressRootLatestSuspenseTimeout = expirationTime; // Most of the time we only have one config and getting wrong is not bad.\n\n      workInProgressRootCanSuspendUsingConfig = suspenseConfig;\n    }\n  }\n}\nfunction markUnprocessedUpdateTime(expirationTime) {\n  if (expirationTime > workInProgressRootNextUnprocessedUpdateTime) {\n    workInProgressRootNextUnprocessedUpdateTime = expirationTime;\n  }\n}\nfunction renderDidSuspend() {\n  if (workInProgressRootExitStatus === RootIncomplete) {\n    workInProgressRootExitStatus = RootSuspended;\n  }\n}\nfunction renderDidSuspendDelayIfPossible() {\n  if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) {\n    workInProgressRootExitStatus = RootSuspendedWithDelay;\n  } // Check if there's a lower priority update somewhere else in the tree.\n\n\n  if (workInProgressRootNextUnprocessedUpdateTime !== NoWork && workInProgressRoot !== null) {\n    // Mark the current render as suspended, and then mark that there's a\n    // pending update.\n    // TODO: This should immediately interrupt the current render, instead\n    // of waiting until the next time we yield.\n    markRootSuspendedAtTime(workInProgressRoot, renderExpirationTime$1);\n    markRootUpdatedAtTime(workInProgressRoot, workInProgressRootNextUnprocessedUpdateTime);\n  }\n}\nfunction renderDidError() {\n  if (workInProgressRootExitStatus !== RootCompleted) {\n    workInProgressRootExitStatus = RootErrored;\n  }\n} // Called during render to determine if anything has suspended.\n// Returns false if we're not sure.\n\nfunction renderHasNotSuspendedYet() {\n  // If something errored or completed, we can't really be sure,\n  // so those are false.\n  return workInProgressRootExitStatus === RootIncomplete;\n}\n\nfunction inferTimeFromExpirationTime(expirationTime) {\n  // We don't know exactly when the update was scheduled, but we can infer an\n  // approximate start time from the expiration time.\n  var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);\n  return earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;\n}\n\nfunction inferTimeFromExpirationTimeWithSuspenseConfig(expirationTime, suspenseConfig) {\n  // We don't know exactly when the update was scheduled, but we can infer an\n  // approximate start time from the expiration time by subtracting the timeout\n  // that was added to the event time.\n  var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);\n  return earliestExpirationTimeMs - (suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);\n} // The work loop is an extremely hot path. Tell Closure not to inline it.\n\n/** @noinline */\n\n\nfunction workLoopSync() {\n  // Already timed out, so perform work without checking if we need to yield.\n  while (workInProgress !== null) {\n    workInProgress = performUnitOfWork(workInProgress);\n  }\n}\n/** @noinline */\n\n\nfunction workLoopConcurrent() {\n  // Perform work until Scheduler asks us to yield\n  while (workInProgress !== null && !shouldYield()) {\n    workInProgress = performUnitOfWork(workInProgress);\n  }\n}\n\nfunction performUnitOfWork(unitOfWork) {\n  // The current, flushed, state of this fiber is the alternate. Ideally\n  // nothing should rely on this, but relying on it here means that we don't\n  // need an additional field on the work in progress.\n  var current = unitOfWork.alternate;\n  startWorkTimer(unitOfWork);\n  setCurrentFiber(unitOfWork);\n  var next;\n\n  if ( (unitOfWork.mode & ProfileMode) !== NoMode) {\n    startProfilerTimer(unitOfWork);\n    next = beginWork$1(current, unitOfWork, renderExpirationTime$1);\n    stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);\n  } else {\n    next = beginWork$1(current, unitOfWork, renderExpirationTime$1);\n  }\n\n  resetCurrentFiber();\n  unitOfWork.memoizedProps = unitOfWork.pendingProps;\n\n  if (next === null) {\n    // If this doesn't spawn new work, complete the current work.\n    next = completeUnitOfWork(unitOfWork);\n  }\n\n  ReactCurrentOwner$2.current = null;\n  return next;\n}\n\nfunction completeUnitOfWork(unitOfWork) {\n  // Attempt to complete the current unit of work, then move to the next\n  // sibling. If there are no more siblings, return to the parent fiber.\n  workInProgress = unitOfWork;\n\n  do {\n    // The current, flushed, state of this fiber is the alternate. Ideally\n    // nothing should rely on this, but relying on it here means that we don't\n    // need an additional field on the work in progress.\n    var current = workInProgress.alternate;\n    var returnFiber = workInProgress.return; // Check if the work completed or if something threw.\n\n    if ((workInProgress.effectTag & Incomplete) === NoEffect) {\n      setCurrentFiber(workInProgress);\n      var next = void 0;\n\n      if ( (workInProgress.mode & ProfileMode) === NoMode) {\n        next = completeWork(current, workInProgress, renderExpirationTime$1);\n      } else {\n        startProfilerTimer(workInProgress);\n        next = completeWork(current, workInProgress, renderExpirationTime$1); // Update render duration assuming we didn't error.\n\n        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);\n      }\n\n      stopWorkTimer(workInProgress);\n      resetCurrentFiber();\n      resetChildExpirationTime(workInProgress);\n\n      if (next !== null) {\n        // Completing this fiber spawned new work. Work on that next.\n        return next;\n      }\n\n      if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete\n      (returnFiber.effectTag & Incomplete) === NoEffect) {\n        // Append all the effects of the subtree and this fiber onto the effect\n        // list of the parent. The completion order of the children affects the\n        // side-effect order.\n        if (returnFiber.firstEffect === null) {\n          returnFiber.firstEffect = workInProgress.firstEffect;\n        }\n\n        if (workInProgress.lastEffect !== null) {\n          if (returnFiber.lastEffect !== null) {\n            returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;\n          }\n\n          returnFiber.lastEffect = workInProgress.lastEffect;\n        } // If this fiber had side-effects, we append it AFTER the children's\n        // side-effects. We can perform certain side-effects earlier if needed,\n        // by doing multiple passes over the effect list. We don't want to\n        // schedule our own side-effect on our own list because if end up\n        // reusing children we'll schedule this effect onto itself since we're\n        // at the end.\n\n\n        var effectTag = workInProgress.effectTag; // Skip both NoWork and PerformedWork tags when creating the effect\n        // list. PerformedWork effect is read by React DevTools but shouldn't be\n        // committed.\n\n        if (effectTag > PerformedWork) {\n          if (returnFiber.lastEffect !== null) {\n            returnFiber.lastEffect.nextEffect = workInProgress;\n          } else {\n            returnFiber.firstEffect = workInProgress;\n          }\n\n          returnFiber.lastEffect = workInProgress;\n        }\n      }\n    } else {\n      // This fiber did not complete because something threw. Pop values off\n      // the stack without entering the complete phase. If this is a boundary,\n      // capture values if possible.\n      var _next = unwindWork(workInProgress); // Because this fiber did not complete, don't reset its expiration time.\n\n\n      if ( (workInProgress.mode & ProfileMode) !== NoMode) {\n        // Record the render duration for the fiber that errored.\n        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); // Include the time spent working on failed children before continuing.\n\n        var actualDuration = workInProgress.actualDuration;\n        var child = workInProgress.child;\n\n        while (child !== null) {\n          actualDuration += child.actualDuration;\n          child = child.sibling;\n        }\n\n        workInProgress.actualDuration = actualDuration;\n      }\n\n      if (_next !== null) {\n        // If completing this work spawned new work, do that next. We'll come\n        // back here again.\n        // Since we're restarting, remove anything that is not a host effect\n        // from the effect tag.\n        // TODO: The name stopFailedWorkTimer is misleading because Suspense\n        // also captures and restarts.\n        stopFailedWorkTimer(workInProgress);\n        _next.effectTag &= HostEffectMask;\n        return _next;\n      }\n\n      stopWorkTimer(workInProgress);\n\n      if (returnFiber !== null) {\n        // Mark the parent fiber as incomplete and clear its effect list.\n        returnFiber.firstEffect = returnFiber.lastEffect = null;\n        returnFiber.effectTag |= Incomplete;\n      }\n    }\n\n    var siblingFiber = workInProgress.sibling;\n\n    if (siblingFiber !== null) {\n      // If there is more work to do in this returnFiber, do that next.\n      return siblingFiber;\n    } // Otherwise, return to the parent\n\n\n    workInProgress = returnFiber;\n  } while (workInProgress !== null); // We've reached the root.\n\n\n  if (workInProgressRootExitStatus === RootIncomplete) {\n    workInProgressRootExitStatus = RootCompleted;\n  }\n\n  return null;\n}\n\nfunction getRemainingExpirationTime(fiber) {\n  var updateExpirationTime = fiber.expirationTime;\n  var childExpirationTime = fiber.childExpirationTime;\n  return updateExpirationTime > childExpirationTime ? updateExpirationTime : childExpirationTime;\n}\n\nfunction resetChildExpirationTime(completedWork) {\n  if (renderExpirationTime$1 !== Never && completedWork.childExpirationTime === Never) {\n    // The children of this component are hidden. Don't bubble their\n    // expiration times.\n    return;\n  }\n\n  var newChildExpirationTime = NoWork; // Bubble up the earliest expiration time.\n\n  if ( (completedWork.mode & ProfileMode) !== NoMode) {\n    // In profiling mode, resetChildExpirationTime is also used to reset\n    // profiler durations.\n    var actualDuration = completedWork.actualDuration;\n    var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will\n    // only be updated if work is done on the fiber (i.e. it doesn't bailout).\n    // When work is done, it should bubble to the parent's actualDuration. If\n    // the fiber has not been cloned though, (meaning no work was done), then\n    // this value will reflect the amount of time spent working on a previous\n    // render. In that case it should not bubble. We determine whether it was\n    // cloned by comparing the child pointer.\n\n    var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child;\n    var child = completedWork.child;\n\n    while (child !== null) {\n      var childUpdateExpirationTime = child.expirationTime;\n      var childChildExpirationTime = child.childExpirationTime;\n\n      if (childUpdateExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = childUpdateExpirationTime;\n      }\n\n      if (childChildExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = childChildExpirationTime;\n      }\n\n      if (shouldBubbleActualDurations) {\n        actualDuration += child.actualDuration;\n      }\n\n      treeBaseDuration += child.treeBaseDuration;\n      child = child.sibling;\n    }\n\n    completedWork.actualDuration = actualDuration;\n    completedWork.treeBaseDuration = treeBaseDuration;\n  } else {\n    var _child = completedWork.child;\n\n    while (_child !== null) {\n      var _childUpdateExpirationTime = _child.expirationTime;\n      var _childChildExpirationTime = _child.childExpirationTime;\n\n      if (_childUpdateExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = _childUpdateExpirationTime;\n      }\n\n      if (_childChildExpirationTime > newChildExpirationTime) {\n        newChildExpirationTime = _childChildExpirationTime;\n      }\n\n      _child = _child.sibling;\n    }\n  }\n\n  completedWork.childExpirationTime = newChildExpirationTime;\n}\n\nfunction commitRoot(root) {\n  var renderPriorityLevel = getCurrentPriorityLevel();\n  runWithPriority$1(ImmediatePriority, commitRootImpl.bind(null, root, renderPriorityLevel));\n  return null;\n}\n\nfunction commitRootImpl(root, renderPriorityLevel) {\n  do {\n    // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which\n    // means `flushPassiveEffects` will sometimes result in additional\n    // passive effects. So we need to keep flushing in a loop until there are\n    // no more pending effects.\n    // TODO: Might be better if `flushPassiveEffects` did not automatically\n    // flush synchronous work at the end, to avoid factoring hazards like this.\n    flushPassiveEffects();\n  } while (rootWithPendingPassiveEffects !== null);\n\n  flushRenderPhaseStrictModeWarningsInDEV();\n\n  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n    {\n      throw Error( \"Should not already be working.\" );\n    }\n  }\n\n  var finishedWork = root.finishedWork;\n  var expirationTime = root.finishedExpirationTime;\n\n  if (finishedWork === null) {\n    return null;\n  }\n\n  root.finishedWork = null;\n  root.finishedExpirationTime = NoWork;\n\n  if (!(finishedWork !== root.current)) {\n    {\n      throw Error( \"Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue.\" );\n    }\n  } // commitRoot never returns a continuation; it always finishes synchronously.\n  // So we can clear these now to allow a new callback to be scheduled.\n\n\n  root.callbackNode = null;\n  root.callbackExpirationTime = NoWork;\n  root.callbackPriority = NoPriority;\n  root.nextKnownPendingLevel = NoWork;\n  startCommitTimer(); // Update the first and last pending times on this root. The new first\n  // pending time is whatever is left on the root fiber.\n\n  var remainingExpirationTimeBeforeCommit = getRemainingExpirationTime(finishedWork);\n  markRootFinishedAtTime(root, expirationTime, remainingExpirationTimeBeforeCommit);\n\n  if (root === workInProgressRoot) {\n    // We can reset these now that they are finished.\n    workInProgressRoot = null;\n    workInProgress = null;\n    renderExpirationTime$1 = NoWork;\n  } // This indicates that the last root we worked on is not the same one that\n  // we're committing now. This most commonly happens when a suspended root\n  // times out.\n  // Get the list of effects.\n\n\n  var firstEffect;\n\n  if (finishedWork.effectTag > PerformedWork) {\n    // A fiber's effect list consists only of its children, not itself. So if\n    // the root has an effect, we need to add it to the end of the list. The\n    // resulting list is the set that would belong to the root's parent, if it\n    // had one; that is, all the effects in the tree including the root.\n    if (finishedWork.lastEffect !== null) {\n      finishedWork.lastEffect.nextEffect = finishedWork;\n      firstEffect = finishedWork.firstEffect;\n    } else {\n      firstEffect = finishedWork;\n    }\n  } else {\n    // There is no effect on the root.\n    firstEffect = finishedWork.firstEffect;\n  }\n\n  if (firstEffect !== null) {\n    var prevExecutionContext = executionContext;\n    executionContext |= CommitContext;\n    var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles\n\n    ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass\n    // of the effect list for each phase: all mutation effects come before all\n    // layout effects, and so on.\n    // The first phase a \"before mutation\" phase. We use this phase to read the\n    // state of the host tree right before we mutate it. This is where\n    // getSnapshotBeforeUpdate is called.\n\n    startCommitSnapshotEffectsTimer();\n    prepareForCommit(root.containerInfo);\n    nextEffect = firstEffect;\n\n    do {\n      {\n        invokeGuardedCallback(null, commitBeforeMutationEffects, null);\n\n        if (hasCaughtError()) {\n          if (!(nextEffect !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var error = clearCaughtError();\n          captureCommitPhaseError(nextEffect, error);\n          nextEffect = nextEffect.nextEffect;\n        }\n      }\n    } while (nextEffect !== null);\n\n    stopCommitSnapshotEffectsTimer();\n\n    {\n      // Mark the current commit time to be shared by all Profilers in this\n      // batch. This enables them to be grouped later.\n      recordCommitTime();\n    } // The next phase is the mutation phase, where we mutate the host tree.\n\n\n    startCommitHostEffectsTimer();\n    nextEffect = firstEffect;\n\n    do {\n      {\n        invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel);\n\n        if (hasCaughtError()) {\n          if (!(nextEffect !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var _error = clearCaughtError();\n\n          captureCommitPhaseError(nextEffect, _error);\n          nextEffect = nextEffect.nextEffect;\n        }\n      }\n    } while (nextEffect !== null);\n\n    stopCommitHostEffectsTimer();\n    resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after\n    // the mutation phase, so that the previous tree is still current during\n    // componentWillUnmount, but before the layout phase, so that the finished\n    // work is current during componentDidMount/Update.\n\n    root.current = finishedWork; // The next phase is the layout phase, where we call effects that read\n    // the host tree after it's been mutated. The idiomatic use case for this is\n    // layout, but class component lifecycles also fire here for legacy reasons.\n\n    startCommitLifeCyclesTimer();\n    nextEffect = firstEffect;\n\n    do {\n      {\n        invokeGuardedCallback(null, commitLayoutEffects, null, root, expirationTime);\n\n        if (hasCaughtError()) {\n          if (!(nextEffect !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var _error2 = clearCaughtError();\n\n          captureCommitPhaseError(nextEffect, _error2);\n          nextEffect = nextEffect.nextEffect;\n        }\n      }\n    } while (nextEffect !== null);\n\n    stopCommitLifeCyclesTimer();\n    nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an\n    // opportunity to paint.\n\n    requestPaint();\n\n    {\n      popInteractions(prevInteractions);\n    }\n\n    executionContext = prevExecutionContext;\n  } else {\n    // No effects.\n    root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were\n    // no effects.\n    // TODO: Maybe there's a better way to report this.\n\n    startCommitSnapshotEffectsTimer();\n    stopCommitSnapshotEffectsTimer();\n\n    {\n      recordCommitTime();\n    }\n\n    startCommitHostEffectsTimer();\n    stopCommitHostEffectsTimer();\n    startCommitLifeCyclesTimer();\n    stopCommitLifeCyclesTimer();\n  }\n\n  stopCommitTimer();\n  var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;\n\n  if (rootDoesHavePassiveEffects) {\n    // This commit has passive effects. Stash a reference to them. But don't\n    // schedule a callback until after flushing layout work.\n    rootDoesHavePassiveEffects = false;\n    rootWithPendingPassiveEffects = root;\n    pendingPassiveEffectsExpirationTime = expirationTime;\n    pendingPassiveEffectsRenderPriority = renderPriorityLevel;\n  } else {\n    // We are done with the effect chain at this point so let's clear the\n    // nextEffect pointers to assist with GC. If we have passive effects, we'll\n    // clear this in flushPassiveEffects.\n    nextEffect = firstEffect;\n\n    while (nextEffect !== null) {\n      var nextNextEffect = nextEffect.nextEffect;\n      nextEffect.nextEffect = null;\n      nextEffect = nextNextEffect;\n    }\n  } // Check if there's remaining work on this root\n\n\n  var remainingExpirationTime = root.firstPendingTime;\n\n  if (remainingExpirationTime !== NoWork) {\n    {\n      if (spawnedWorkDuringRender !== null) {\n        var expirationTimes = spawnedWorkDuringRender;\n        spawnedWorkDuringRender = null;\n\n        for (var i = 0; i < expirationTimes.length; i++) {\n          scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions);\n        }\n      }\n\n      schedulePendingInteractions(root, remainingExpirationTime);\n    }\n  } else {\n    // If there's no remaining work, we can clear the set of already failed\n    // error boundaries.\n    legacyErrorBoundariesThatAlreadyFailed = null;\n  }\n\n  {\n    if (!rootDidHavePassiveEffects) {\n      // If there are no passive effects, then we can complete the pending interactions.\n      // Otherwise, we'll wait until after the passive effects are flushed.\n      // Wait to do this until after remaining work has been scheduled,\n      // so that we don't prematurely signal complete for interactions when there's e.g. hidden work.\n      finishPendingInteractions(root, expirationTime);\n    }\n  }\n\n  if (remainingExpirationTime === Sync) {\n    // Count the number of times the root synchronously re-renders without\n    // finishing. If there are too many, it indicates an infinite update loop.\n    if (root === rootWithNestedUpdates) {\n      nestedUpdateCount++;\n    } else {\n      nestedUpdateCount = 0;\n      rootWithNestedUpdates = root;\n    }\n  } else {\n    nestedUpdateCount = 0;\n  }\n\n  onCommitRoot(finishedWork.stateNode, expirationTime); // Always call this before exiting `commitRoot`, to ensure that any\n  // additional work on this root is scheduled.\n\n  ensureRootIsScheduled(root);\n\n  if (hasUncaughtError) {\n    hasUncaughtError = false;\n    var _error3 = firstUncaughtError;\n    firstUncaughtError = null;\n    throw _error3;\n  }\n\n  if ((executionContext & LegacyUnbatchedContext) !== NoContext) {\n    // This is a legacy edge case. We just committed the initial mount of\n    // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired\n    // synchronously, but layout updates should be deferred until the end\n    // of the batch.\n    return null;\n  } // If layout work was scheduled, flush it now.\n\n\n  flushSyncCallbackQueue();\n  return null;\n}\n\nfunction commitBeforeMutationEffects() {\n  while (nextEffect !== null) {\n    var effectTag = nextEffect.effectTag;\n\n    if ((effectTag & Snapshot) !== NoEffect) {\n      setCurrentFiber(nextEffect);\n      recordEffect();\n      var current = nextEffect.alternate;\n      commitBeforeMutationLifeCycles(current, nextEffect);\n      resetCurrentFiber();\n    }\n\n    if ((effectTag & Passive) !== NoEffect) {\n      // If there are passive effects, schedule a callback to flush at\n      // the earliest opportunity.\n      if (!rootDoesHavePassiveEffects) {\n        rootDoesHavePassiveEffects = true;\n        scheduleCallback(NormalPriority, function () {\n          flushPassiveEffects();\n          return null;\n        });\n      }\n    }\n\n    nextEffect = nextEffect.nextEffect;\n  }\n}\n\nfunction commitMutationEffects(root, renderPriorityLevel) {\n  // TODO: Should probably move the bulk of this function to commitWork.\n  while (nextEffect !== null) {\n    setCurrentFiber(nextEffect);\n    var effectTag = nextEffect.effectTag;\n\n    if (effectTag & ContentReset) {\n      commitResetTextContent(nextEffect);\n    }\n\n    if (effectTag & Ref) {\n      var current = nextEffect.alternate;\n\n      if (current !== null) {\n        commitDetachRef(current);\n      }\n    } // The following switch statement is only concerned about placement,\n    // updates, and deletions. To avoid needing to add a case for every possible\n    // bitmap value, we remove the secondary effects from the effect tag and\n    // switch on that value.\n\n\n    var primaryEffectTag = effectTag & (Placement | Update | Deletion | Hydrating);\n\n    switch (primaryEffectTag) {\n      case Placement:\n        {\n          commitPlacement(nextEffect); // Clear the \"placement\" from effect tag so that we know that this is\n          // inserted, before any life-cycles like componentDidMount gets called.\n          // TODO: findDOMNode doesn't rely on this any more but isMounted does\n          // and isMounted is deprecated anyway so we should be able to kill this.\n\n          nextEffect.effectTag &= ~Placement;\n          break;\n        }\n\n      case PlacementAndUpdate:\n        {\n          // Placement\n          commitPlacement(nextEffect); // Clear the \"placement\" from effect tag so that we know that this is\n          // inserted, before any life-cycles like componentDidMount gets called.\n\n          nextEffect.effectTag &= ~Placement; // Update\n\n          var _current = nextEffect.alternate;\n          commitWork(_current, nextEffect);\n          break;\n        }\n\n      case Hydrating:\n        {\n          nextEffect.effectTag &= ~Hydrating;\n          break;\n        }\n\n      case HydratingAndUpdate:\n        {\n          nextEffect.effectTag &= ~Hydrating; // Update\n\n          var _current2 = nextEffect.alternate;\n          commitWork(_current2, nextEffect);\n          break;\n        }\n\n      case Update:\n        {\n          var _current3 = nextEffect.alternate;\n          commitWork(_current3, nextEffect);\n          break;\n        }\n\n      case Deletion:\n        {\n          commitDeletion(root, nextEffect, renderPriorityLevel);\n          break;\n        }\n    } // TODO: Only record a mutation effect if primaryEffectTag is non-zero.\n\n\n    recordEffect();\n    resetCurrentFiber();\n    nextEffect = nextEffect.nextEffect;\n  }\n}\n\nfunction commitLayoutEffects(root, committedExpirationTime) {\n  // TODO: Should probably move the bulk of this function to commitWork.\n  while (nextEffect !== null) {\n    setCurrentFiber(nextEffect);\n    var effectTag = nextEffect.effectTag;\n\n    if (effectTag & (Update | Callback)) {\n      recordEffect();\n      var current = nextEffect.alternate;\n      commitLifeCycles(root, current, nextEffect);\n    }\n\n    if (effectTag & Ref) {\n      recordEffect();\n      commitAttachRef(nextEffect);\n    }\n\n    resetCurrentFiber();\n    nextEffect = nextEffect.nextEffect;\n  }\n}\n\nfunction flushPassiveEffects() {\n  if (pendingPassiveEffectsRenderPriority !== NoPriority) {\n    var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority ? NormalPriority : pendingPassiveEffectsRenderPriority;\n    pendingPassiveEffectsRenderPriority = NoPriority;\n    return runWithPriority$1(priorityLevel, flushPassiveEffectsImpl);\n  }\n}\n\nfunction flushPassiveEffectsImpl() {\n  if (rootWithPendingPassiveEffects === null) {\n    return false;\n  }\n\n  var root = rootWithPendingPassiveEffects;\n  var expirationTime = pendingPassiveEffectsExpirationTime;\n  rootWithPendingPassiveEffects = null;\n  pendingPassiveEffectsExpirationTime = NoWork;\n\n  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n    {\n      throw Error( \"Cannot flush passive effects while already rendering.\" );\n    }\n  }\n\n  var prevExecutionContext = executionContext;\n  executionContext |= CommitContext;\n  var prevInteractions = pushInteractions(root);\n\n  {\n    // Note: This currently assumes there are no passive effects on the root fiber\n    // because the root is not part of its own effect list.\n    // This could change in the future.\n    var _effect2 = root.current.firstEffect;\n\n    while (_effect2 !== null) {\n      {\n        setCurrentFiber(_effect2);\n        invokeGuardedCallback(null, commitPassiveHookEffects, null, _effect2);\n\n        if (hasCaughtError()) {\n          if (!(_effect2 !== null)) {\n            {\n              throw Error( \"Should be working on an effect.\" );\n            }\n          }\n\n          var _error5 = clearCaughtError();\n\n          captureCommitPhaseError(_effect2, _error5);\n        }\n\n        resetCurrentFiber();\n      }\n\n      var nextNextEffect = _effect2.nextEffect; // Remove nextEffect pointer to assist GC\n\n      _effect2.nextEffect = null;\n      _effect2 = nextNextEffect;\n    }\n  }\n\n  {\n    popInteractions(prevInteractions);\n    finishPendingInteractions(root, expirationTime);\n  }\n\n  executionContext = prevExecutionContext;\n  flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this\n  // exceeds the limit, we'll fire a warning.\n\n  nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1;\n  return true;\n}\n\nfunction isAlreadyFailedLegacyErrorBoundary(instance) {\n  return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);\n}\nfunction markLegacyErrorBoundaryAsFailed(instance) {\n  if (legacyErrorBoundariesThatAlreadyFailed === null) {\n    legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);\n  } else {\n    legacyErrorBoundariesThatAlreadyFailed.add(instance);\n  }\n}\n\nfunction prepareToThrowUncaughtError(error) {\n  if (!hasUncaughtError) {\n    hasUncaughtError = true;\n    firstUncaughtError = error;\n  }\n}\n\nvar onUncaughtError = prepareToThrowUncaughtError;\n\nfunction captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {\n  var errorInfo = createCapturedValue(error, sourceFiber);\n  var update = createRootErrorUpdate(rootFiber, errorInfo, Sync);\n  enqueueUpdate(rootFiber, update);\n  var root = markUpdateTimeFromFiberToRoot(rootFiber, Sync);\n\n  if (root !== null) {\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, Sync);\n  }\n}\n\nfunction captureCommitPhaseError(sourceFiber, error) {\n  if (sourceFiber.tag === HostRoot) {\n    // Error was thrown at the root. There is no parent, so the root\n    // itself should capture it.\n    captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);\n    return;\n  }\n\n  var fiber = sourceFiber.return;\n\n  while (fiber !== null) {\n    if (fiber.tag === HostRoot) {\n      captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error);\n      return;\n    } else if (fiber.tag === ClassComponent) {\n      var ctor = fiber.type;\n      var instance = fiber.stateNode;\n\n      if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {\n        var errorInfo = createCapturedValue(error, sourceFiber);\n        var update = createClassErrorUpdate(fiber, errorInfo, // TODO: This is always sync\n        Sync);\n        enqueueUpdate(fiber, update);\n        var root = markUpdateTimeFromFiberToRoot(fiber, Sync);\n\n        if (root !== null) {\n          ensureRootIsScheduled(root);\n          schedulePendingInteractions(root, Sync);\n        }\n\n        return;\n      }\n    }\n\n    fiber = fiber.return;\n  }\n}\nfunction pingSuspendedRoot(root, thenable, suspendedTime) {\n  var pingCache = root.pingCache;\n\n  if (pingCache !== null) {\n    // The thenable resolved, so we no longer need to memoize, because it will\n    // never be thrown again.\n    pingCache.delete(thenable);\n  }\n\n  if (workInProgressRoot === root && renderExpirationTime$1 === suspendedTime) {\n    // Received a ping at the same priority level at which we're currently\n    // rendering. We might want to restart this render. This should mirror\n    // the logic of whether or not a root suspends once it completes.\n    // TODO: If we're rendering sync either due to Sync, Batched or expired,\n    // we should probably never restart.\n    // If we're suspended with delay, we'll always suspend so we can always\n    // restart. If we're suspended without any updates, it might be a retry.\n    // If it's early in the retry we can restart. We can't know for sure\n    // whether we'll eventually process an update during this render pass,\n    // but it's somewhat unlikely that we get to a ping before that, since\n    // getting to the root most update is usually very fast.\n    if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && workInProgressRootLatestProcessedExpirationTime === Sync && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {\n      // Restart from the root. Don't need to schedule a ping because\n      // we're already working on this tree.\n      prepareFreshStack(root, renderExpirationTime$1);\n    } else {\n      // Even though we can't restart right now, we might get an\n      // opportunity later. So we mark this render as having a ping.\n      workInProgressRootHasPendingPing = true;\n    }\n\n    return;\n  }\n\n  if (!isRootSuspendedAtTime(root, suspendedTime)) {\n    // The root is no longer suspended at this time.\n    return;\n  }\n\n  var lastPingedTime = root.lastPingedTime;\n\n  if (lastPingedTime !== NoWork && lastPingedTime < suspendedTime) {\n    // There's already a lower priority ping scheduled.\n    return;\n  } // Mark the time at which this ping was scheduled.\n\n\n  root.lastPingedTime = suspendedTime;\n\n  ensureRootIsScheduled(root);\n  schedulePendingInteractions(root, suspendedTime);\n}\n\nfunction retryTimedOutBoundary(boundaryFiber, retryTime) {\n  // The boundary fiber (a Suspense component or SuspenseList component)\n  // previously was rendered in its fallback state. One of the promises that\n  // suspended it has resolved, which means at least part of the tree was\n  // likely unblocked. Try rendering again, at a new expiration time.\n  if (retryTime === NoWork) {\n    var suspenseConfig = null; // Retries don't carry over the already committed update.\n\n    var currentTime = requestCurrentTimeForUpdate();\n    retryTime = computeExpirationForFiber(currentTime, boundaryFiber, suspenseConfig);\n  } // TODO: Special case idle priority?\n\n\n  var root = markUpdateTimeFromFiberToRoot(boundaryFiber, retryTime);\n\n  if (root !== null) {\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, retryTime);\n  }\n}\nfunction resolveRetryThenable(boundaryFiber, thenable) {\n  var retryTime = NoWork; // Default\n\n  var retryCache;\n\n  {\n    retryCache = boundaryFiber.stateNode;\n  }\n\n  if (retryCache !== null) {\n    // The thenable resolved, so we no longer need to memoize, because it will\n    // never be thrown again.\n    retryCache.delete(thenable);\n  }\n\n  retryTimedOutBoundary(boundaryFiber, retryTime);\n} // Computes the next Just Noticeable Difference (JND) boundary.\n// The theory is that a person can't tell the difference between small differences in time.\n// Therefore, if we wait a bit longer than necessary that won't translate to a noticeable\n// difference in the experience. However, waiting for longer might mean that we can avoid\n// showing an intermediate loading state. The longer we have already waited, the harder it\n// is to tell small differences in time. Therefore, the longer we've already waited,\n// the longer we can wait additionally. At some point we have to give up though.\n// We pick a train model where the next boundary commits at a consistent schedule.\n// These particular numbers are vague estimates. We expect to adjust them based on research.\n\nfunction jnd(timeElapsed) {\n  return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;\n}\n\nfunction computeMsUntilSuspenseLoadingDelay(mostRecentEventTime, committedExpirationTime, suspenseConfig) {\n  var busyMinDurationMs = suspenseConfig.busyMinDurationMs | 0;\n\n  if (busyMinDurationMs <= 0) {\n    return 0;\n  }\n\n  var busyDelayMs = suspenseConfig.busyDelayMs | 0; // Compute the time until this render pass would expire.\n\n  var currentTimeMs = now();\n  var eventTimeMs = inferTimeFromExpirationTimeWithSuspenseConfig(mostRecentEventTime, suspenseConfig);\n  var timeElapsed = currentTimeMs - eventTimeMs;\n\n  if (timeElapsed <= busyDelayMs) {\n    // If we haven't yet waited longer than the initial delay, we don't\n    // have to wait any additional time.\n    return 0;\n  }\n\n  var msUntilTimeout = busyDelayMs + busyMinDurationMs - timeElapsed; // This is the value that is passed to `setTimeout`.\n\n  return msUntilTimeout;\n}\n\nfunction checkForNestedUpdates() {\n  if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {\n    nestedUpdateCount = 0;\n    rootWithNestedUpdates = null;\n\n    {\n      {\n        throw Error( \"Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.\" );\n      }\n    }\n  }\n\n  {\n    if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {\n      nestedPassiveUpdateCount = 0;\n\n      error('Maximum update depth exceeded. This can happen when a component ' + \"calls setState inside useEffect, but useEffect either doesn't \" + 'have a dependency array, or one of the dependencies changes on ' + 'every render.');\n    }\n  }\n}\n\nfunction flushRenderPhaseStrictModeWarningsInDEV() {\n  {\n    ReactStrictModeWarnings.flushLegacyContextWarning();\n\n    {\n      ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();\n    }\n  }\n}\n\nfunction stopFinishedWorkLoopTimer() {\n  var didCompleteRoot = true;\n  stopWorkLoopTimer(interruptedBy, didCompleteRoot);\n  interruptedBy = null;\n}\n\nfunction stopInterruptedWorkLoopTimer() {\n  // TODO: Track which fiber caused the interruption.\n  var didCompleteRoot = false;\n  stopWorkLoopTimer(interruptedBy, didCompleteRoot);\n  interruptedBy = null;\n}\n\nfunction checkForInterruption(fiberThatReceivedUpdate, updateExpirationTime) {\n  if ( workInProgressRoot !== null && updateExpirationTime > renderExpirationTime$1) {\n    interruptedBy = fiberThatReceivedUpdate;\n  }\n}\n\nvar didWarnStateUpdateForUnmountedComponent = null;\n\nfunction warnAboutUpdateOnUnmountedFiberInDEV(fiber) {\n  {\n    var tag = fiber.tag;\n\n    if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) {\n      // Only warn for user-defined components, not internal ones like Suspense.\n      return;\n    }\n    // the problematic code almost always lies inside that component.\n\n\n    var componentName = getComponentName(fiber.type) || 'ReactComponent';\n\n    if (didWarnStateUpdateForUnmountedComponent !== null) {\n      if (didWarnStateUpdateForUnmountedComponent.has(componentName)) {\n        return;\n      }\n\n      didWarnStateUpdateForUnmountedComponent.add(componentName);\n    } else {\n      didWarnStateUpdateForUnmountedComponent = new Set([componentName]);\n    }\n\n    error(\"Can't perform a React state update on an unmounted component. This \" + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.%s', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function', getStackByFiberInDevAndProd(fiber));\n  }\n}\n\nvar beginWork$1;\n\n{\n  var dummyFiber = null;\n\n  beginWork$1 = function (current, unitOfWork, expirationTime) {\n    // If a component throws an error, we replay it again in a synchronously\n    // dispatched event, so that the debugger will treat it as an uncaught\n    // error See ReactErrorUtils for more information.\n    // Before entering the begin phase, copy the work-in-progress onto a dummy\n    // fiber. If beginWork throws, we'll use this to reset the state.\n    var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);\n\n    try {\n      return beginWork(current, unitOfWork, expirationTime);\n    } catch (originalError) {\n      if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') {\n        // Don't replay promises. Treat everything else like an error.\n        throw originalError;\n      } // Keep this code in sync with handleError; any changes here must have\n      // corresponding changes there.\n\n\n      resetContextDependencies();\n      resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the\n      // same fiber again.\n      // Unwind the failed stack frame\n\n      unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber.\n\n      assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);\n\n      if ( unitOfWork.mode & ProfileMode) {\n        // Reset the profiler timer.\n        startProfilerTimer(unitOfWork);\n      } // Run beginWork again.\n\n\n      invokeGuardedCallback(null, beginWork, null, current, unitOfWork, expirationTime);\n\n      if (hasCaughtError()) {\n        var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`.\n        // Rethrow this error instead of the original one.\n\n        throw replayError;\n      } else {\n        // This branch is reachable if the render phase is impure.\n        throw originalError;\n      }\n    }\n  };\n}\n\nvar didWarnAboutUpdateInRender = false;\nvar didWarnAboutUpdateInRenderForAnotherComponent;\n\n{\n  didWarnAboutUpdateInRenderForAnotherComponent = new Set();\n}\n\nfunction warnAboutRenderPhaseUpdatesInDEV(fiber) {\n  {\n    if (isRendering && (executionContext & RenderContext) !== NoContext) {\n      switch (fiber.tag) {\n        case FunctionComponent:\n        case ForwardRef:\n        case SimpleMemoComponent:\n          {\n            var renderingComponentName = workInProgress && getComponentName(workInProgress.type) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed.\n\n            var dedupeKey = renderingComponentName;\n\n            if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) {\n              didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey);\n              var setStateComponentName = getComponentName(fiber.type) || 'Unknown';\n\n              error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://fb.me/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName);\n            }\n\n            break;\n          }\n\n        case ClassComponent:\n          {\n            if (!didWarnAboutUpdateInRender) {\n              error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.');\n\n              didWarnAboutUpdateInRender = true;\n            }\n\n            break;\n          }\n      }\n    }\n  }\n} // a 'shared' variable that changes when act() opens/closes in tests.\n\n\nvar IsThisRendererActing = {\n  current: false\n};\nfunction warnIfNotScopedWithMatchingAct(fiber) {\n  {\n    if ( IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) {\n      error(\"It looks like you're using the wrong act() around your test interactions.\\n\" + 'Be sure to use the matching version of act() corresponding to your renderer:\\n\\n' + '// for react-dom:\\n' + \"import {act} from 'react-dom/test-utils';\\n\" + '// ...\\n' + 'act(() => ...);\\n\\n' + '// for react-test-renderer:\\n' + \"import TestRenderer from 'react-test-renderer';\\n\" + 'const {act} = TestRenderer;\\n' + '// ...\\n' + 'act(() => ...);' + '%s', getStackByFiberInDevAndProd(fiber));\n    }\n  }\n}\nfunction warnIfNotCurrentlyActingEffectsInDEV(fiber) {\n  {\n    if ( (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {\n      error('An update to %s ran an effect, but was not wrapped in act(...).\\n\\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\\n\\n' + 'act(() => {\\n' + '  /* fire events that update state */\\n' + '});\\n' + '/* assert on the output */\\n\\n' + \"This ensures that you're testing the behavior the user would see \" + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));\n    }\n  }\n}\n\nfunction warnIfNotCurrentlyActingUpdatesInDEV(fiber) {\n  {\n    if ( executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {\n      error('An update to %s inside a test was not wrapped in act(...).\\n\\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\\n\\n' + 'act(() => {\\n' + '  /* fire events that update state */\\n' + '});\\n' + '/* assert on the output */\\n\\n' + \"This ensures that you're testing the behavior the user would see \" + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));\n    }\n  }\n}\n\nvar warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler.\n\nvar didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked\n// scheduler is the actual recommendation. The alternative could be a testing build,\n// a new lib, or whatever; we dunno just yet. This message is for early adopters\n// to get their tests right.\n\nfunction warnIfUnmockedScheduler(fiber) {\n  {\n    if (didWarnAboutUnmockedScheduler === false && Scheduler.unstable_flushAllWithoutAsserting === undefined) {\n      if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) {\n        didWarnAboutUnmockedScheduler = true;\n\n        error('In Concurrent or Sync modes, the \"scheduler\" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \\n' + \"jest.mock('scheduler', () => require('scheduler/unstable_mock'));\\n\\n\" + 'For more info, visit https://fb.me/react-mock-scheduler');\n      }\n    }\n  }\n}\n\nfunction computeThreadID(root, expirationTime) {\n  // Interaction threads are unique per root and expiration time.\n  return expirationTime * 1000 + root.interactionThreadID;\n}\n\nfunction markSpawnedWork(expirationTime) {\n\n  if (spawnedWorkDuringRender === null) {\n    spawnedWorkDuringRender = [expirationTime];\n  } else {\n    spawnedWorkDuringRender.push(expirationTime);\n  }\n}\n\nfunction scheduleInteractions(root, expirationTime, interactions) {\n\n  if (interactions.size > 0) {\n    var pendingInteractionMap = root.pendingInteractionMap;\n    var pendingInteractions = pendingInteractionMap.get(expirationTime);\n\n    if (pendingInteractions != null) {\n      interactions.forEach(function (interaction) {\n        if (!pendingInteractions.has(interaction)) {\n          // Update the pending async work count for previously unscheduled interaction.\n          interaction.__count++;\n        }\n\n        pendingInteractions.add(interaction);\n      });\n    } else {\n      pendingInteractionMap.set(expirationTime, new Set(interactions)); // Update the pending async work count for the current interactions.\n\n      interactions.forEach(function (interaction) {\n        interaction.__count++;\n      });\n    }\n\n    var subscriber = tracing.__subscriberRef.current;\n\n    if (subscriber !== null) {\n      var threadID = computeThreadID(root, expirationTime);\n      subscriber.onWorkScheduled(interactions, threadID);\n    }\n  }\n}\n\nfunction schedulePendingInteractions(root, expirationTime) {\n\n  scheduleInteractions(root, expirationTime, tracing.__interactionsRef.current);\n}\n\nfunction startWorkOnPendingInteractions(root, expirationTime) {\n  // we can accurately attribute time spent working on it, And so that cascading\n  // work triggered during the render phase will be associated with it.\n\n\n  var interactions = new Set();\n  root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {\n    if (scheduledExpirationTime >= expirationTime) {\n      scheduledInteractions.forEach(function (interaction) {\n        return interactions.add(interaction);\n      });\n    }\n  }); // Store the current set of interactions on the FiberRoot for a few reasons:\n  // We can re-use it in hot functions like performConcurrentWorkOnRoot()\n  // without having to recalculate it. We will also use it in commitWork() to\n  // pass to any Profiler onRender() hooks. This also provides DevTools with a\n  // way to access it when the onCommitRoot() hook is called.\n\n  root.memoizedInteractions = interactions;\n\n  if (interactions.size > 0) {\n    var subscriber = tracing.__subscriberRef.current;\n\n    if (subscriber !== null) {\n      var threadID = computeThreadID(root, expirationTime);\n\n      try {\n        subscriber.onWorkStarted(interactions, threadID);\n      } catch (error) {\n        // If the subscriber throws, rethrow it in a separate task\n        scheduleCallback(ImmediatePriority, function () {\n          throw error;\n        });\n      }\n    }\n  }\n}\n\nfunction finishPendingInteractions(root, committedExpirationTime) {\n\n  var earliestRemainingTimeAfterCommit = root.firstPendingTime;\n  var subscriber;\n\n  try {\n    subscriber = tracing.__subscriberRef.current;\n\n    if (subscriber !== null && root.memoizedInteractions.size > 0) {\n      var threadID = computeThreadID(root, committedExpirationTime);\n      subscriber.onWorkStopped(root.memoizedInteractions, threadID);\n    }\n  } catch (error) {\n    // If the subscriber throws, rethrow it in a separate task\n    scheduleCallback(ImmediatePriority, function () {\n      throw error;\n    });\n  } finally {\n    // Clear completed interactions from the pending Map.\n    // Unless the render was suspended or cascading work was scheduled,\n    // In which case– leave pending interactions until the subsequent render.\n    var pendingInteractionMap = root.pendingInteractionMap;\n    pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {\n      // Only decrement the pending interaction count if we're done.\n      // If there's still work at the current priority,\n      // That indicates that we are waiting for suspense data.\n      if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {\n        pendingInteractionMap.delete(scheduledExpirationTime);\n        scheduledInteractions.forEach(function (interaction) {\n          interaction.__count--;\n\n          if (subscriber !== null && interaction.__count === 0) {\n            try {\n              subscriber.onInteractionScheduledWorkCompleted(interaction);\n            } catch (error) {\n              // If the subscriber throws, rethrow it in a separate task\n              scheduleCallback(ImmediatePriority, function () {\n                throw error;\n              });\n            }\n          }\n        });\n      }\n    });\n  }\n}\n\nvar onScheduleFiberRoot = null;\nvar onCommitFiberRoot = null;\nvar onCommitFiberUnmount = null;\nvar hasLoggedError = false;\nvar isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';\nfunction injectInternals(internals) {\n  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {\n    // No DevTools\n    return false;\n  }\n\n  var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n  if (hook.isDisabled) {\n    // This isn't a real property on the hook, but it can be set to opt out\n    // of DevTools integration and associated warnings and logs.\n    // https://github.com/facebook/react/issues/3877\n    return true;\n  }\n\n  if (!hook.supportsFiber) {\n    {\n      error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools');\n    } // DevTools exists, even though it doesn't support Fiber.\n\n\n    return true;\n  }\n\n  try {\n    var rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks.\n\n    if (true) {\n      // Only used by Fast Refresh\n      if (typeof hook.onScheduleFiberRoot === 'function') {\n        onScheduleFiberRoot = function (root, children) {\n          try {\n            hook.onScheduleFiberRoot(rendererID, root, children);\n          } catch (err) {\n            if ( true && !hasLoggedError) {\n              hasLoggedError = true;\n\n              error('React instrumentation encountered an error: %s', err);\n            }\n          }\n        };\n      }\n    }\n\n    onCommitFiberRoot = function (root, expirationTime) {\n      try {\n        var didError = (root.current.effectTag & DidCapture) === DidCapture;\n\n        if (enableProfilerTimer) {\n          var currentTime = getCurrentTime();\n          var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime);\n          hook.onCommitFiberRoot(rendererID, root, priorityLevel, didError);\n        } else {\n          hook.onCommitFiberRoot(rendererID, root, undefined, didError);\n        }\n      } catch (err) {\n        if (true) {\n          if (!hasLoggedError) {\n            hasLoggedError = true;\n\n            error('React instrumentation encountered an error: %s', err);\n          }\n        }\n      }\n    };\n\n    onCommitFiberUnmount = function (fiber) {\n      try {\n        hook.onCommitFiberUnmount(rendererID, fiber);\n      } catch (err) {\n        if (true) {\n          if (!hasLoggedError) {\n            hasLoggedError = true;\n\n            error('React instrumentation encountered an error: %s', err);\n          }\n        }\n      }\n    };\n  } catch (err) {\n    // Catch all errors because it is unsafe to throw during initialization.\n    {\n      error('React instrumentation encountered an error: %s.', err);\n    }\n  } // DevTools exists\n\n\n  return true;\n}\nfunction onScheduleRoot(root, children) {\n  if (typeof onScheduleFiberRoot === 'function') {\n    onScheduleFiberRoot(root, children);\n  }\n}\nfunction onCommitRoot(root, expirationTime) {\n  if (typeof onCommitFiberRoot === 'function') {\n    onCommitFiberRoot(root, expirationTime);\n  }\n}\nfunction onCommitUnmount(fiber) {\n  if (typeof onCommitFiberUnmount === 'function') {\n    onCommitFiberUnmount(fiber);\n  }\n}\n\nvar hasBadMapPolyfill;\n\n{\n  hasBadMapPolyfill = false;\n\n  try {\n    var nonExtensibleObject = Object.preventExtensions({});\n    var testMap = new Map([[nonExtensibleObject, null]]);\n    var testSet = new Set([nonExtensibleObject]); // This is necessary for Rollup to not consider these unused.\n    // https://github.com/rollup/rollup/issues/1771\n    // TODO: we can remove these if Rollup fixes the bug.\n\n    testMap.set(0, 0);\n    testSet.add(0);\n  } catch (e) {\n    // TODO: Consider warning about bad polyfills\n    hasBadMapPolyfill = true;\n  }\n}\n\nvar debugCounter = 1;\n\nfunction FiberNode(tag, pendingProps, key, mode) {\n  // Instance\n  this.tag = tag;\n  this.key = key;\n  this.elementType = null;\n  this.type = null;\n  this.stateNode = null; // Fiber\n\n  this.return = null;\n  this.child = null;\n  this.sibling = null;\n  this.index = 0;\n  this.ref = null;\n  this.pendingProps = pendingProps;\n  this.memoizedProps = null;\n  this.updateQueue = null;\n  this.memoizedState = null;\n  this.dependencies = null;\n  this.mode = mode; // Effects\n\n  this.effectTag = NoEffect;\n  this.nextEffect = null;\n  this.firstEffect = null;\n  this.lastEffect = null;\n  this.expirationTime = NoWork;\n  this.childExpirationTime = NoWork;\n  this.alternate = null;\n\n  {\n    // Note: The following is done to avoid a v8 performance cliff.\n    //\n    // Initializing the fields below to smis and later updating them with\n    // double values will cause Fibers to end up having separate shapes.\n    // This behavior/bug has something to do with Object.preventExtension().\n    // Fortunately this only impacts DEV builds.\n    // Unfortunately it makes React unusably slow for some applications.\n    // To work around this, initialize the fields below with doubles.\n    //\n    // Learn more about this here:\n    // https://github.com/facebook/react/issues/14365\n    // https://bugs.chromium.org/p/v8/issues/detail?id=8538\n    this.actualDuration = Number.NaN;\n    this.actualStartTime = Number.NaN;\n    this.selfBaseDuration = Number.NaN;\n    this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.\n    // This won't trigger the performance cliff mentioned above,\n    // and it simplifies other profiler code (including DevTools).\n\n    this.actualDuration = 0;\n    this.actualStartTime = -1;\n    this.selfBaseDuration = 0;\n    this.treeBaseDuration = 0;\n  } // This is normally DEV-only except www when it adds listeners.\n  // TODO: remove the User Timing integration in favor of Root Events.\n\n\n  {\n    this._debugID = debugCounter++;\n    this._debugIsCurrentlyTiming = false;\n  }\n\n  {\n    this._debugSource = null;\n    this._debugOwner = null;\n    this._debugNeedsRemount = false;\n    this._debugHookTypes = null;\n\n    if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {\n      Object.preventExtensions(this);\n    }\n  }\n} // This is a constructor function, rather than a POJO constructor, still\n// please ensure we do the following:\n// 1) Nobody should add any instance methods on this. Instance methods can be\n//    more difficult to predict when they get optimized and they are almost\n//    never inlined properly in static compilers.\n// 2) Nobody should rely on `instanceof Fiber` for type testing. We should\n//    always know when it is a fiber.\n// 3) We might want to experiment with using numeric keys since they are easier\n//    to optimize in a non-JIT environment.\n// 4) We can easily go from a constructor to a createFiber object literal if that\n//    is faster.\n// 5) It should be easy to port this to a C struct and keep a C implementation\n//    compatible.\n\n\nvar createFiber = function (tag, pendingProps, key, mode) {\n  // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors\n  return new FiberNode(tag, pendingProps, key, mode);\n};\n\nfunction shouldConstruct(Component) {\n  var prototype = Component.prototype;\n  return !!(prototype && prototype.isReactComponent);\n}\n\nfunction isSimpleFunctionComponent(type) {\n  return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined;\n}\nfunction resolveLazyComponentTag(Component) {\n  if (typeof Component === 'function') {\n    return shouldConstruct(Component) ? ClassComponent : FunctionComponent;\n  } else if (Component !== undefined && Component !== null) {\n    var $$typeof = Component.$$typeof;\n\n    if ($$typeof === REACT_FORWARD_REF_TYPE) {\n      return ForwardRef;\n    }\n\n    if ($$typeof === REACT_MEMO_TYPE) {\n      return MemoComponent;\n    }\n  }\n\n  return IndeterminateComponent;\n} // This is used to create an alternate fiber to do work on.\n\nfunction createWorkInProgress(current, pendingProps) {\n  var workInProgress = current.alternate;\n\n  if (workInProgress === null) {\n    // We use a double buffering pooling technique because we know that we'll\n    // only ever need at most two versions of a tree. We pool the \"other\" unused\n    // node that we're free to reuse. This is lazily created to avoid allocating\n    // extra objects for things that are never updated. It also allow us to\n    // reclaim the extra memory if needed.\n    workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);\n    workInProgress.elementType = current.elementType;\n    workInProgress.type = current.type;\n    workInProgress.stateNode = current.stateNode;\n\n    {\n      // DEV-only fields\n      {\n        workInProgress._debugID = current._debugID;\n      }\n\n      workInProgress._debugSource = current._debugSource;\n      workInProgress._debugOwner = current._debugOwner;\n      workInProgress._debugHookTypes = current._debugHookTypes;\n    }\n\n    workInProgress.alternate = current;\n    current.alternate = workInProgress;\n  } else {\n    workInProgress.pendingProps = pendingProps; // We already have an alternate.\n    // Reset the effect tag.\n\n    workInProgress.effectTag = NoEffect; // The effect list is no longer valid.\n\n    workInProgress.nextEffect = null;\n    workInProgress.firstEffect = null;\n    workInProgress.lastEffect = null;\n\n    {\n      // We intentionally reset, rather than copy, actualDuration & actualStartTime.\n      // This prevents time from endlessly accumulating in new commits.\n      // This has the downside of resetting values for different priority renders,\n      // But works for yielding (the common case) and should support resuming.\n      workInProgress.actualDuration = 0;\n      workInProgress.actualStartTime = -1;\n    }\n  }\n\n  workInProgress.childExpirationTime = current.childExpirationTime;\n  workInProgress.expirationTime = current.expirationTime;\n  workInProgress.child = current.child;\n  workInProgress.memoizedProps = current.memoizedProps;\n  workInProgress.memoizedState = current.memoizedState;\n  workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so\n  // it cannot be shared with the current fiber.\n\n  var currentDependencies = current.dependencies;\n  workInProgress.dependencies = currentDependencies === null ? null : {\n    expirationTime: currentDependencies.expirationTime,\n    firstContext: currentDependencies.firstContext,\n    responders: currentDependencies.responders\n  }; // These will be overridden during the parent's reconciliation\n\n  workInProgress.sibling = current.sibling;\n  workInProgress.index = current.index;\n  workInProgress.ref = current.ref;\n\n  {\n    workInProgress.selfBaseDuration = current.selfBaseDuration;\n    workInProgress.treeBaseDuration = current.treeBaseDuration;\n  }\n\n  {\n    workInProgress._debugNeedsRemount = current._debugNeedsRemount;\n\n    switch (workInProgress.tag) {\n      case IndeterminateComponent:\n      case FunctionComponent:\n      case SimpleMemoComponent:\n        workInProgress.type = resolveFunctionForHotReloading(current.type);\n        break;\n\n      case ClassComponent:\n        workInProgress.type = resolveClassForHotReloading(current.type);\n        break;\n\n      case ForwardRef:\n        workInProgress.type = resolveForwardRefForHotReloading(current.type);\n        break;\n    }\n  }\n\n  return workInProgress;\n} // Used to reuse a Fiber for a second pass.\n\nfunction resetWorkInProgress(workInProgress, renderExpirationTime) {\n  // This resets the Fiber to what createFiber or createWorkInProgress would\n  // have set the values to before during the first pass. Ideally this wouldn't\n  // be necessary but unfortunately many code paths reads from the workInProgress\n  // when they should be reading from current and writing to workInProgress.\n  // We assume pendingProps, index, key, ref, return are still untouched to\n  // avoid doing another reconciliation.\n  // Reset the effect tag but keep any Placement tags, since that's something\n  // that child fiber is setting, not the reconciliation.\n  workInProgress.effectTag &= Placement; // The effect list is no longer valid.\n\n  workInProgress.nextEffect = null;\n  workInProgress.firstEffect = null;\n  workInProgress.lastEffect = null;\n  var current = workInProgress.alternate;\n\n  if (current === null) {\n    // Reset to createFiber's initial values.\n    workInProgress.childExpirationTime = NoWork;\n    workInProgress.expirationTime = renderExpirationTime;\n    workInProgress.child = null;\n    workInProgress.memoizedProps = null;\n    workInProgress.memoizedState = null;\n    workInProgress.updateQueue = null;\n    workInProgress.dependencies = null;\n\n    {\n      // Note: We don't reset the actualTime counts. It's useful to accumulate\n      // actual time across multiple render passes.\n      workInProgress.selfBaseDuration = 0;\n      workInProgress.treeBaseDuration = 0;\n    }\n  } else {\n    // Reset to the cloned values that createWorkInProgress would've.\n    workInProgress.childExpirationTime = current.childExpirationTime;\n    workInProgress.expirationTime = current.expirationTime;\n    workInProgress.child = current.child;\n    workInProgress.memoizedProps = current.memoizedProps;\n    workInProgress.memoizedState = current.memoizedState;\n    workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so\n    // it cannot be shared with the current fiber.\n\n    var currentDependencies = current.dependencies;\n    workInProgress.dependencies = currentDependencies === null ? null : {\n      expirationTime: currentDependencies.expirationTime,\n      firstContext: currentDependencies.firstContext,\n      responders: currentDependencies.responders\n    };\n\n    {\n      // Note: We don't reset the actualTime counts. It's useful to accumulate\n      // actual time across multiple render passes.\n      workInProgress.selfBaseDuration = current.selfBaseDuration;\n      workInProgress.treeBaseDuration = current.treeBaseDuration;\n    }\n  }\n\n  return workInProgress;\n}\nfunction createHostRootFiber(tag) {\n  var mode;\n\n  if (tag === ConcurrentRoot) {\n    mode = ConcurrentMode | BlockingMode | StrictMode;\n  } else if (tag === BlockingRoot) {\n    mode = BlockingMode | StrictMode;\n  } else {\n    mode = NoMode;\n  }\n\n  if ( isDevToolsPresent) {\n    // Always collect profile timings when DevTools are present.\n    // This enables DevTools to start capturing timing at any point–\n    // Without some nodes in the tree having empty base times.\n    mode |= ProfileMode;\n  }\n\n  return createFiber(HostRoot, null, null, mode);\n}\nfunction createFiberFromTypeAndProps(type, // React$ElementType\nkey, pendingProps, owner, mode, expirationTime) {\n  var fiber;\n  var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy.\n\n  var resolvedType = type;\n\n  if (typeof type === 'function') {\n    if (shouldConstruct(type)) {\n      fiberTag = ClassComponent;\n\n      {\n        resolvedType = resolveClassForHotReloading(resolvedType);\n      }\n    } else {\n      {\n        resolvedType = resolveFunctionForHotReloading(resolvedType);\n      }\n    }\n  } else if (typeof type === 'string') {\n    fiberTag = HostComponent;\n  } else {\n    getTag: switch (type) {\n      case REACT_FRAGMENT_TYPE:\n        return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);\n\n      case REACT_CONCURRENT_MODE_TYPE:\n        fiberTag = Mode;\n        mode |= ConcurrentMode | BlockingMode | StrictMode;\n        break;\n\n      case REACT_STRICT_MODE_TYPE:\n        fiberTag = Mode;\n        mode |= StrictMode;\n        break;\n\n      case REACT_PROFILER_TYPE:\n        return createFiberFromProfiler(pendingProps, mode, expirationTime, key);\n\n      case REACT_SUSPENSE_TYPE:\n        return createFiberFromSuspense(pendingProps, mode, expirationTime, key);\n\n      case REACT_SUSPENSE_LIST_TYPE:\n        return createFiberFromSuspenseList(pendingProps, mode, expirationTime, key);\n\n      default:\n        {\n          if (typeof type === 'object' && type !== null) {\n            switch (type.$$typeof) {\n              case REACT_PROVIDER_TYPE:\n                fiberTag = ContextProvider;\n                break getTag;\n\n              case REACT_CONTEXT_TYPE:\n                // This is a consumer\n                fiberTag = ContextConsumer;\n                break getTag;\n\n              case REACT_FORWARD_REF_TYPE:\n                fiberTag = ForwardRef;\n\n                {\n                  resolvedType = resolveForwardRefForHotReloading(resolvedType);\n                }\n\n                break getTag;\n\n              case REACT_MEMO_TYPE:\n                fiberTag = MemoComponent;\n                break getTag;\n\n              case REACT_LAZY_TYPE:\n                fiberTag = LazyComponent;\n                resolvedType = null;\n                break getTag;\n\n              case REACT_BLOCK_TYPE:\n                fiberTag = Block;\n                break getTag;\n\n            }\n          }\n\n          var info = '';\n\n          {\n            if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n              info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and \" + 'named imports.';\n            }\n\n            var ownerName = owner ? getComponentName(owner.type) : null;\n\n            if (ownerName) {\n              info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n            }\n          }\n\n          {\n            {\n              throw Error( \"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: \" + (type == null ? type : typeof type) + \".\" + info );\n            }\n          }\n        }\n    }\n  }\n\n  fiber = createFiber(fiberTag, pendingProps, key, mode);\n  fiber.elementType = type;\n  fiber.type = resolvedType;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromElement(element, mode, expirationTime) {\n  var owner = null;\n\n  {\n    owner = element._owner;\n  }\n\n  var type = element.type;\n  var key = element.key;\n  var pendingProps = element.props;\n  var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime);\n\n  {\n    fiber._debugSource = element._source;\n    fiber._debugOwner = element._owner;\n  }\n\n  return fiber;\n}\nfunction createFiberFromFragment(elements, mode, expirationTime, key) {\n  var fiber = createFiber(Fragment, elements, key, mode);\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\n\nfunction createFiberFromProfiler(pendingProps, mode, expirationTime, key) {\n  {\n    if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') {\n      error('Profiler must specify an \"id\" string and \"onRender\" function as props');\n    }\n  }\n\n  var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag.\n\n  fiber.elementType = REACT_PROFILER_TYPE;\n  fiber.type = REACT_PROFILER_TYPE;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\n\nfunction createFiberFromSuspense(pendingProps, mode, expirationTime, key) {\n  var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.\n  // This needs to be fixed in getComponentName so that it relies on the tag\n  // instead.\n\n  fiber.type = REACT_SUSPENSE_TYPE;\n  fiber.elementType = REACT_SUSPENSE_TYPE;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromSuspenseList(pendingProps, mode, expirationTime, key) {\n  var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);\n\n  {\n    // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag.\n    // This needs to be fixed in getComponentName so that it relies on the tag\n    // instead.\n    fiber.type = REACT_SUSPENSE_LIST_TYPE;\n  }\n\n  fiber.elementType = REACT_SUSPENSE_LIST_TYPE;\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromText(content, mode, expirationTime) {\n  var fiber = createFiber(HostText, content, null, mode);\n  fiber.expirationTime = expirationTime;\n  return fiber;\n}\nfunction createFiberFromHostInstanceForDeletion() {\n  var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type.\n\n  fiber.elementType = 'DELETED';\n  fiber.type = 'DELETED';\n  return fiber;\n}\nfunction createFiberFromPortal(portal, mode, expirationTime) {\n  var pendingProps = portal.children !== null ? portal.children : [];\n  var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);\n  fiber.expirationTime = expirationTime;\n  fiber.stateNode = {\n    containerInfo: portal.containerInfo,\n    pendingChildren: null,\n    // Used by persistent updates\n    implementation: portal.implementation\n  };\n  return fiber;\n} // Used for stashing WIP properties to replay failed work in DEV.\n\nfunction assignFiberPropertiesInDEV(target, source) {\n  if (target === null) {\n    // This Fiber's initial properties will always be overwritten.\n    // We only use a Fiber to ensure the same hidden class so DEV isn't slow.\n    target = createFiber(IndeterminateComponent, null, null, NoMode);\n  } // This is intentionally written as a list of all properties.\n  // We tried to use Object.assign() instead but this is called in\n  // the hottest path, and Object.assign() was too slow:\n  // https://github.com/facebook/react/issues/12502\n  // This code is DEV-only so size is not a concern.\n\n\n  target.tag = source.tag;\n  target.key = source.key;\n  target.elementType = source.elementType;\n  target.type = source.type;\n  target.stateNode = source.stateNode;\n  target.return = source.return;\n  target.child = source.child;\n  target.sibling = source.sibling;\n  target.index = source.index;\n  target.ref = source.ref;\n  target.pendingProps = source.pendingProps;\n  target.memoizedProps = source.memoizedProps;\n  target.updateQueue = source.updateQueue;\n  target.memoizedState = source.memoizedState;\n  target.dependencies = source.dependencies;\n  target.mode = source.mode;\n  target.effectTag = source.effectTag;\n  target.nextEffect = source.nextEffect;\n  target.firstEffect = source.firstEffect;\n  target.lastEffect = source.lastEffect;\n  target.expirationTime = source.expirationTime;\n  target.childExpirationTime = source.childExpirationTime;\n  target.alternate = source.alternate;\n\n  {\n    target.actualDuration = source.actualDuration;\n    target.actualStartTime = source.actualStartTime;\n    target.selfBaseDuration = source.selfBaseDuration;\n    target.treeBaseDuration = source.treeBaseDuration;\n  }\n\n  {\n    target._debugID = source._debugID;\n  }\n\n  target._debugSource = source._debugSource;\n  target._debugOwner = source._debugOwner;\n  target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;\n  target._debugNeedsRemount = source._debugNeedsRemount;\n  target._debugHookTypes = source._debugHookTypes;\n  return target;\n}\n\nfunction FiberRootNode(containerInfo, tag, hydrate) {\n  this.tag = tag;\n  this.current = null;\n  this.containerInfo = containerInfo;\n  this.pendingChildren = null;\n  this.pingCache = null;\n  this.finishedExpirationTime = NoWork;\n  this.finishedWork = null;\n  this.timeoutHandle = noTimeout;\n  this.context = null;\n  this.pendingContext = null;\n  this.hydrate = hydrate;\n  this.callbackNode = null;\n  this.callbackPriority = NoPriority;\n  this.firstPendingTime = NoWork;\n  this.firstSuspendedTime = NoWork;\n  this.lastSuspendedTime = NoWork;\n  this.nextKnownPendingLevel = NoWork;\n  this.lastPingedTime = NoWork;\n  this.lastExpiredTime = NoWork;\n\n  {\n    this.interactionThreadID = tracing.unstable_getThreadID();\n    this.memoizedInteractions = new Set();\n    this.pendingInteractionMap = new Map();\n  }\n}\n\nfunction createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) {\n  var root = new FiberRootNode(containerInfo, tag, hydrate);\n  // stateNode is any.\n\n\n  var uninitializedFiber = createHostRootFiber(tag);\n  root.current = uninitializedFiber;\n  uninitializedFiber.stateNode = root;\n  initializeUpdateQueue(uninitializedFiber);\n  return root;\n}\nfunction isRootSuspendedAtTime(root, expirationTime) {\n  var firstSuspendedTime = root.firstSuspendedTime;\n  var lastSuspendedTime = root.lastSuspendedTime;\n  return firstSuspendedTime !== NoWork && firstSuspendedTime >= expirationTime && lastSuspendedTime <= expirationTime;\n}\nfunction markRootSuspendedAtTime(root, expirationTime) {\n  var firstSuspendedTime = root.firstSuspendedTime;\n  var lastSuspendedTime = root.lastSuspendedTime;\n\n  if (firstSuspendedTime < expirationTime) {\n    root.firstSuspendedTime = expirationTime;\n  }\n\n  if (lastSuspendedTime > expirationTime || firstSuspendedTime === NoWork) {\n    root.lastSuspendedTime = expirationTime;\n  }\n\n  if (expirationTime <= root.lastPingedTime) {\n    root.lastPingedTime = NoWork;\n  }\n\n  if (expirationTime <= root.lastExpiredTime) {\n    root.lastExpiredTime = NoWork;\n  }\n}\nfunction markRootUpdatedAtTime(root, expirationTime) {\n  // Update the range of pending times\n  var firstPendingTime = root.firstPendingTime;\n\n  if (expirationTime > firstPendingTime) {\n    root.firstPendingTime = expirationTime;\n  } // Update the range of suspended times. Treat everything lower priority or\n  // equal to this update as unsuspended.\n\n\n  var firstSuspendedTime = root.firstSuspendedTime;\n\n  if (firstSuspendedTime !== NoWork) {\n    if (expirationTime >= firstSuspendedTime) {\n      // The entire suspended range is now unsuspended.\n      root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;\n    } else if (expirationTime >= root.lastSuspendedTime) {\n      root.lastSuspendedTime = expirationTime + 1;\n    } // This is a pending level. Check if it's higher priority than the next\n    // known pending level.\n\n\n    if (expirationTime > root.nextKnownPendingLevel) {\n      root.nextKnownPendingLevel = expirationTime;\n    }\n  }\n}\nfunction markRootFinishedAtTime(root, finishedExpirationTime, remainingExpirationTime) {\n  // Update the range of pending times\n  root.firstPendingTime = remainingExpirationTime; // Update the range of suspended times. Treat everything higher priority or\n  // equal to this update as unsuspended.\n\n  if (finishedExpirationTime <= root.lastSuspendedTime) {\n    // The entire suspended range is now unsuspended.\n    root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;\n  } else if (finishedExpirationTime <= root.firstSuspendedTime) {\n    // Part of the suspended range is now unsuspended. Narrow the range to\n    // include everything between the unsuspended time (non-inclusive) and the\n    // last suspended time.\n    root.firstSuspendedTime = finishedExpirationTime - 1;\n  }\n\n  if (finishedExpirationTime <= root.lastPingedTime) {\n    // Clear the pinged time\n    root.lastPingedTime = NoWork;\n  }\n\n  if (finishedExpirationTime <= root.lastExpiredTime) {\n    // Clear the expired time\n    root.lastExpiredTime = NoWork;\n  }\n}\nfunction markRootExpiredAtTime(root, expirationTime) {\n  var lastExpiredTime = root.lastExpiredTime;\n\n  if (lastExpiredTime === NoWork || lastExpiredTime > expirationTime) {\n    root.lastExpiredTime = expirationTime;\n  }\n}\n\nvar didWarnAboutNestedUpdates;\nvar didWarnAboutFindNodeInStrictMode;\n\n{\n  didWarnAboutNestedUpdates = false;\n  didWarnAboutFindNodeInStrictMode = {};\n}\n\nfunction getContextForSubtree(parentComponent) {\n  if (!parentComponent) {\n    return emptyContextObject;\n  }\n\n  var fiber = get(parentComponent);\n  var parentContext = findCurrentUnmaskedContext(fiber);\n\n  if (fiber.tag === ClassComponent) {\n    var Component = fiber.type;\n\n    if (isContextProvider(Component)) {\n      return processChildContext(fiber, Component, parentContext);\n    }\n  }\n\n  return parentContext;\n}\n\nfunction findHostInstanceWithWarning(component, methodName) {\n  {\n    var fiber = get(component);\n\n    if (fiber === undefined) {\n      if (typeof component.render === 'function') {\n        {\n          {\n            throw Error( \"Unable to find node on an unmounted component.\" );\n          }\n        }\n      } else {\n        {\n          {\n            throw Error( \"Argument appears to not be a ReactComponent. Keys: \" + Object.keys(component) );\n          }\n        }\n      }\n    }\n\n    var hostFiber = findCurrentHostFiber(fiber);\n\n    if (hostFiber === null) {\n      return null;\n    }\n\n    if (hostFiber.mode & StrictMode) {\n      var componentName = getComponentName(fiber.type) || 'Component';\n\n      if (!didWarnAboutFindNodeInStrictMode[componentName]) {\n        didWarnAboutFindNodeInStrictMode[componentName] = true;\n\n        if (fiber.mode & StrictMode) {\n          error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));\n        } else {\n          error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));\n        }\n      }\n    }\n\n    return hostFiber.stateNode;\n  }\n}\n\nfunction createContainer(containerInfo, tag, hydrate, hydrationCallbacks) {\n  return createFiberRoot(containerInfo, tag, hydrate);\n}\nfunction updateContainer(element, container, parentComponent, callback) {\n  {\n    onScheduleRoot(container, element);\n  }\n\n  var current$1 = container.current;\n  var currentTime = requestCurrentTimeForUpdate();\n\n  {\n    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n    if ('undefined' !== typeof jest) {\n      warnIfUnmockedScheduler(current$1);\n      warnIfNotScopedWithMatchingAct(current$1);\n    }\n  }\n\n  var suspenseConfig = requestCurrentSuspenseConfig();\n  var expirationTime = computeExpirationForFiber(currentTime, current$1, suspenseConfig);\n  var context = getContextForSubtree(parentComponent);\n\n  if (container.context === null) {\n    container.context = context;\n  } else {\n    container.pendingContext = context;\n  }\n\n  {\n    if (isRendering && current !== null && !didWarnAboutNestedUpdates) {\n      didWarnAboutNestedUpdates = true;\n\n      error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\\n\\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown');\n    }\n  }\n\n  var update = createUpdate(expirationTime, suspenseConfig); // Caution: React DevTools currently depends on this property\n  // being called \"element\".\n\n  update.payload = {\n    element: element\n  };\n  callback = callback === undefined ? null : callback;\n\n  if (callback !== null) {\n    {\n      if (typeof callback !== 'function') {\n        error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback);\n      }\n    }\n\n    update.callback = callback;\n  }\n\n  enqueueUpdate(current$1, update);\n  scheduleWork(current$1, expirationTime);\n  return expirationTime;\n}\nfunction getPublicRootInstance(container) {\n  var containerFiber = container.current;\n\n  if (!containerFiber.child) {\n    return null;\n  }\n\n  switch (containerFiber.child.tag) {\n    case HostComponent:\n      return getPublicInstance(containerFiber.child.stateNode);\n\n    default:\n      return containerFiber.child.stateNode;\n  }\n}\n\nfunction markRetryTimeImpl(fiber, retryTime) {\n  var suspenseState = fiber.memoizedState;\n\n  if (suspenseState !== null && suspenseState.dehydrated !== null) {\n    if (suspenseState.retryTime < retryTime) {\n      suspenseState.retryTime = retryTime;\n    }\n  }\n} // Increases the priority of thennables when they resolve within this boundary.\n\n\nfunction markRetryTimeIfNotHydrated(fiber, retryTime) {\n  markRetryTimeImpl(fiber, retryTime);\n  var alternate = fiber.alternate;\n\n  if (alternate) {\n    markRetryTimeImpl(alternate, retryTime);\n  }\n}\n\nfunction attemptUserBlockingHydration$1(fiber) {\n  if (fiber.tag !== SuspenseComponent) {\n    // We ignore HostRoots here because we can't increase\n    // their priority and they should not suspend on I/O,\n    // since you have to wrap anything that might suspend in\n    // Suspense.\n    return;\n  }\n\n  var expTime = computeInteractiveExpiration(requestCurrentTimeForUpdate());\n  scheduleWork(fiber, expTime);\n  markRetryTimeIfNotHydrated(fiber, expTime);\n}\nfunction attemptContinuousHydration$1(fiber) {\n  if (fiber.tag !== SuspenseComponent) {\n    // We ignore HostRoots here because we can't increase\n    // their priority and they should not suspend on I/O,\n    // since you have to wrap anything that might suspend in\n    // Suspense.\n    return;\n  }\n\n  scheduleWork(fiber, ContinuousHydration);\n  markRetryTimeIfNotHydrated(fiber, ContinuousHydration);\n}\nfunction attemptHydrationAtCurrentPriority$1(fiber) {\n  if (fiber.tag !== SuspenseComponent) {\n    // We ignore HostRoots here because we can't increase\n    // their priority other than synchronously flush it.\n    return;\n  }\n\n  var currentTime = requestCurrentTimeForUpdate();\n  var expTime = computeExpirationForFiber(currentTime, fiber, null);\n  scheduleWork(fiber, expTime);\n  markRetryTimeIfNotHydrated(fiber, expTime);\n}\nfunction findHostInstanceWithNoPortals(fiber) {\n  var hostFiber = findCurrentHostFiberWithNoPortals(fiber);\n\n  if (hostFiber === null) {\n    return null;\n  }\n\n  if (hostFiber.tag === FundamentalComponent) {\n    return hostFiber.stateNode.instance;\n  }\n\n  return hostFiber.stateNode;\n}\n\nvar shouldSuspendImpl = function (fiber) {\n  return false;\n};\n\nfunction shouldSuspend(fiber) {\n  return shouldSuspendImpl(fiber);\n}\nvar overrideHookState = null;\nvar overrideProps = null;\nvar scheduleUpdate = null;\nvar setSuspenseHandler = null;\n\n{\n  var copyWithSetImpl = function (obj, path, idx, value) {\n    if (idx >= path.length) {\n      return value;\n    }\n\n    var key = path[idx];\n    var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here\n\n    updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);\n    return updated;\n  };\n\n  var copyWithSet = function (obj, path, value) {\n    return copyWithSetImpl(obj, path, 0, value);\n  }; // Support DevTools editable values for useState and useReducer.\n\n\n  overrideHookState = function (fiber, id, path, value) {\n    // For now, the \"id\" of stateful hooks is just the stateful hook index.\n    // This may change in the future with e.g. nested hooks.\n    var currentHook = fiber.memoizedState;\n\n    while (currentHook !== null && id > 0) {\n      currentHook = currentHook.next;\n      id--;\n    }\n\n    if (currentHook !== null) {\n      var newState = copyWithSet(currentHook.memoizedState, path, value);\n      currentHook.memoizedState = newState;\n      currentHook.baseState = newState; // We aren't actually adding an update to the queue,\n      // because there is no update we can add for useReducer hooks that won't trigger an error.\n      // (There's no appropriate action type for DevTools overrides.)\n      // As a result though, React will see the scheduled update as a noop and bailout.\n      // Shallow cloning props works as a workaround for now to bypass the bailout check.\n\n      fiber.memoizedProps = _assign({}, fiber.memoizedProps);\n      scheduleWork(fiber, Sync);\n    }\n  }; // Support DevTools props for function components, forwardRef, memo, host components, etc.\n\n\n  overrideProps = function (fiber, path, value) {\n    fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);\n\n    if (fiber.alternate) {\n      fiber.alternate.pendingProps = fiber.pendingProps;\n    }\n\n    scheduleWork(fiber, Sync);\n  };\n\n  scheduleUpdate = function (fiber) {\n    scheduleWork(fiber, Sync);\n  };\n\n  setSuspenseHandler = function (newShouldSuspendImpl) {\n    shouldSuspendImpl = newShouldSuspendImpl;\n  };\n}\n\nfunction injectIntoDevTools(devToolsConfig) {\n  var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;\n  var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\n  return injectInternals(_assign({}, devToolsConfig, {\n    overrideHookState: overrideHookState,\n    overrideProps: overrideProps,\n    setSuspenseHandler: setSuspenseHandler,\n    scheduleUpdate: scheduleUpdate,\n    currentDispatcherRef: ReactCurrentDispatcher,\n    findHostInstanceByFiber: function (fiber) {\n      var hostFiber = findCurrentHostFiber(fiber);\n\n      if (hostFiber === null) {\n        return null;\n      }\n\n      return hostFiber.stateNode;\n    },\n    findFiberByHostInstance: function (instance) {\n      if (!findFiberByHostInstance) {\n        // Might not be implemented by the renderer.\n        return null;\n      }\n\n      return findFiberByHostInstance(instance);\n    },\n    // React Refresh\n    findHostInstancesForRefresh:  findHostInstancesForRefresh ,\n    scheduleRefresh:  scheduleRefresh ,\n    scheduleRoot:  scheduleRoot ,\n    setRefreshHandler:  setRefreshHandler ,\n    // Enables DevTools to append owner stacks to error messages in DEV mode.\n    getCurrentFiber:  function () {\n      return current;\n    } \n  }));\n}\nvar IsSomeRendererActing$1 = ReactSharedInternals.IsSomeRendererActing;\n\nfunction ReactDOMRoot(container, options) {\n  this._internalRoot = createRootImpl(container, ConcurrentRoot, options);\n}\n\nfunction ReactDOMBlockingRoot(container, tag, options) {\n  this._internalRoot = createRootImpl(container, tag, options);\n}\n\nReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children) {\n  var root = this._internalRoot;\n\n  {\n    if (typeof arguments[1] === 'function') {\n      error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');\n    }\n\n    var container = root.containerInfo;\n\n    if (container.nodeType !== COMMENT_NODE) {\n      var hostInstance = findHostInstanceWithNoPortals(root.current);\n\n      if (hostInstance) {\n        if (hostInstance.parentNode !== container) {\n          error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + \"root.unmount() to empty a root's container.\");\n        }\n      }\n    }\n  }\n\n  updateContainer(children, root, null, null);\n};\n\nReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function () {\n  {\n    if (typeof arguments[0] === 'function') {\n      error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');\n    }\n  }\n\n  var root = this._internalRoot;\n  var container = root.containerInfo;\n  updateContainer(null, root, null, function () {\n    unmarkContainerAsRoot(container);\n  });\n};\n\nfunction createRootImpl(container, tag, options) {\n  // Tag is either LegacyRoot or Concurrent Root\n  var hydrate = options != null && options.hydrate === true;\n  var hydrationCallbacks = options != null && options.hydrationOptions || null;\n  var root = createContainer(container, tag, hydrate);\n  markContainerAsRoot(root.current, container);\n\n  if (hydrate && tag !== LegacyRoot) {\n    var doc = container.nodeType === DOCUMENT_NODE ? container : container.ownerDocument;\n    eagerlyTrapReplayableEvents(container, doc);\n  }\n\n  return root;\n}\nfunction createLegacyRoot(container, options) {\n  return new ReactDOMBlockingRoot(container, LegacyRoot, options);\n}\nfunction isValidContainer(node) {\n  return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));\n}\n\nvar ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;\nvar topLevelUpdateWarnings;\nvar warnedAboutHydrateAPI = false;\n\n{\n  topLevelUpdateWarnings = function (container) {\n    if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {\n      var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);\n\n      if (hostInstance) {\n        if (hostInstance.parentNode !== container) {\n          error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.');\n        }\n      }\n    }\n\n    var isRootRenderedBySomeReact = !!container._reactRootContainer;\n    var rootEl = getReactRootElementInContainer(container);\n    var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));\n\n    if (hasNonRootReactChild && !isRootRenderedBySomeReact) {\n      error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.');\n    }\n\n    if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {\n      error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.');\n    }\n  };\n}\n\nfunction getReactRootElementInContainer(container) {\n  if (!container) {\n    return null;\n  }\n\n  if (container.nodeType === DOCUMENT_NODE) {\n    return container.documentElement;\n  } else {\n    return container.firstChild;\n  }\n}\n\nfunction shouldHydrateDueToLegacyHeuristic(container) {\n  var rootElement = getReactRootElementInContainer(container);\n  return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));\n}\n\nfunction legacyCreateRootFromDOMContainer(container, forceHydrate) {\n  var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content.\n\n  if (!shouldHydrate) {\n    var warned = false;\n    var rootSibling;\n\n    while (rootSibling = container.lastChild) {\n      {\n        if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {\n          warned = true;\n\n          error('render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.');\n        }\n      }\n\n      container.removeChild(rootSibling);\n    }\n  }\n\n  {\n    if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {\n      warnedAboutHydrateAPI = true;\n\n      warn('render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.');\n    }\n  }\n\n  return createLegacyRoot(container, shouldHydrate ? {\n    hydrate: true\n  } : undefined);\n}\n\nfunction warnOnInvalidCallback$1(callback, callerName) {\n  {\n    if (callback !== null && typeof callback !== 'function') {\n      error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);\n    }\n  }\n}\n\nfunction legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {\n  {\n    topLevelUpdateWarnings(container);\n    warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render');\n  } // TODO: Without `any` type, Flow says \"Property cannot be accessed on any\n  // member of intersection type.\" Whyyyyyy.\n\n\n  var root = container._reactRootContainer;\n  var fiberRoot;\n\n  if (!root) {\n    // Initial mount\n    root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);\n    fiberRoot = root._internalRoot;\n\n    if (typeof callback === 'function') {\n      var originalCallback = callback;\n\n      callback = function () {\n        var instance = getPublicRootInstance(fiberRoot);\n        originalCallback.call(instance);\n      };\n    } // Initial mount should not be batched.\n\n\n    unbatchedUpdates(function () {\n      updateContainer(children, fiberRoot, parentComponent, callback);\n    });\n  } else {\n    fiberRoot = root._internalRoot;\n\n    if (typeof callback === 'function') {\n      var _originalCallback = callback;\n\n      callback = function () {\n        var instance = getPublicRootInstance(fiberRoot);\n\n        _originalCallback.call(instance);\n      };\n    } // Update\n\n\n    updateContainer(children, fiberRoot, parentComponent, callback);\n  }\n\n  return getPublicRootInstance(fiberRoot);\n}\n\nfunction findDOMNode(componentOrElement) {\n  {\n    var owner = ReactCurrentOwner$3.current;\n\n    if (owner !== null && owner.stateNode !== null) {\n      var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;\n\n      if (!warnedAboutRefsInRender) {\n        error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component');\n      }\n\n      owner.stateNode._warnedAboutRefsInRender = true;\n    }\n  }\n\n  if (componentOrElement == null) {\n    return null;\n  }\n\n  if (componentOrElement.nodeType === ELEMENT_NODE) {\n    return componentOrElement;\n  }\n\n  {\n    return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');\n  }\n}\nfunction hydrate(element, container, callback) {\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  }\n\n  {\n    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n    if (isModernRoot) {\n      error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?');\n    }\n  } // TODO: throw or warn if we couldn't hydrate?\n\n\n  return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);\n}\nfunction render(element, container, callback) {\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  }\n\n  {\n    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n    if (isModernRoot) {\n      error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?');\n    }\n  }\n\n  return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);\n}\nfunction unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {\n  if (!isValidContainer(containerNode)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  }\n\n  if (!(parentComponent != null && has(parentComponent))) {\n    {\n      throw Error( \"parentComponent must be a valid React Component\" );\n    }\n  }\n\n  return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);\n}\nfunction unmountComponentAtNode(container) {\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"unmountComponentAtNode(...): Target container is not a DOM element.\" );\n    }\n  }\n\n  {\n    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n    if (isModernRoot) {\n      error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?');\n    }\n  }\n\n  if (container._reactRootContainer) {\n    {\n      var rootEl = getReactRootElementInContainer(container);\n      var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);\n\n      if (renderedByDifferentReact) {\n        error(\"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by another copy of React.');\n      }\n    } // Unmount should not be batched.\n\n\n    unbatchedUpdates(function () {\n      legacyRenderSubtreeIntoContainer(null, null, container, false, function () {\n        // $FlowFixMe This should probably use `delete container._reactRootContainer`\n        container._reactRootContainer = null;\n        unmarkContainerAsRoot(container);\n      });\n    }); // If you call unmountComponentAtNode twice in quick succession, you'll\n    // get `true` twice. That's probably fine?\n\n    return true;\n  } else {\n    {\n      var _rootEl = getReactRootElementInContainer(container);\n\n      var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl)); // Check if the container itself is a React root node.\n\n      var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;\n\n      if (hasNonRootReactChild) {\n        error(\"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.');\n      }\n    }\n\n    return false;\n  }\n}\n\nfunction createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation.\nimplementation) {\n  var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n  return {\n    // This tag allow us to uniquely identify this as a React Portal\n    $$typeof: REACT_PORTAL_TYPE,\n    key: key == null ? null : '' + key,\n    children: children,\n    containerInfo: containerInfo,\n    implementation: implementation\n  };\n}\n\nvar ReactVersion = '16.13.1';\n\nsetAttemptUserBlockingHydration(attemptUserBlockingHydration$1);\nsetAttemptContinuousHydration(attemptContinuousHydration$1);\nsetAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);\nvar didWarnAboutUnstableCreatePortal = false;\n\n{\n  if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype\n  Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype\n  Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {\n    error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n  }\n}\n\nsetRestoreImplementation(restoreControlledState$3);\nsetBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1);\n\nfunction createPortal$1(children, container) {\n  var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  if (!isValidContainer(container)) {\n    {\n      throw Error( \"Target container is not a DOM element.\" );\n    }\n  } // TODO: pass ReactDOM portal implementation as third argument\n  // $FlowFixMe The Flow type is opaque but there's no way to actually create it.\n\n\n  return createPortal(children, container, null, key);\n}\n\nfunction renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {\n\n  return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);\n}\n\nfunction unstable_createPortal(children, container) {\n  var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n  {\n    if (!didWarnAboutUnstableCreatePortal) {\n      didWarnAboutUnstableCreatePortal = true;\n\n      warn('The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the \"unstable_\" prefix.');\n    }\n  }\n\n  return createPortal$1(children, container, key);\n}\n\nvar Internals = {\n  // Keep in sync with ReactDOMUnstableNativeDependencies.js\n  // ReactTestUtils.js, and ReactTestUtilsAct.js. This is an array for better minification.\n  Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch, flushPassiveEffects, IsThisRendererActing]\n};\nvar foundDevTools = injectIntoDevTools({\n  findFiberByHostInstance: getClosestInstanceFromNode,\n  bundleType:  1 ,\n  version: ReactVersion,\n  rendererPackageName: 'react-dom'\n});\n\n{\n  if (!foundDevTools && canUseDOM && window.top === window.self) {\n    // If we're in Chrome or Firefox, provide a download link if not installed.\n    if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {\n      var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://.\n\n      if (/^(https?|file):$/.test(protocol)) {\n        // eslint-disable-next-line react-internal/no-production-logging\n        console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold');\n      }\n    }\n  }\n}\n\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals;\nexports.createPortal = createPortal$1;\nexports.findDOMNode = findDOMNode;\nexports.flushSync = flushSync;\nexports.hydrate = hydrate;\nexports.render = render;\nexports.unmountComponentAtNode = unmountComponentAtNode;\nexports.unstable_batchedUpdates = batchedUpdates$1;\nexports.unstable_createPortal = unstable_createPortal;\nexports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;\nexports.version = ReactVersion;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-dom/cjs/react-dom.development.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-dom/index.js":
+/*!*****************************************************!*\
+  !*** ./jaas-client/node_modules/react-dom/index.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (true) {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react-dom.development.js */ \"./jaas-client/node_modules/react-dom/cjs/react-dom.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-dom/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-input-emoji/dist/index.es.js":
+/*!*********************************************************************!*\
+  !*** ./jaas-client/node_modules/react-input-emoji/dist/index.es.js ***!
+  \*********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nfunction styleInject(css, ref) {\n  if ( ref === void 0 ) ref = {};\n  var insertAt = ref.insertAt;\n\n  if (!css || typeof document === 'undefined') { return; }\n\n  var head = document.head || document.getElementsByTagName('head')[0];\n  var style = document.createElement('style');\n  style.type = 'text/css';\n\n  if (insertAt === 'top') {\n    if (head.firstChild) {\n      head.insertBefore(style, head.firstChild);\n    } else {\n      head.appendChild(style);\n    }\n  } else {\n    head.appendChild(style);\n  }\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar css = \".emoji-mart,\\n.emoji-mart * {\\n  box-sizing: border-box;\\n  line-height: 1.15;\\n}\\n\\n.emoji-mart {\\n  font-family: -apple-system, BlinkMacSystemFont, \\\"Helvetica Neue\\\", sans-serif;\\n  font-size: 16px;\\n  display: inline-block;\\n  color: #222427;\\n  border: 1px solid #d9d9d9;\\n  border-radius: 5px;\\n  background: #fff;\\n}\\n\\n.emoji-mart .emoji-mart-emoji {\\n  padding: 6px;\\n}\\n\\n.emoji-mart-bar {\\n  border: 0 solid #d9d9d9;\\n}\\n.emoji-mart-bar:first-child {\\n  border-bottom-width: 1px;\\n  border-top-left-radius: 5px;\\n  border-top-right-radius: 5px;\\n}\\n.emoji-mart-bar:last-child {\\n  border-top-width: 1px;\\n  border-bottom-left-radius: 5px;\\n  border-bottom-right-radius: 5px;\\n}\\n\\n.emoji-mart-anchors {\\n  display: flex;\\n  flex-direction: row;\\n  justify-content: space-between;\\n  padding: 0 6px;\\n  color: #858585;\\n  line-height: 0;\\n}\\n\\n.emoji-mart-anchor {\\n  position: relative;\\n  display: block;\\n  flex: 1 1 auto;\\n  text-align: center;\\n  padding: 12px 4px;\\n  overflow: hidden;\\n  transition: color .1s ease-out;\\n  margin: 0;\\n  box-shadow: none;\\n  background: none;\\n  border: none;\\n}\\n.emoji-mart-anchor:hover,\\n.emoji-mart-anchor-selected {\\n  color: #464646;\\n}\\n\\n.emoji-mart-anchor-selected .emoji-mart-anchor-bar {\\n  bottom: 0;\\n}\\n\\n.emoji-mart-anchor-bar {\\n  position: absolute;\\n  bottom: -3px; left: 0;\\n  width: 100%; height: 3px;\\n  background-color: #464646;\\n}\\n\\n.emoji-mart-anchors i {\\n  display: inline-block;\\n  width: 100%;\\n  max-width: 22px;\\n}\\n\\n.emoji-mart-anchors svg,\\n.emoji-mart-anchors img {\\n  fill: #858585;\\n  height: 18px;\\n  width: 18px;\\n}\\n\\n.emoji-mart-scroll {\\n  overflow-y: scroll;\\n  height: 270px;\\n  padding: 0 6px 6px 6px;\\n  will-change: transform; /* avoids \\\"repaints on scroll\\\" in mobile Chrome */\\n}\\n\\n.emoji-mart-search {\\n  margin-top: 6px;\\n  padding: 0 6px;\\n  position: relative;\\n}\\n\\n.emoji-mart-search input {\\n  font-size: 16px;\\n  display: block;\\n  width: 100%;\\n  padding: 5px 25px 6px 10px;\\n  border-radius: 5px;\\n  border: 1px solid #d9d9d9;\\n  outline: 0;\\n}\\n\\n.emoji-mart-search input,\\n.emoji-mart-search input::-webkit-search-decoration,\\n.emoji-mart-search input::-webkit-search-cancel-button,\\n.emoji-mart-search input::-webkit-search-results-button,\\n.emoji-mart-search input::-webkit-search-results-decoration {\\n  /* remove webkit/blink styles for <input type=\\\"search\\\">\\n   * via https://stackoverflow.com/a/9422689 */\\n  -webkit-appearance: none;\\n}\\n\\n.emoji-mart-search-icon {\\n  position: absolute;\\n  top: 7px;\\n  right: 11px;\\n  z-index: 2;\\n  padding: 2px 5px 1px;\\n  border: none;\\n  background: none;\\n}\\n\\n.emoji-mart-category .emoji-mart-emoji span {\\n  z-index: 1;\\n  position: relative;\\n  text-align: center;\\n  cursor: default;\\n}\\n\\n.emoji-mart-category .emoji-mart-emoji:hover:before {\\n  z-index: 0;\\n  content: \\\"\\\";\\n  position: absolute;\\n  top: 0; left: 0;\\n  width: 100%; height: 100%;\\n  background-color: #f4f4f4;\\n  border-radius: 100%;\\n}\\n\\n.emoji-mart-category-label {\\n  z-index: 2;\\n  position: relative;\\n  position: -webkit-sticky;\\n  position: sticky;\\n  top: 0;\\n}\\n\\n.emoji-mart-category-label span {\\n  display: block;\\n  width: 100%;\\n  font-weight: 500;\\n  padding: 5px 6px;\\n  background-color: #fff;\\n  background-color: rgba(255, 255, 255, .95);\\n}\\n\\n.emoji-mart-category-list {\\n  margin: 0;\\n  padding: 0;\\n}\\n\\n.emoji-mart-category-list li {\\n  list-style: none;\\n  margin: 0;\\n  padding: 0;\\n  display: inline-block;\\n}\\n\\n.emoji-mart-emoji {\\n  position: relative;\\n  display: inline-block;\\n  font-size: 0;\\n  margin: 0;\\n  padding: 0;\\n  border: none;\\n  background: none;\\n  box-shadow: none;\\n}\\n\\n.emoji-mart-emoji-native {\\n  font-family: \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Segoe UI\\\", \\\"Apple Color Emoji\\\", \\\"Twemoji Mozilla\\\", \\\"Noto Color Emoji\\\", \\\"EmojiOne Color\\\", \\\"Android Emoji\\\";\\n}\\n\\n.emoji-mart-no-results {\\n  font-size: 14px;\\n  text-align: center;\\n  padding-top: 70px;\\n  color: #858585;\\n}\\n.emoji-mart-no-results-img {\\n  display: block;\\n  margin-left: auto;\\n  margin-right: auto;\\n  width: 50%;\\n}\\n.emoji-mart-no-results .emoji-mart-category-label {\\n  display: none;\\n}\\n.emoji-mart-no-results .emoji-mart-no-results-label {\\n  margin-top: .2em;\\n}\\n.emoji-mart-no-results .emoji-mart-emoji:hover:before {\\n  content: none;\\n}\\n\\n.emoji-mart-preview {\\n  position: relative;\\n  height: 70px;\\n}\\n\\n.emoji-mart-preview-emoji,\\n.emoji-mart-preview-data,\\n.emoji-mart-preview-skins {\\n  position: absolute;\\n  top: 50%;\\n  transform: translateY(-50%);\\n}\\n\\n.emoji-mart-preview-emoji {\\n  left: 12px;\\n}\\n\\n.emoji-mart-preview-data {\\n  left: 68px; right: 12px;\\n  word-break: break-all;\\n}\\n\\n.emoji-mart-preview-skins {\\n  right: 30px;\\n  text-align: right;\\n}\\n\\n.emoji-mart-preview-skins.custom {\\n  right: 10px;\\n  text-align: right;\\n}\\n\\n.emoji-mart-preview-name {\\n  font-size: 14px;\\n}\\n\\n.emoji-mart-preview-shortname {\\n  font-size: 12px;\\n  color: #888;\\n}\\n.emoji-mart-preview-shortname + .emoji-mart-preview-shortname,\\n.emoji-mart-preview-shortname + .emoji-mart-preview-emoticon,\\n.emoji-mart-preview-emoticon + .emoji-mart-preview-emoticon {\\n  margin-left: .5em;\\n}\\n\\n.emoji-mart-preview-emoticon {\\n  font-size: 11px;\\n  color: #bbb;\\n}\\n\\n.emoji-mart-title span {\\n  display: inline-block;\\n  vertical-align: middle;\\n}\\n\\n.emoji-mart-title .emoji-mart-emoji {\\n  padding: 0;\\n}\\n\\n.emoji-mart-title-label {\\n  color: #999A9C;\\n  font-size: 26px;\\n  font-weight: 300;\\n}\\n\\n.emoji-mart-skin-swatches {\\n  font-size: 0;\\n  padding: 2px 0;\\n  border: 1px solid #d9d9d9;\\n  border-radius: 12px;\\n  background-color: #fff;\\n}\\n\\n.emoji-mart-skin-swatches.custom {\\n  font-size: 0;\\n  border: none;\\n  background-color: #fff;\\n}\\n\\n.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch {\\n  width: 16px;\\n  padding: 0 2px;\\n}\\n\\n.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch.selected:after {\\n  opacity: .75;\\n}\\n\\n.emoji-mart-skin-swatch {\\n  display: inline-block;\\n  width: 0;\\n  vertical-align: middle;\\n  transition-property: width, padding;\\n  transition-duration: .125s;\\n  transition-timing-function: ease-out;\\n}\\n\\n.emoji-mart-skin-swatch:nth-child(1) { transition-delay: 0s }\\n.emoji-mart-skin-swatch:nth-child(2) { transition-delay: .03s }\\n.emoji-mart-skin-swatch:nth-child(3) { transition-delay: .06s }\\n.emoji-mart-skin-swatch:nth-child(4) { transition-delay: .09s }\\n.emoji-mart-skin-swatch:nth-child(5) { transition-delay: .12s }\\n.emoji-mart-skin-swatch:nth-child(6) { transition-delay: .15s }\\n\\n.emoji-mart-skin-swatch.selected {\\n  position: relative;\\n  width: 16px;\\n  padding: 0 2px;\\n}\\n\\n.emoji-mart-skin-swatch.selected:after {\\n  content: \\\"\\\";\\n  position: absolute;\\n  top: 50%; left: 50%;\\n  width: 4px; height: 4px;\\n  margin: -2px 0 0 -2px;\\n  background-color: #fff;\\n  border-radius: 100%;\\n  pointer-events: none;\\n  opacity: 0;\\n  transition: opacity .2s ease-out;\\n}\\n\\n.emoji-mart-skin-swatch.custom {\\n  display: inline-block;\\n  width: 0;\\n  height: 38px;\\n  overflow: hidden;\\n  vertical-align: middle;\\n  transition-property: width, height;\\n  transition-duration: .125s;\\n  transition-timing-function: ease-out;\\n  cursor: default;\\n}\\n\\n.emoji-mart-skin-swatch.custom.selected {\\n  position: relative;\\n  width: 36px;\\n  height: 38px;\\n  padding: 0 2px 0 0;\\n}\\n\\n.emoji-mart-skin-swatch.custom.selected:after {\\n  content: \\\"\\\";\\n  width: 0;\\n  height: 0;\\n}\\n\\n.emoji-mart-skin-swatches.custom .emoji-mart-skin-swatch.custom:hover {\\n  background-color: #f4f4f4;\\n  border-radius: 10%;\\n}\\n\\n.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom {\\n  width: 36px;\\n  height: 38px;\\n  padding: 0 2px 0 0;\\n}\\n\\n.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom.selected:after {\\n  opacity: .75;\\n}\\n\\n.emoji-mart-skin-text.opened {\\n  display: inline-block;\\n  vertical-align: middle;\\n  text-align: left;\\n  color: #888;\\n  font-size: 11px;\\n  padding: 5px 2px;\\n  width: 95px;\\n  height: 40px;\\n  border-radius: 10%;\\n  background-color: #fff;\\n}\\n\\n.emoji-mart-skin {\\n  display: inline-block;\\n  width: 100%;\\n  padding-top: 100%;\\n  max-width: 12px;\\n  border-radius: 100%;\\n}\\n\\n.emoji-mart-skin-tone-1 { background-color: #ffc93a }\\n.emoji-mart-skin-tone-2 { background-color: #fadcbc }\\n.emoji-mart-skin-tone-3 { background-color: #e0bb95 }\\n.emoji-mart-skin-tone-4 { background-color: #bf8f68 }\\n.emoji-mart-skin-tone-5 { background-color: #9b643d }\\n.emoji-mart-skin-tone-6 { background-color: #594539 }\\n\\n/* For screenreaders only, via https://stackoverflow.com/a/19758620 */\\n.emoji-mart-sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  border: 0;\\n}\\n\\n\\n\";\nstyleInject(css);\n\nvar compressed = true;\nvar categories = [\n\t{\n\t\tid: \"people\",\n\t\tname: \"Smileys & People\",\n\t\temojis: [\n\t\t\t\"grinning\",\n\t\t\t\"grin\",\n\t\t\t\"joy\",\n\t\t\t\"rolling_on_the_floor_laughing\",\n\t\t\t\"smiley\",\n\t\t\t\"smile\",\n\t\t\t\"sweat_smile\",\n\t\t\t\"laughing\",\n\t\t\t\"wink\",\n\t\t\t\"blush\",\n\t\t\t\"yum\",\n\t\t\t\"sunglasses\",\n\t\t\t\"heart_eyes\",\n\t\t\t\"kissing_heart\",\n\t\t\t\"kissing\",\n\t\t\t\"kissing_smiling_eyes\",\n\t\t\t\"kissing_closed_eyes\",\n\t\t\t\"relaxed\",\n\t\t\t\"slightly_smiling_face\",\n\t\t\t\"hugging_face\",\n\t\t\t\"star-struck\",\n\t\t\t\"thinking_face\",\n\t\t\t\"face_with_raised_eyebrow\",\n\t\t\t\"neutral_face\",\n\t\t\t\"expressionless\",\n\t\t\t\"no_mouth\",\n\t\t\t\"face_with_rolling_eyes\",\n\t\t\t\"smirk\",\n\t\t\t\"persevere\",\n\t\t\t\"disappointed_relieved\",\n\t\t\t\"open_mouth\",\n\t\t\t\"zipper_mouth_face\",\n\t\t\t\"hushed\",\n\t\t\t\"sleepy\",\n\t\t\t\"tired_face\",\n\t\t\t\"sleeping\",\n\t\t\t\"relieved\",\n\t\t\t\"stuck_out_tongue\",\n\t\t\t\"stuck_out_tongue_winking_eye\",\n\t\t\t\"stuck_out_tongue_closed_eyes\",\n\t\t\t\"drooling_face\",\n\t\t\t\"unamused\",\n\t\t\t\"sweat\",\n\t\t\t\"pensive\",\n\t\t\t\"confused\",\n\t\t\t\"upside_down_face\",\n\t\t\t\"money_mouth_face\",\n\t\t\t\"astonished\",\n\t\t\t\"white_frowning_face\",\n\t\t\t\"slightly_frowning_face\",\n\t\t\t\"confounded\",\n\t\t\t\"disappointed\",\n\t\t\t\"worried\",\n\t\t\t\"triumph\",\n\t\t\t\"cry\",\n\t\t\t\"sob\",\n\t\t\t\"frowning\",\n\t\t\t\"anguished\",\n\t\t\t\"fearful\",\n\t\t\t\"weary\",\n\t\t\t\"exploding_head\",\n\t\t\t\"grimacing\",\n\t\t\t\"cold_sweat\",\n\t\t\t\"scream\",\n\t\t\t\"flushed\",\n\t\t\t\"zany_face\",\n\t\t\t\"dizzy_face\",\n\t\t\t\"rage\",\n\t\t\t\"angry\",\n\t\t\t\"face_with_symbols_on_mouth\",\n\t\t\t\"mask\",\n\t\t\t\"face_with_thermometer\",\n\t\t\t\"face_with_head_bandage\",\n\t\t\t\"nauseated_face\",\n\t\t\t\"face_vomiting\",\n\t\t\t\"sneezing_face\",\n\t\t\t\"innocent\",\n\t\t\t\"face_with_cowboy_hat\",\n\t\t\t\"clown_face\",\n\t\t\t\"lying_face\",\n\t\t\t\"shushing_face\",\n\t\t\t\"face_with_hand_over_mouth\",\n\t\t\t\"face_with_monocle\",\n\t\t\t\"nerd_face\",\n\t\t\t\"smiling_imp\",\n\t\t\t\"imp\",\n\t\t\t\"japanese_ogre\",\n\t\t\t\"japanese_goblin\",\n\t\t\t\"skull\",\n\t\t\t\"skull_and_crossbones\",\n\t\t\t\"ghost\",\n\t\t\t\"alien\",\n\t\t\t\"space_invader\",\n\t\t\t\"robot_face\",\n\t\t\t\"hankey\",\n\t\t\t\"smiley_cat\",\n\t\t\t\"smile_cat\",\n\t\t\t\"joy_cat\",\n\t\t\t\"heart_eyes_cat\",\n\t\t\t\"smirk_cat\",\n\t\t\t\"kissing_cat\",\n\t\t\t\"scream_cat\",\n\t\t\t\"crying_cat_face\",\n\t\t\t\"pouting_cat\",\n\t\t\t\"see_no_evil\",\n\t\t\t\"hear_no_evil\",\n\t\t\t\"speak_no_evil\",\n\t\t\t\"baby\",\n\t\t\t\"child\",\n\t\t\t\"boy\",\n\t\t\t\"girl\",\n\t\t\t\"adult\",\n\t\t\t\"man\",\n\t\t\t\"woman\",\n\t\t\t\"older_adult\",\n\t\t\t\"older_man\",\n\t\t\t\"older_woman\",\n\t\t\t\"male-doctor\",\n\t\t\t\"female-doctor\",\n\t\t\t\"male-student\",\n\t\t\t\"female-student\",\n\t\t\t\"male-teacher\",\n\t\t\t\"female-teacher\",\n\t\t\t\"male-judge\",\n\t\t\t\"female-judge\",\n\t\t\t\"male-farmer\",\n\t\t\t\"female-farmer\",\n\t\t\t\"male-cook\",\n\t\t\t\"female-cook\",\n\t\t\t\"male-mechanic\",\n\t\t\t\"female-mechanic\",\n\t\t\t\"male-factory-worker\",\n\t\t\t\"female-factory-worker\",\n\t\t\t\"male-office-worker\",\n\t\t\t\"female-office-worker\",\n\t\t\t\"male-scientist\",\n\t\t\t\"female-scientist\",\n\t\t\t\"male-technologist\",\n\t\t\t\"female-technologist\",\n\t\t\t\"male-singer\",\n\t\t\t\"female-singer\",\n\t\t\t\"male-artist\",\n\t\t\t\"female-artist\",\n\t\t\t\"male-pilot\",\n\t\t\t\"female-pilot\",\n\t\t\t\"male-astronaut\",\n\t\t\t\"female-astronaut\",\n\t\t\t\"male-firefighter\",\n\t\t\t\"female-firefighter\",\n\t\t\t\"cop\",\n\t\t\t\"male-police-officer\",\n\t\t\t\"female-police-officer\",\n\t\t\t\"sleuth_or_spy\",\n\t\t\t\"male-detective\",\n\t\t\t\"female-detective\",\n\t\t\t\"guardsman\",\n\t\t\t\"male-guard\",\n\t\t\t\"female-guard\",\n\t\t\t\"construction_worker\",\n\t\t\t\"male-construction-worker\",\n\t\t\t\"female-construction-worker\",\n\t\t\t\"prince\",\n\t\t\t\"princess\",\n\t\t\t\"man_with_turban\",\n\t\t\t\"man-wearing-turban\",\n\t\t\t\"woman-wearing-turban\",\n\t\t\t\"man_with_gua_pi_mao\",\n\t\t\t\"person_with_headscarf\",\n\t\t\t\"bearded_person\",\n\t\t\t\"person_with_blond_hair\",\n\t\t\t\"blond-haired-man\",\n\t\t\t\"blond-haired-woman\",\n\t\t\t\"man_in_tuxedo\",\n\t\t\t\"bride_with_veil\",\n\t\t\t\"pregnant_woman\",\n\t\t\t\"breast-feeding\",\n\t\t\t\"angel\",\n\t\t\t\"santa\",\n\t\t\t\"mrs_claus\",\n\t\t\t\"mage\",\n\t\t\t\"female_mage\",\n\t\t\t\"male_mage\",\n\t\t\t\"fairy\",\n\t\t\t\"female_fairy\",\n\t\t\t\"male_fairy\",\n\t\t\t\"vampire\",\n\t\t\t\"female_vampire\",\n\t\t\t\"male_vampire\",\n\t\t\t\"merperson\",\n\t\t\t\"mermaid\",\n\t\t\t\"merman\",\n\t\t\t\"elf\",\n\t\t\t\"female_elf\",\n\t\t\t\"male_elf\",\n\t\t\t\"genie\",\n\t\t\t\"female_genie\",\n\t\t\t\"male_genie\",\n\t\t\t\"zombie\",\n\t\t\t\"female_zombie\",\n\t\t\t\"male_zombie\",\n\t\t\t\"person_frowning\",\n\t\t\t\"man-frowning\",\n\t\t\t\"woman-frowning\",\n\t\t\t\"person_with_pouting_face\",\n\t\t\t\"man-pouting\",\n\t\t\t\"woman-pouting\",\n\t\t\t\"no_good\",\n\t\t\t\"man-gesturing-no\",\n\t\t\t\"woman-gesturing-no\",\n\t\t\t\"ok_woman\",\n\t\t\t\"man-gesturing-ok\",\n\t\t\t\"woman-gesturing-ok\",\n\t\t\t\"information_desk_person\",\n\t\t\t\"man-tipping-hand\",\n\t\t\t\"woman-tipping-hand\",\n\t\t\t\"raising_hand\",\n\t\t\t\"man-raising-hand\",\n\t\t\t\"woman-raising-hand\",\n\t\t\t\"bow\",\n\t\t\t\"man-bowing\",\n\t\t\t\"woman-bowing\",\n\t\t\t\"face_palm\",\n\t\t\t\"man-facepalming\",\n\t\t\t\"woman-facepalming\",\n\t\t\t\"shrug\",\n\t\t\t\"man-shrugging\",\n\t\t\t\"woman-shrugging\",\n\t\t\t\"massage\",\n\t\t\t\"man-getting-massage\",\n\t\t\t\"woman-getting-massage\",\n\t\t\t\"haircut\",\n\t\t\t\"man-getting-haircut\",\n\t\t\t\"woman-getting-haircut\",\n\t\t\t\"walking\",\n\t\t\t\"man-walking\",\n\t\t\t\"woman-walking\",\n\t\t\t\"runner\",\n\t\t\t\"man-running\",\n\t\t\t\"woman-running\",\n\t\t\t\"dancer\",\n\t\t\t\"man_dancing\",\n\t\t\t\"dancers\",\n\t\t\t\"man-with-bunny-ears-partying\",\n\t\t\t\"woman-with-bunny-ears-partying\",\n\t\t\t\"person_in_steamy_room\",\n\t\t\t\"woman_in_steamy_room\",\n\t\t\t\"man_in_steamy_room\",\n\t\t\t\"person_climbing\",\n\t\t\t\"woman_climbing\",\n\t\t\t\"man_climbing\",\n\t\t\t\"person_in_lotus_position\",\n\t\t\t\"woman_in_lotus_position\",\n\t\t\t\"man_in_lotus_position\",\n\t\t\t\"bath\",\n\t\t\t\"sleeping_accommodation\",\n\t\t\t\"man_in_business_suit_levitating\",\n\t\t\t\"speaking_head_in_silhouette\",\n\t\t\t\"bust_in_silhouette\",\n\t\t\t\"busts_in_silhouette\",\n\t\t\t\"fencer\",\n\t\t\t\"horse_racing\",\n\t\t\t\"skier\",\n\t\t\t\"snowboarder\",\n\t\t\t\"golfer\",\n\t\t\t\"man-golfing\",\n\t\t\t\"woman-golfing\",\n\t\t\t\"surfer\",\n\t\t\t\"man-surfing\",\n\t\t\t\"woman-surfing\",\n\t\t\t\"rowboat\",\n\t\t\t\"man-rowing-boat\",\n\t\t\t\"woman-rowing-boat\",\n\t\t\t\"swimmer\",\n\t\t\t\"man-swimming\",\n\t\t\t\"woman-swimming\",\n\t\t\t\"person_with_ball\",\n\t\t\t\"man-bouncing-ball\",\n\t\t\t\"woman-bouncing-ball\",\n\t\t\t\"weight_lifter\",\n\t\t\t\"man-lifting-weights\",\n\t\t\t\"woman-lifting-weights\",\n\t\t\t\"bicyclist\",\n\t\t\t\"man-biking\",\n\t\t\t\"woman-biking\",\n\t\t\t\"mountain_bicyclist\",\n\t\t\t\"man-mountain-biking\",\n\t\t\t\"woman-mountain-biking\",\n\t\t\t\"racing_car\",\n\t\t\t\"racing_motorcycle\",\n\t\t\t\"person_doing_cartwheel\",\n\t\t\t\"man-cartwheeling\",\n\t\t\t\"woman-cartwheeling\",\n\t\t\t\"wrestlers\",\n\t\t\t\"man-wrestling\",\n\t\t\t\"woman-wrestling\",\n\t\t\t\"water_polo\",\n\t\t\t\"man-playing-water-polo\",\n\t\t\t\"woman-playing-water-polo\",\n\t\t\t\"handball\",\n\t\t\t\"man-playing-handball\",\n\t\t\t\"woman-playing-handball\",\n\t\t\t\"juggling\",\n\t\t\t\"man-juggling\",\n\t\t\t\"woman-juggling\",\n\t\t\t\"couple\",\n\t\t\t\"two_men_holding_hands\",\n\t\t\t\"two_women_holding_hands\",\n\t\t\t\"couplekiss\",\n\t\t\t\"woman-kiss-man\",\n\t\t\t\"man-kiss-man\",\n\t\t\t\"woman-kiss-woman\",\n\t\t\t\"couple_with_heart\",\n\t\t\t\"woman-heart-man\",\n\t\t\t\"man-heart-man\",\n\t\t\t\"woman-heart-woman\",\n\t\t\t\"family\",\n\t\t\t\"man-woman-boy\",\n\t\t\t\"man-woman-girl\",\n\t\t\t\"man-woman-girl-boy\",\n\t\t\t\"man-woman-boy-boy\",\n\t\t\t\"man-woman-girl-girl\",\n\t\t\t\"man-man-boy\",\n\t\t\t\"man-man-girl\",\n\t\t\t\"man-man-girl-boy\",\n\t\t\t\"man-man-boy-boy\",\n\t\t\t\"man-man-girl-girl\",\n\t\t\t\"woman-woman-boy\",\n\t\t\t\"woman-woman-girl\",\n\t\t\t\"woman-woman-girl-boy\",\n\t\t\t\"woman-woman-boy-boy\",\n\t\t\t\"woman-woman-girl-girl\",\n\t\t\t\"man-boy\",\n\t\t\t\"man-boy-boy\",\n\t\t\t\"man-girl\",\n\t\t\t\"man-girl-boy\",\n\t\t\t\"man-girl-girl\",\n\t\t\t\"woman-boy\",\n\t\t\t\"woman-boy-boy\",\n\t\t\t\"woman-girl\",\n\t\t\t\"woman-girl-boy\",\n\t\t\t\"woman-girl-girl\",\n\t\t\t\"selfie\",\n\t\t\t\"muscle\",\n\t\t\t\"point_left\",\n\t\t\t\"point_right\",\n\t\t\t\"point_up\",\n\t\t\t\"point_up_2\",\n\t\t\t\"middle_finger\",\n\t\t\t\"point_down\",\n\t\t\t\"v\",\n\t\t\t\"crossed_fingers\",\n\t\t\t\"spock-hand\",\n\t\t\t\"the_horns\",\n\t\t\t\"call_me_hand\",\n\t\t\t\"raised_hand_with_fingers_splayed\",\n\t\t\t\"hand\",\n\t\t\t\"ok_hand\",\n\t\t\t\"+1\",\n\t\t\t\"-1\",\n\t\t\t\"fist\",\n\t\t\t\"facepunch\",\n\t\t\t\"left-facing_fist\",\n\t\t\t\"right-facing_fist\",\n\t\t\t\"raised_back_of_hand\",\n\t\t\t\"wave\",\n\t\t\t\"i_love_you_hand_sign\",\n\t\t\t\"writing_hand\",\n\t\t\t\"clap\",\n\t\t\t\"open_hands\",\n\t\t\t\"raised_hands\",\n\t\t\t\"palms_up_together\",\n\t\t\t\"pray\",\n\t\t\t\"handshake\",\n\t\t\t\"nail_care\",\n\t\t\t\"ear\",\n\t\t\t\"nose\",\n\t\t\t\"footprints\",\n\t\t\t\"eyes\",\n\t\t\t\"eye\",\n\t\t\t\"eye-in-speech-bubble\",\n\t\t\t\"brain\",\n\t\t\t\"tongue\",\n\t\t\t\"lips\",\n\t\t\t\"kiss\",\n\t\t\t\"cupid\",\n\t\t\t\"heart\",\n\t\t\t\"heartbeat\",\n\t\t\t\"broken_heart\",\n\t\t\t\"two_hearts\",\n\t\t\t\"sparkling_heart\",\n\t\t\t\"heartpulse\",\n\t\t\t\"blue_heart\",\n\t\t\t\"green_heart\",\n\t\t\t\"yellow_heart\",\n\t\t\t\"orange_heart\",\n\t\t\t\"purple_heart\",\n\t\t\t\"black_heart\",\n\t\t\t\"gift_heart\",\n\t\t\t\"revolving_hearts\",\n\t\t\t\"heart_decoration\",\n\t\t\t\"heavy_heart_exclamation_mark_ornament\",\n\t\t\t\"love_letter\",\n\t\t\t\"zzz\",\n\t\t\t\"anger\",\n\t\t\t\"bomb\",\n\t\t\t\"boom\",\n\t\t\t\"sweat_drops\",\n\t\t\t\"dash\",\n\t\t\t\"dizzy\",\n\t\t\t\"speech_balloon\",\n\t\t\t\"left_speech_bubble\",\n\t\t\t\"right_anger_bubble\",\n\t\t\t\"thought_balloon\",\n\t\t\t\"hole\",\n\t\t\t\"eyeglasses\",\n\t\t\t\"dark_sunglasses\",\n\t\t\t\"necktie\",\n\t\t\t\"shirt\",\n\t\t\t\"jeans\",\n\t\t\t\"scarf\",\n\t\t\t\"gloves\",\n\t\t\t\"coat\",\n\t\t\t\"socks\",\n\t\t\t\"dress\",\n\t\t\t\"kimono\",\n\t\t\t\"bikini\",\n\t\t\t\"womans_clothes\",\n\t\t\t\"purse\",\n\t\t\t\"handbag\",\n\t\t\t\"pouch\",\n\t\t\t\"shopping_bags\",\n\t\t\t\"school_satchel\",\n\t\t\t\"mans_shoe\",\n\t\t\t\"athletic_shoe\",\n\t\t\t\"high_heel\",\n\t\t\t\"sandal\",\n\t\t\t\"boot\",\n\t\t\t\"crown\",\n\t\t\t\"womans_hat\",\n\t\t\t\"tophat\",\n\t\t\t\"mortar_board\",\n\t\t\t\"billed_cap\",\n\t\t\t\"helmet_with_white_cross\",\n\t\t\t\"prayer_beads\",\n\t\t\t\"lipstick\",\n\t\t\t\"ring\",\n\t\t\t\"gem\"\n\t\t]\n\t},\n\t{\n\t\tid: \"nature\",\n\t\tname: \"Animals & Nature\",\n\t\temojis: [\n\t\t\t\"monkey_face\",\n\t\t\t\"monkey\",\n\t\t\t\"gorilla\",\n\t\t\t\"dog\",\n\t\t\t\"dog2\",\n\t\t\t\"poodle\",\n\t\t\t\"wolf\",\n\t\t\t\"fox_face\",\n\t\t\t\"cat\",\n\t\t\t\"cat2\",\n\t\t\t\"lion_face\",\n\t\t\t\"tiger\",\n\t\t\t\"tiger2\",\n\t\t\t\"leopard\",\n\t\t\t\"horse\",\n\t\t\t\"racehorse\",\n\t\t\t\"unicorn_face\",\n\t\t\t\"zebra_face\",\n\t\t\t\"deer\",\n\t\t\t\"cow\",\n\t\t\t\"ox\",\n\t\t\t\"water_buffalo\",\n\t\t\t\"cow2\",\n\t\t\t\"pig\",\n\t\t\t\"pig2\",\n\t\t\t\"boar\",\n\t\t\t\"pig_nose\",\n\t\t\t\"ram\",\n\t\t\t\"sheep\",\n\t\t\t\"goat\",\n\t\t\t\"dromedary_camel\",\n\t\t\t\"camel\",\n\t\t\t\"giraffe_face\",\n\t\t\t\"elephant\",\n\t\t\t\"rhinoceros\",\n\t\t\t\"mouse\",\n\t\t\t\"mouse2\",\n\t\t\t\"rat\",\n\t\t\t\"hamster\",\n\t\t\t\"rabbit\",\n\t\t\t\"rabbit2\",\n\t\t\t\"chipmunk\",\n\t\t\t\"hedgehog\",\n\t\t\t\"bat\",\n\t\t\t\"bear\",\n\t\t\t\"koala\",\n\t\t\t\"panda_face\",\n\t\t\t\"feet\",\n\t\t\t\"turkey\",\n\t\t\t\"chicken\",\n\t\t\t\"rooster\",\n\t\t\t\"hatching_chick\",\n\t\t\t\"baby_chick\",\n\t\t\t\"hatched_chick\",\n\t\t\t\"bird\",\n\t\t\t\"penguin\",\n\t\t\t\"dove_of_peace\",\n\t\t\t\"eagle\",\n\t\t\t\"duck\",\n\t\t\t\"owl\",\n\t\t\t\"frog\",\n\t\t\t\"crocodile\",\n\t\t\t\"turtle\",\n\t\t\t\"lizard\",\n\t\t\t\"snake\",\n\t\t\t\"dragon_face\",\n\t\t\t\"dragon\",\n\t\t\t\"sauropod\",\n\t\t\t\"t-rex\",\n\t\t\t\"whale\",\n\t\t\t\"whale2\",\n\t\t\t\"dolphin\",\n\t\t\t\"fish\",\n\t\t\t\"tropical_fish\",\n\t\t\t\"blowfish\",\n\t\t\t\"shark\",\n\t\t\t\"octopus\",\n\t\t\t\"shell\",\n\t\t\t\"crab\",\n\t\t\t\"shrimp\",\n\t\t\t\"squid\",\n\t\t\t\"snail\",\n\t\t\t\"butterfly\",\n\t\t\t\"bug\",\n\t\t\t\"ant\",\n\t\t\t\"bee\",\n\t\t\t\"beetle\",\n\t\t\t\"cricket\",\n\t\t\t\"spider\",\n\t\t\t\"spider_web\",\n\t\t\t\"scorpion\",\n\t\t\t\"bouquet\",\n\t\t\t\"cherry_blossom\",\n\t\t\t\"white_flower\",\n\t\t\t\"rosette\",\n\t\t\t\"rose\",\n\t\t\t\"wilted_flower\",\n\t\t\t\"hibiscus\",\n\t\t\t\"sunflower\",\n\t\t\t\"blossom\",\n\t\t\t\"tulip\",\n\t\t\t\"seedling\",\n\t\t\t\"evergreen_tree\",\n\t\t\t\"deciduous_tree\",\n\t\t\t\"palm_tree\",\n\t\t\t\"cactus\",\n\t\t\t\"ear_of_rice\",\n\t\t\t\"herb\",\n\t\t\t\"shamrock\",\n\t\t\t\"four_leaf_clover\",\n\t\t\t\"maple_leaf\",\n\t\t\t\"fallen_leaf\",\n\t\t\t\"leaves\"\n\t\t]\n\t},\n\t{\n\t\tid: \"foods\",\n\t\tname: \"Food & Drink\",\n\t\temojis: [\n\t\t\t\"grapes\",\n\t\t\t\"melon\",\n\t\t\t\"watermelon\",\n\t\t\t\"tangerine\",\n\t\t\t\"lemon\",\n\t\t\t\"banana\",\n\t\t\t\"pineapple\",\n\t\t\t\"apple\",\n\t\t\t\"green_apple\",\n\t\t\t\"pear\",\n\t\t\t\"peach\",\n\t\t\t\"cherries\",\n\t\t\t\"strawberry\",\n\t\t\t\"kiwifruit\",\n\t\t\t\"tomato\",\n\t\t\t\"coconut\",\n\t\t\t\"avocado\",\n\t\t\t\"eggplant\",\n\t\t\t\"potato\",\n\t\t\t\"carrot\",\n\t\t\t\"corn\",\n\t\t\t\"hot_pepper\",\n\t\t\t\"cucumber\",\n\t\t\t\"broccoli\",\n\t\t\t\"mushroom\",\n\t\t\t\"peanuts\",\n\t\t\t\"chestnut\",\n\t\t\t\"bread\",\n\t\t\t\"croissant\",\n\t\t\t\"baguette_bread\",\n\t\t\t\"pretzel\",\n\t\t\t\"pancakes\",\n\t\t\t\"cheese_wedge\",\n\t\t\t\"meat_on_bone\",\n\t\t\t\"poultry_leg\",\n\t\t\t\"cut_of_meat\",\n\t\t\t\"bacon\",\n\t\t\t\"hamburger\",\n\t\t\t\"fries\",\n\t\t\t\"pizza\",\n\t\t\t\"hotdog\",\n\t\t\t\"sandwich\",\n\t\t\t\"taco\",\n\t\t\t\"burrito\",\n\t\t\t\"stuffed_flatbread\",\n\t\t\t\"egg\",\n\t\t\t\"fried_egg\",\n\t\t\t\"shallow_pan_of_food\",\n\t\t\t\"stew\",\n\t\t\t\"bowl_with_spoon\",\n\t\t\t\"green_salad\",\n\t\t\t\"popcorn\",\n\t\t\t\"canned_food\",\n\t\t\t\"bento\",\n\t\t\t\"rice_cracker\",\n\t\t\t\"rice_ball\",\n\t\t\t\"rice\",\n\t\t\t\"curry\",\n\t\t\t\"ramen\",\n\t\t\t\"spaghetti\",\n\t\t\t\"sweet_potato\",\n\t\t\t\"oden\",\n\t\t\t\"sushi\",\n\t\t\t\"fried_shrimp\",\n\t\t\t\"fish_cake\",\n\t\t\t\"dango\",\n\t\t\t\"dumpling\",\n\t\t\t\"fortune_cookie\",\n\t\t\t\"takeout_box\",\n\t\t\t\"icecream\",\n\t\t\t\"shaved_ice\",\n\t\t\t\"ice_cream\",\n\t\t\t\"doughnut\",\n\t\t\t\"cookie\",\n\t\t\t\"birthday\",\n\t\t\t\"cake\",\n\t\t\t\"pie\",\n\t\t\t\"chocolate_bar\",\n\t\t\t\"candy\",\n\t\t\t\"lollipop\",\n\t\t\t\"custard\",\n\t\t\t\"honey_pot\",\n\t\t\t\"baby_bottle\",\n\t\t\t\"glass_of_milk\",\n\t\t\t\"coffee\",\n\t\t\t\"tea\",\n\t\t\t\"sake\",\n\t\t\t\"champagne\",\n\t\t\t\"wine_glass\",\n\t\t\t\"cocktail\",\n\t\t\t\"tropical_drink\",\n\t\t\t\"beer\",\n\t\t\t\"beers\",\n\t\t\t\"clinking_glasses\",\n\t\t\t\"tumbler_glass\",\n\t\t\t\"cup_with_straw\",\n\t\t\t\"chopsticks\",\n\t\t\t\"knife_fork_plate\",\n\t\t\t\"fork_and_knife\",\n\t\t\t\"spoon\",\n\t\t\t\"hocho\",\n\t\t\t\"amphora\"\n\t\t]\n\t},\n\t{\n\t\tid: \"activity\",\n\t\tname: \"Activities\",\n\t\temojis: [\n\t\t\t\"jack_o_lantern\",\n\t\t\t\"christmas_tree\",\n\t\t\t\"fireworks\",\n\t\t\t\"sparkler\",\n\t\t\t\"sparkles\",\n\t\t\t\"balloon\",\n\t\t\t\"tada\",\n\t\t\t\"confetti_ball\",\n\t\t\t\"tanabata_tree\",\n\t\t\t\"bamboo\",\n\t\t\t\"dolls\",\n\t\t\t\"flags\",\n\t\t\t\"wind_chime\",\n\t\t\t\"rice_scene\",\n\t\t\t\"ribbon\",\n\t\t\t\"gift\",\n\t\t\t\"reminder_ribbon\",\n\t\t\t\"admission_tickets\",\n\t\t\t\"ticket\",\n\t\t\t\"medal\",\n\t\t\t\"trophy\",\n\t\t\t\"sports_medal\",\n\t\t\t\"first_place_medal\",\n\t\t\t\"second_place_medal\",\n\t\t\t\"third_place_medal\",\n\t\t\t\"soccer\",\n\t\t\t\"baseball\",\n\t\t\t\"basketball\",\n\t\t\t\"volleyball\",\n\t\t\t\"football\",\n\t\t\t\"rugby_football\",\n\t\t\t\"tennis\",\n\t\t\t\"8ball\",\n\t\t\t\"bowling\",\n\t\t\t\"cricket_bat_and_ball\",\n\t\t\t\"field_hockey_stick_and_ball\",\n\t\t\t\"ice_hockey_stick_and_puck\",\n\t\t\t\"table_tennis_paddle_and_ball\",\n\t\t\t\"badminton_racquet_and_shuttlecock\",\n\t\t\t\"boxing_glove\",\n\t\t\t\"martial_arts_uniform\",\n\t\t\t\"goal_net\",\n\t\t\t\"dart\",\n\t\t\t\"golf\",\n\t\t\t\"ice_skate\",\n\t\t\t\"fishing_pole_and_fish\",\n\t\t\t\"running_shirt_with_sash\",\n\t\t\t\"ski\",\n\t\t\t\"sled\",\n\t\t\t\"curling_stone\",\n\t\t\t\"video_game\",\n\t\t\t\"joystick\",\n\t\t\t\"game_die\",\n\t\t\t\"spades\",\n\t\t\t\"hearts\",\n\t\t\t\"diamonds\",\n\t\t\t\"clubs\",\n\t\t\t\"black_joker\",\n\t\t\t\"mahjong\",\n\t\t\t\"flower_playing_cards\"\n\t\t]\n\t},\n\t{\n\t\tid: \"places\",\n\t\tname: \"Travel & Places\",\n\t\temojis: [\n\t\t\t\"earth_africa\",\n\t\t\t\"earth_americas\",\n\t\t\t\"earth_asia\",\n\t\t\t\"globe_with_meridians\",\n\t\t\t\"world_map\",\n\t\t\t\"japan\",\n\t\t\t\"snow_capped_mountain\",\n\t\t\t\"mountain\",\n\t\t\t\"volcano\",\n\t\t\t\"mount_fuji\",\n\t\t\t\"camping\",\n\t\t\t\"beach_with_umbrella\",\n\t\t\t\"desert\",\n\t\t\t\"desert_island\",\n\t\t\t\"national_park\",\n\t\t\t\"stadium\",\n\t\t\t\"classical_building\",\n\t\t\t\"building_construction\",\n\t\t\t\"house_buildings\",\n\t\t\t\"cityscape\",\n\t\t\t\"derelict_house_building\",\n\t\t\t\"house\",\n\t\t\t\"house_with_garden\",\n\t\t\t\"office\",\n\t\t\t\"post_office\",\n\t\t\t\"european_post_office\",\n\t\t\t\"hospital\",\n\t\t\t\"bank\",\n\t\t\t\"hotel\",\n\t\t\t\"love_hotel\",\n\t\t\t\"convenience_store\",\n\t\t\t\"school\",\n\t\t\t\"department_store\",\n\t\t\t\"factory\",\n\t\t\t\"japanese_castle\",\n\t\t\t\"european_castle\",\n\t\t\t\"wedding\",\n\t\t\t\"tokyo_tower\",\n\t\t\t\"statue_of_liberty\",\n\t\t\t\"church\",\n\t\t\t\"mosque\",\n\t\t\t\"synagogue\",\n\t\t\t\"shinto_shrine\",\n\t\t\t\"kaaba\",\n\t\t\t\"fountain\",\n\t\t\t\"tent\",\n\t\t\t\"foggy\",\n\t\t\t\"night_with_stars\",\n\t\t\t\"sunrise_over_mountains\",\n\t\t\t\"sunrise\",\n\t\t\t\"city_sunset\",\n\t\t\t\"city_sunrise\",\n\t\t\t\"bridge_at_night\",\n\t\t\t\"hotsprings\",\n\t\t\t\"milky_way\",\n\t\t\t\"carousel_horse\",\n\t\t\t\"ferris_wheel\",\n\t\t\t\"roller_coaster\",\n\t\t\t\"barber\",\n\t\t\t\"circus_tent\",\n\t\t\t\"performing_arts\",\n\t\t\t\"frame_with_picture\",\n\t\t\t\"art\",\n\t\t\t\"slot_machine\",\n\t\t\t\"steam_locomotive\",\n\t\t\t\"railway_car\",\n\t\t\t\"bullettrain_side\",\n\t\t\t\"bullettrain_front\",\n\t\t\t\"train2\",\n\t\t\t\"metro\",\n\t\t\t\"light_rail\",\n\t\t\t\"station\",\n\t\t\t\"tram\",\n\t\t\t\"monorail\",\n\t\t\t\"mountain_railway\",\n\t\t\t\"train\",\n\t\t\t\"bus\",\n\t\t\t\"oncoming_bus\",\n\t\t\t\"trolleybus\",\n\t\t\t\"minibus\",\n\t\t\t\"ambulance\",\n\t\t\t\"fire_engine\",\n\t\t\t\"police_car\",\n\t\t\t\"oncoming_police_car\",\n\t\t\t\"taxi\",\n\t\t\t\"oncoming_taxi\",\n\t\t\t\"car\",\n\t\t\t\"oncoming_automobile\",\n\t\t\t\"blue_car\",\n\t\t\t\"truck\",\n\t\t\t\"articulated_lorry\",\n\t\t\t\"tractor\",\n\t\t\t\"bike\",\n\t\t\t\"scooter\",\n\t\t\t\"motor_scooter\",\n\t\t\t\"busstop\",\n\t\t\t\"motorway\",\n\t\t\t\"railway_track\",\n\t\t\t\"fuelpump\",\n\t\t\t\"rotating_light\",\n\t\t\t\"traffic_light\",\n\t\t\t\"vertical_traffic_light\",\n\t\t\t\"construction\",\n\t\t\t\"octagonal_sign\",\n\t\t\t\"anchor\",\n\t\t\t\"boat\",\n\t\t\t\"canoe\",\n\t\t\t\"speedboat\",\n\t\t\t\"passenger_ship\",\n\t\t\t\"ferry\",\n\t\t\t\"motor_boat\",\n\t\t\t\"ship\",\n\t\t\t\"airplane\",\n\t\t\t\"small_airplane\",\n\t\t\t\"airplane_departure\",\n\t\t\t\"airplane_arriving\",\n\t\t\t\"seat\",\n\t\t\t\"helicopter\",\n\t\t\t\"suspension_railway\",\n\t\t\t\"mountain_cableway\",\n\t\t\t\"aerial_tramway\",\n\t\t\t\"satellite\",\n\t\t\t\"rocket\",\n\t\t\t\"flying_saucer\",\n\t\t\t\"bellhop_bell\",\n\t\t\t\"door\",\n\t\t\t\"bed\",\n\t\t\t\"couch_and_lamp\",\n\t\t\t\"toilet\",\n\t\t\t\"shower\",\n\t\t\t\"bathtub\",\n\t\t\t\"hourglass\",\n\t\t\t\"hourglass_flowing_sand\",\n\t\t\t\"watch\",\n\t\t\t\"alarm_clock\",\n\t\t\t\"stopwatch\",\n\t\t\t\"timer_clock\",\n\t\t\t\"mantelpiece_clock\",\n\t\t\t\"clock12\",\n\t\t\t\"clock1230\",\n\t\t\t\"clock1\",\n\t\t\t\"clock130\",\n\t\t\t\"clock2\",\n\t\t\t\"clock230\",\n\t\t\t\"clock3\",\n\t\t\t\"clock330\",\n\t\t\t\"clock4\",\n\t\t\t\"clock430\",\n\t\t\t\"clock5\",\n\t\t\t\"clock530\",\n\t\t\t\"clock6\",\n\t\t\t\"clock630\",\n\t\t\t\"clock7\",\n\t\t\t\"clock730\",\n\t\t\t\"clock8\",\n\t\t\t\"clock830\",\n\t\t\t\"clock9\",\n\t\t\t\"clock930\",\n\t\t\t\"clock10\",\n\t\t\t\"clock1030\",\n\t\t\t\"clock11\",\n\t\t\t\"clock1130\",\n\t\t\t\"new_moon\",\n\t\t\t\"waxing_crescent_moon\",\n\t\t\t\"first_quarter_moon\",\n\t\t\t\"moon\",\n\t\t\t\"full_moon\",\n\t\t\t\"waning_gibbous_moon\",\n\t\t\t\"last_quarter_moon\",\n\t\t\t\"waning_crescent_moon\",\n\t\t\t\"crescent_moon\",\n\t\t\t\"new_moon_with_face\",\n\t\t\t\"first_quarter_moon_with_face\",\n\t\t\t\"last_quarter_moon_with_face\",\n\t\t\t\"thermometer\",\n\t\t\t\"sunny\",\n\t\t\t\"full_moon_with_face\",\n\t\t\t\"sun_with_face\",\n\t\t\t\"star\",\n\t\t\t\"star2\",\n\t\t\t\"stars\",\n\t\t\t\"cloud\",\n\t\t\t\"partly_sunny\",\n\t\t\t\"thunder_cloud_and_rain\",\n\t\t\t\"mostly_sunny\",\n\t\t\t\"barely_sunny\",\n\t\t\t\"partly_sunny_rain\",\n\t\t\t\"rain_cloud\",\n\t\t\t\"snow_cloud\",\n\t\t\t\"lightning\",\n\t\t\t\"tornado\",\n\t\t\t\"fog\",\n\t\t\t\"wind_blowing_face\",\n\t\t\t\"cyclone\",\n\t\t\t\"rainbow\",\n\t\t\t\"closed_umbrella\",\n\t\t\t\"umbrella\",\n\t\t\t\"umbrella_with_rain_drops\",\n\t\t\t\"umbrella_on_ground\",\n\t\t\t\"zap\",\n\t\t\t\"snowflake\",\n\t\t\t\"snowman\",\n\t\t\t\"snowman_without_snow\",\n\t\t\t\"comet\",\n\t\t\t\"fire\",\n\t\t\t\"droplet\",\n\t\t\t\"ocean\"\n\t\t]\n\t},\n\t{\n\t\tid: \"objects\",\n\t\tname: \"Objects\",\n\t\temojis: [\n\t\t\t\"mute\",\n\t\t\t\"speaker\",\n\t\t\t\"sound\",\n\t\t\t\"loud_sound\",\n\t\t\t\"loudspeaker\",\n\t\t\t\"mega\",\n\t\t\t\"postal_horn\",\n\t\t\t\"bell\",\n\t\t\t\"no_bell\",\n\t\t\t\"musical_score\",\n\t\t\t\"musical_note\",\n\t\t\t\"notes\",\n\t\t\t\"studio_microphone\",\n\t\t\t\"level_slider\",\n\t\t\t\"control_knobs\",\n\t\t\t\"microphone\",\n\t\t\t\"headphones\",\n\t\t\t\"radio\",\n\t\t\t\"saxophone\",\n\t\t\t\"guitar\",\n\t\t\t\"musical_keyboard\",\n\t\t\t\"trumpet\",\n\t\t\t\"violin\",\n\t\t\t\"drum_with_drumsticks\",\n\t\t\t\"iphone\",\n\t\t\t\"calling\",\n\t\t\t\"phone\",\n\t\t\t\"telephone_receiver\",\n\t\t\t\"pager\",\n\t\t\t\"fax\",\n\t\t\t\"battery\",\n\t\t\t\"electric_plug\",\n\t\t\t\"computer\",\n\t\t\t\"desktop_computer\",\n\t\t\t\"printer\",\n\t\t\t\"keyboard\",\n\t\t\t\"three_button_mouse\",\n\t\t\t\"trackball\",\n\t\t\t\"minidisc\",\n\t\t\t\"floppy_disk\",\n\t\t\t\"cd\",\n\t\t\t\"dvd\",\n\t\t\t\"movie_camera\",\n\t\t\t\"film_frames\",\n\t\t\t\"film_projector\",\n\t\t\t\"clapper\",\n\t\t\t\"tv\",\n\t\t\t\"camera\",\n\t\t\t\"camera_with_flash\",\n\t\t\t\"video_camera\",\n\t\t\t\"vhs\",\n\t\t\t\"mag\",\n\t\t\t\"mag_right\",\n\t\t\t\"microscope\",\n\t\t\t\"telescope\",\n\t\t\t\"satellite_antenna\",\n\t\t\t\"candle\",\n\t\t\t\"bulb\",\n\t\t\t\"flashlight\",\n\t\t\t\"izakaya_lantern\",\n\t\t\t\"notebook_with_decorative_cover\",\n\t\t\t\"closed_book\",\n\t\t\t\"book\",\n\t\t\t\"green_book\",\n\t\t\t\"blue_book\",\n\t\t\t\"orange_book\",\n\t\t\t\"books\",\n\t\t\t\"notebook\",\n\t\t\t\"ledger\",\n\t\t\t\"page_with_curl\",\n\t\t\t\"scroll\",\n\t\t\t\"page_facing_up\",\n\t\t\t\"newspaper\",\n\t\t\t\"rolled_up_newspaper\",\n\t\t\t\"bookmark_tabs\",\n\t\t\t\"bookmark\",\n\t\t\t\"label\",\n\t\t\t\"moneybag\",\n\t\t\t\"yen\",\n\t\t\t\"dollar\",\n\t\t\t\"euro\",\n\t\t\t\"pound\",\n\t\t\t\"money_with_wings\",\n\t\t\t\"credit_card\",\n\t\t\t\"chart\",\n\t\t\t\"currency_exchange\",\n\t\t\t\"heavy_dollar_sign\",\n\t\t\t\"email\",\n\t\t\t\"e-mail\",\n\t\t\t\"incoming_envelope\",\n\t\t\t\"envelope_with_arrow\",\n\t\t\t\"outbox_tray\",\n\t\t\t\"inbox_tray\",\n\t\t\t\"package\",\n\t\t\t\"mailbox\",\n\t\t\t\"mailbox_closed\",\n\t\t\t\"mailbox_with_mail\",\n\t\t\t\"mailbox_with_no_mail\",\n\t\t\t\"postbox\",\n\t\t\t\"ballot_box_with_ballot\",\n\t\t\t\"pencil2\",\n\t\t\t\"black_nib\",\n\t\t\t\"lower_left_fountain_pen\",\n\t\t\t\"lower_left_ballpoint_pen\",\n\t\t\t\"lower_left_paintbrush\",\n\t\t\t\"lower_left_crayon\",\n\t\t\t\"memo\",\n\t\t\t\"briefcase\",\n\t\t\t\"file_folder\",\n\t\t\t\"open_file_folder\",\n\t\t\t\"card_index_dividers\",\n\t\t\t\"date\",\n\t\t\t\"calendar\",\n\t\t\t\"spiral_note_pad\",\n\t\t\t\"spiral_calendar_pad\",\n\t\t\t\"card_index\",\n\t\t\t\"chart_with_upwards_trend\",\n\t\t\t\"chart_with_downwards_trend\",\n\t\t\t\"bar_chart\",\n\t\t\t\"clipboard\",\n\t\t\t\"pushpin\",\n\t\t\t\"round_pushpin\",\n\t\t\t\"paperclip\",\n\t\t\t\"linked_paperclips\",\n\t\t\t\"straight_ruler\",\n\t\t\t\"triangular_ruler\",\n\t\t\t\"scissors\",\n\t\t\t\"card_file_box\",\n\t\t\t\"file_cabinet\",\n\t\t\t\"wastebasket\",\n\t\t\t\"lock\",\n\t\t\t\"unlock\",\n\t\t\t\"lock_with_ink_pen\",\n\t\t\t\"closed_lock_with_key\",\n\t\t\t\"key\",\n\t\t\t\"old_key\",\n\t\t\t\"hammer\",\n\t\t\t\"pick\",\n\t\t\t\"hammer_and_pick\",\n\t\t\t\"hammer_and_wrench\",\n\t\t\t\"dagger_knife\",\n\t\t\t\"crossed_swords\",\n\t\t\t\"gun\",\n\t\t\t\"bow_and_arrow\",\n\t\t\t\"shield\",\n\t\t\t\"wrench\",\n\t\t\t\"nut_and_bolt\",\n\t\t\t\"gear\",\n\t\t\t\"compression\",\n\t\t\t\"alembic\",\n\t\t\t\"scales\",\n\t\t\t\"link\",\n\t\t\t\"chains\",\n\t\t\t\"syringe\",\n\t\t\t\"pill\",\n\t\t\t\"smoking\",\n\t\t\t\"coffin\",\n\t\t\t\"funeral_urn\",\n\t\t\t\"moyai\",\n\t\t\t\"oil_drum\",\n\t\t\t\"crystal_ball\",\n\t\t\t\"shopping_trolley\"\n\t\t]\n\t},\n\t{\n\t\tid: \"symbols\",\n\t\tname: \"Symbols\",\n\t\temojis: [\n\t\t\t\"atm\",\n\t\t\t\"put_litter_in_its_place\",\n\t\t\t\"potable_water\",\n\t\t\t\"wheelchair\",\n\t\t\t\"mens\",\n\t\t\t\"womens\",\n\t\t\t\"restroom\",\n\t\t\t\"baby_symbol\",\n\t\t\t\"wc\",\n\t\t\t\"passport_control\",\n\t\t\t\"customs\",\n\t\t\t\"baggage_claim\",\n\t\t\t\"left_luggage\",\n\t\t\t\"warning\",\n\t\t\t\"children_crossing\",\n\t\t\t\"no_entry\",\n\t\t\t\"no_entry_sign\",\n\t\t\t\"no_bicycles\",\n\t\t\t\"no_smoking\",\n\t\t\t\"do_not_litter\",\n\t\t\t\"non-potable_water\",\n\t\t\t\"no_pedestrians\",\n\t\t\t\"no_mobile_phones\",\n\t\t\t\"underage\",\n\t\t\t\"radioactive_sign\",\n\t\t\t\"biohazard_sign\",\n\t\t\t\"arrow_up\",\n\t\t\t\"arrow_upper_right\",\n\t\t\t\"arrow_right\",\n\t\t\t\"arrow_lower_right\",\n\t\t\t\"arrow_down\",\n\t\t\t\"arrow_lower_left\",\n\t\t\t\"arrow_left\",\n\t\t\t\"arrow_upper_left\",\n\t\t\t\"arrow_up_down\",\n\t\t\t\"left_right_arrow\",\n\t\t\t\"leftwards_arrow_with_hook\",\n\t\t\t\"arrow_right_hook\",\n\t\t\t\"arrow_heading_up\",\n\t\t\t\"arrow_heading_down\",\n\t\t\t\"arrows_clockwise\",\n\t\t\t\"arrows_counterclockwise\",\n\t\t\t\"back\",\n\t\t\t\"end\",\n\t\t\t\"on\",\n\t\t\t\"soon\",\n\t\t\t\"top\",\n\t\t\t\"place_of_worship\",\n\t\t\t\"atom_symbol\",\n\t\t\t\"om_symbol\",\n\t\t\t\"star_of_david\",\n\t\t\t\"wheel_of_dharma\",\n\t\t\t\"yin_yang\",\n\t\t\t\"latin_cross\",\n\t\t\t\"orthodox_cross\",\n\t\t\t\"star_and_crescent\",\n\t\t\t\"peace_symbol\",\n\t\t\t\"menorah_with_nine_branches\",\n\t\t\t\"six_pointed_star\",\n\t\t\t\"aries\",\n\t\t\t\"taurus\",\n\t\t\t\"gemini\",\n\t\t\t\"cancer\",\n\t\t\t\"leo\",\n\t\t\t\"virgo\",\n\t\t\t\"libra\",\n\t\t\t\"scorpius\",\n\t\t\t\"sagittarius\",\n\t\t\t\"capricorn\",\n\t\t\t\"aquarius\",\n\t\t\t\"pisces\",\n\t\t\t\"ophiuchus\",\n\t\t\t\"twisted_rightwards_arrows\",\n\t\t\t\"repeat\",\n\t\t\t\"repeat_one\",\n\t\t\t\"arrow_forward\",\n\t\t\t\"fast_forward\",\n\t\t\t\"black_right_pointing_double_triangle_with_vertical_bar\",\n\t\t\t\"black_right_pointing_triangle_with_double_vertical_bar\",\n\t\t\t\"arrow_backward\",\n\t\t\t\"rewind\",\n\t\t\t\"black_left_pointing_double_triangle_with_vertical_bar\",\n\t\t\t\"arrow_up_small\",\n\t\t\t\"arrow_double_up\",\n\t\t\t\"arrow_down_small\",\n\t\t\t\"arrow_double_down\",\n\t\t\t\"double_vertical_bar\",\n\t\t\t\"black_square_for_stop\",\n\t\t\t\"black_circle_for_record\",\n\t\t\t\"eject\",\n\t\t\t\"cinema\",\n\t\t\t\"low_brightness\",\n\t\t\t\"high_brightness\",\n\t\t\t\"signal_strength\",\n\t\t\t\"vibration_mode\",\n\t\t\t\"mobile_phone_off\",\n\t\t\t\"female_sign\",\n\t\t\t\"male_sign\",\n\t\t\t\"medical_symbol\",\n\t\t\t\"recycle\",\n\t\t\t\"fleur_de_lis\",\n\t\t\t\"trident\",\n\t\t\t\"name_badge\",\n\t\t\t\"beginner\",\n\t\t\t\"o\",\n\t\t\t\"white_check_mark\",\n\t\t\t\"ballot_box_with_check\",\n\t\t\t\"heavy_check_mark\",\n\t\t\t\"heavy_multiplication_x\",\n\t\t\t\"x\",\n\t\t\t\"negative_squared_cross_mark\",\n\t\t\t\"heavy_plus_sign\",\n\t\t\t\"heavy_minus_sign\",\n\t\t\t\"heavy_division_sign\",\n\t\t\t\"curly_loop\",\n\t\t\t\"loop\",\n\t\t\t\"part_alternation_mark\",\n\t\t\t\"eight_spoked_asterisk\",\n\t\t\t\"eight_pointed_black_star\",\n\t\t\t\"sparkle\",\n\t\t\t\"bangbang\",\n\t\t\t\"interrobang\",\n\t\t\t\"question\",\n\t\t\t\"grey_question\",\n\t\t\t\"grey_exclamation\",\n\t\t\t\"exclamation\",\n\t\t\t\"wavy_dash\",\n\t\t\t\"copyright\",\n\t\t\t\"registered\",\n\t\t\t\"tm\",\n\t\t\t\"hash\",\n\t\t\t\"keycap_star\",\n\t\t\t\"zero\",\n\t\t\t\"one\",\n\t\t\t\"two\",\n\t\t\t\"three\",\n\t\t\t\"four\",\n\t\t\t\"five\",\n\t\t\t\"six\",\n\t\t\t\"seven\",\n\t\t\t\"eight\",\n\t\t\t\"nine\",\n\t\t\t\"keycap_ten\",\n\t\t\t\"100\",\n\t\t\t\"capital_abcd\",\n\t\t\t\"abcd\",\n\t\t\t\"1234\",\n\t\t\t\"symbols\",\n\t\t\t\"abc\",\n\t\t\t\"a\",\n\t\t\t\"ab\",\n\t\t\t\"b\",\n\t\t\t\"cl\",\n\t\t\t\"cool\",\n\t\t\t\"free\",\n\t\t\t\"information_source\",\n\t\t\t\"id\",\n\t\t\t\"m\",\n\t\t\t\"new\",\n\t\t\t\"ng\",\n\t\t\t\"o2\",\n\t\t\t\"ok\",\n\t\t\t\"parking\",\n\t\t\t\"sos\",\n\t\t\t\"up\",\n\t\t\t\"vs\",\n\t\t\t\"koko\",\n\t\t\t\"sa\",\n\t\t\t\"u6708\",\n\t\t\t\"u6709\",\n\t\t\t\"u6307\",\n\t\t\t\"ideograph_advantage\",\n\t\t\t\"u5272\",\n\t\t\t\"u7121\",\n\t\t\t\"u7981\",\n\t\t\t\"accept\",\n\t\t\t\"u7533\",\n\t\t\t\"u5408\",\n\t\t\t\"u7a7a\",\n\t\t\t\"congratulations\",\n\t\t\t\"secret\",\n\t\t\t\"u55b6\",\n\t\t\t\"u6e80\",\n\t\t\t\"black_small_square\",\n\t\t\t\"white_small_square\",\n\t\t\t\"white_medium_square\",\n\t\t\t\"black_medium_square\",\n\t\t\t\"white_medium_small_square\",\n\t\t\t\"black_medium_small_square\",\n\t\t\t\"black_large_square\",\n\t\t\t\"white_large_square\",\n\t\t\t\"large_orange_diamond\",\n\t\t\t\"large_blue_diamond\",\n\t\t\t\"small_orange_diamond\",\n\t\t\t\"small_blue_diamond\",\n\t\t\t\"small_red_triangle\",\n\t\t\t\"small_red_triangle_down\",\n\t\t\t\"diamond_shape_with_a_dot_inside\",\n\t\t\t\"radio_button\",\n\t\t\t\"black_square_button\",\n\t\t\t\"white_square_button\",\n\t\t\t\"white_circle\",\n\t\t\t\"black_circle\",\n\t\t\t\"red_circle\",\n\t\t\t\"large_blue_circle\"\n\t\t]\n\t},\n\t{\n\t\tid: \"flags\",\n\t\tname: \"Flags\",\n\t\temojis: [\n\t\t\t\"checkered_flag\",\n\t\t\t\"cn\",\n\t\t\t\"crossed_flags\",\n\t\t\t\"de\",\n\t\t\t\"es\",\n\t\t\t\"flag-ac\",\n\t\t\t\"flag-ad\",\n\t\t\t\"flag-ae\",\n\t\t\t\"flag-af\",\n\t\t\t\"flag-ag\",\n\t\t\t\"flag-ai\",\n\t\t\t\"flag-al\",\n\t\t\t\"flag-am\",\n\t\t\t\"flag-ao\",\n\t\t\t\"flag-aq\",\n\t\t\t\"flag-ar\",\n\t\t\t\"flag-as\",\n\t\t\t\"flag-at\",\n\t\t\t\"flag-au\",\n\t\t\t\"flag-aw\",\n\t\t\t\"flag-ax\",\n\t\t\t\"flag-az\",\n\t\t\t\"flag-ba\",\n\t\t\t\"flag-bb\",\n\t\t\t\"flag-bd\",\n\t\t\t\"flag-be\",\n\t\t\t\"flag-bf\",\n\t\t\t\"flag-bg\",\n\t\t\t\"flag-bh\",\n\t\t\t\"flag-bi\",\n\t\t\t\"flag-bj\",\n\t\t\t\"flag-bl\",\n\t\t\t\"flag-bm\",\n\t\t\t\"flag-bn\",\n\t\t\t\"flag-bo\",\n\t\t\t\"flag-bq\",\n\t\t\t\"flag-br\",\n\t\t\t\"flag-bs\",\n\t\t\t\"flag-bt\",\n\t\t\t\"flag-bv\",\n\t\t\t\"flag-bw\",\n\t\t\t\"flag-by\",\n\t\t\t\"flag-bz\",\n\t\t\t\"flag-ca\",\n\t\t\t\"flag-cc\",\n\t\t\t\"flag-cd\",\n\t\t\t\"flag-cf\",\n\t\t\t\"flag-cg\",\n\t\t\t\"flag-ch\",\n\t\t\t\"flag-ci\",\n\t\t\t\"flag-ck\",\n\t\t\t\"flag-cl\",\n\t\t\t\"flag-cm\",\n\t\t\t\"flag-co\",\n\t\t\t\"flag-cp\",\n\t\t\t\"flag-cr\",\n\t\t\t\"flag-cu\",\n\t\t\t\"flag-cv\",\n\t\t\t\"flag-cw\",\n\t\t\t\"flag-cx\",\n\t\t\t\"flag-cy\",\n\t\t\t\"flag-cz\",\n\t\t\t\"flag-dg\",\n\t\t\t\"flag-dj\",\n\t\t\t\"flag-dk\",\n\t\t\t\"flag-dm\",\n\t\t\t\"flag-do\",\n\t\t\t\"flag-dz\",\n\t\t\t\"flag-ea\",\n\t\t\t\"flag-ec\",\n\t\t\t\"flag-ee\",\n\t\t\t\"flag-eg\",\n\t\t\t\"flag-eh\",\n\t\t\t\"flag-england\",\n\t\t\t\"flag-er\",\n\t\t\t\"flag-et\",\n\t\t\t\"flag-eu\",\n\t\t\t\"flag-fi\",\n\t\t\t\"flag-fj\",\n\t\t\t\"flag-fk\",\n\t\t\t\"flag-fm\",\n\t\t\t\"flag-fo\",\n\t\t\t\"flag-ga\",\n\t\t\t\"flag-gd\",\n\t\t\t\"flag-ge\",\n\t\t\t\"flag-gf\",\n\t\t\t\"flag-gg\",\n\t\t\t\"flag-gh\",\n\t\t\t\"flag-gi\",\n\t\t\t\"flag-gl\",\n\t\t\t\"flag-gm\",\n\t\t\t\"flag-gn\",\n\t\t\t\"flag-gp\",\n\t\t\t\"flag-gq\",\n\t\t\t\"flag-gr\",\n\t\t\t\"flag-gs\",\n\t\t\t\"flag-gt\",\n\t\t\t\"flag-gu\",\n\t\t\t\"flag-gw\",\n\t\t\t\"flag-gy\",\n\t\t\t\"flag-hk\",\n\t\t\t\"flag-hm\",\n\t\t\t\"flag-hn\",\n\t\t\t\"flag-hr\",\n\t\t\t\"flag-ht\",\n\t\t\t\"flag-hu\",\n\t\t\t\"flag-ic\",\n\t\t\t\"flag-id\",\n\t\t\t\"flag-ie\",\n\t\t\t\"flag-il\",\n\t\t\t\"flag-im\",\n\t\t\t\"flag-in\",\n\t\t\t\"flag-io\",\n\t\t\t\"flag-iq\",\n\t\t\t\"flag-ir\",\n\t\t\t\"flag-is\",\n\t\t\t\"flag-je\",\n\t\t\t\"flag-jm\",\n\t\t\t\"flag-jo\",\n\t\t\t\"flag-ke\",\n\t\t\t\"flag-kg\",\n\t\t\t\"flag-kh\",\n\t\t\t\"flag-ki\",\n\t\t\t\"flag-km\",\n\t\t\t\"flag-kn\",\n\t\t\t\"flag-kp\",\n\t\t\t\"flag-kw\",\n\t\t\t\"flag-ky\",\n\t\t\t\"flag-kz\",\n\t\t\t\"flag-la\",\n\t\t\t\"flag-lb\",\n\t\t\t\"flag-lc\",\n\t\t\t\"flag-li\",\n\t\t\t\"flag-lk\",\n\t\t\t\"flag-lr\",\n\t\t\t\"flag-ls\",\n\t\t\t\"flag-lt\",\n\t\t\t\"flag-lu\",\n\t\t\t\"flag-lv\",\n\t\t\t\"flag-ly\",\n\t\t\t\"flag-ma\",\n\t\t\t\"flag-mc\",\n\t\t\t\"flag-md\",\n\t\t\t\"flag-me\",\n\t\t\t\"flag-mf\",\n\t\t\t\"flag-mg\",\n\t\t\t\"flag-mh\",\n\t\t\t\"flag-mk\",\n\t\t\t\"flag-ml\",\n\t\t\t\"flag-mm\",\n\t\t\t\"flag-mn\",\n\t\t\t\"flag-mo\",\n\t\t\t\"flag-mp\",\n\t\t\t\"flag-mq\",\n\t\t\t\"flag-mr\",\n\t\t\t\"flag-ms\",\n\t\t\t\"flag-mt\",\n\t\t\t\"flag-mu\",\n\t\t\t\"flag-mv\",\n\t\t\t\"flag-mw\",\n\t\t\t\"flag-mx\",\n\t\t\t\"flag-my\",\n\t\t\t\"flag-mz\",\n\t\t\t\"flag-na\",\n\t\t\t\"flag-nc\",\n\t\t\t\"flag-ne\",\n\t\t\t\"flag-nf\",\n\t\t\t\"flag-ng\",\n\t\t\t\"flag-ni\",\n\t\t\t\"flag-nl\",\n\t\t\t\"flag-no\",\n\t\t\t\"flag-np\",\n\t\t\t\"flag-nr\",\n\t\t\t\"flag-nu\",\n\t\t\t\"flag-nz\",\n\t\t\t\"flag-om\",\n\t\t\t\"flag-pa\",\n\t\t\t\"flag-pe\",\n\t\t\t\"flag-pf\",\n\t\t\t\"flag-pg\",\n\t\t\t\"flag-ph\",\n\t\t\t\"flag-pk\",\n\t\t\t\"flag-pl\",\n\t\t\t\"flag-pm\",\n\t\t\t\"flag-pn\",\n\t\t\t\"flag-pr\",\n\t\t\t\"flag-ps\",\n\t\t\t\"flag-pt\",\n\t\t\t\"flag-pw\",\n\t\t\t\"flag-py\",\n\t\t\t\"flag-qa\",\n\t\t\t\"flag-re\",\n\t\t\t\"flag-ro\",\n\t\t\t\"flag-rs\",\n\t\t\t\"flag-rw\",\n\t\t\t\"flag-sa\",\n\t\t\t\"flag-sb\",\n\t\t\t\"flag-sc\",\n\t\t\t\"flag-scotland\",\n\t\t\t\"flag-sd\",\n\t\t\t\"flag-se\",\n\t\t\t\"flag-sg\",\n\t\t\t\"flag-sh\",\n\t\t\t\"flag-si\",\n\t\t\t\"flag-sj\",\n\t\t\t\"flag-sk\",\n\t\t\t\"flag-sl\",\n\t\t\t\"flag-sm\",\n\t\t\t\"flag-sn\",\n\t\t\t\"flag-so\",\n\t\t\t\"flag-sr\",\n\t\t\t\"flag-ss\",\n\t\t\t\"flag-st\",\n\t\t\t\"flag-sv\",\n\t\t\t\"flag-sx\",\n\t\t\t\"flag-sy\",\n\t\t\t\"flag-sz\",\n\t\t\t\"flag-ta\",\n\t\t\t\"flag-tc\",\n\t\t\t\"flag-td\",\n\t\t\t\"flag-tf\",\n\t\t\t\"flag-tg\",\n\t\t\t\"flag-th\",\n\t\t\t\"flag-tj\",\n\t\t\t\"flag-tk\",\n\t\t\t\"flag-tl\",\n\t\t\t\"flag-tm\",\n\t\t\t\"flag-tn\",\n\t\t\t\"flag-to\",\n\t\t\t\"flag-tr\",\n\t\t\t\"flag-tt\",\n\t\t\t\"flag-tv\",\n\t\t\t\"flag-tw\",\n\t\t\t\"flag-tz\",\n\t\t\t\"flag-ua\",\n\t\t\t\"flag-ug\",\n\t\t\t\"flag-um\",\n\t\t\t\"flag-uy\",\n\t\t\t\"flag-uz\",\n\t\t\t\"flag-va\",\n\t\t\t\"flag-vc\",\n\t\t\t\"flag-ve\",\n\t\t\t\"flag-vg\",\n\t\t\t\"flag-vi\",\n\t\t\t\"flag-vn\",\n\t\t\t\"flag-vu\",\n\t\t\t\"flag-wales\",\n\t\t\t\"flag-wf\",\n\t\t\t\"flag-ws\",\n\t\t\t\"flag-xk\",\n\t\t\t\"flag-ye\",\n\t\t\t\"flag-yt\",\n\t\t\t\"flag-za\",\n\t\t\t\"flag-zm\",\n\t\t\t\"flag-zw\",\n\t\t\t\"fr\",\n\t\t\t\"gb\",\n\t\t\t\"it\",\n\t\t\t\"jp\",\n\t\t\t\"kr\",\n\t\t\t\"rainbow-flag\",\n\t\t\t\"ru\",\n\t\t\t\"triangular_flag_on_post\",\n\t\t\t\"us\",\n\t\t\t\"waving_black_flag\",\n\t\t\t\"waving_white_flag\"\n\t\t]\n\t}\n];\nvar emojis = {\n\t\"100\": {\n\t\ta: \"Hundred Points Symbol\",\n\t\tb: \"1F4AF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"score\",\n\t\t\t\"perfect\",\n\t\t\t\"numbers\",\n\t\t\t\"century\",\n\t\t\t\"exam\",\n\t\t\t\"quiz\",\n\t\t\t\"test\",\n\t\t\t\"pass\",\n\t\t\t\"hundred\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t26\n\t\t]\n\t},\n\t\"1234\": {\n\t\ta: \"Input Symbol for Numbers\",\n\t\tb: \"1F522\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t36\n\t\t]\n\t},\n\tmonkey_face: {\n\t\ta: \"Monkey Face\",\n\t\tb: \"1F435\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t31\n\t\t],\n\t\tl: [\n\t\t\t\":o)\"\n\t\t]\n\t},\n\tgrinning: {\n\t\ta: \"Grinning Face\",\n\t\tb: \"1F600\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\",\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\":D\",\n\t\t\t\"grin\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t24\n\t\t],\n\t\tm: \":D\"\n\t},\n\tearth_africa: {\n\t\ta: \"Earth Globe Europe-Africa\",\n\t\tb: \"1F30D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"globe\",\n\t\t\t\"world\",\n\t\t\t\"international\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t5\n\t\t]\n\t},\n\tcheckered_flag: {\n\t\ta: \"Chequered Flag\",\n\t\tb: \"1F3C1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"contest\",\n\t\t\t\"finishline\",\n\t\t\t\"race\",\n\t\t\t\"gokart\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t27\n\t\t]\n\t},\n\tmute: {\n\t\ta: \"Speaker with Cancellation Stroke\",\n\t\tb: \"1F507\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"volume\",\n\t\t\t\"silence\",\n\t\t\t\"quiet\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t9\n\t\t]\n\t},\n\tjack_o_lantern: {\n\t\ta: \"Jack-O-Lantern\",\n\t\tb: \"1F383\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"halloween\",\n\t\t\t\"light\",\n\t\t\t\"pumpkin\",\n\t\t\t\"creepy\",\n\t\t\t\"fall\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t17\n\t\t]\n\t},\n\tatm: {\n\t\ta: \"Automated Teller Machine\",\n\t\tb: \"1F3E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"cash\",\n\t\t\t\"blue-square\",\n\t\t\t\"payment\",\n\t\t\t\"bank\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t4\n\t\t]\n\t},\n\tgrapes: {\n\t\ta: \"Grapes\",\n\t\tb: \"1F347\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"wine\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t9\n\t\t]\n\t},\n\tearth_americas: {\n\t\ta: \"Earth Globe Americas\",\n\t\tb: \"1F30E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"globe\",\n\t\t\t\"world\",\n\t\t\t\"USA\",\n\t\t\t\"international\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t6\n\t\t]\n\t},\n\tgrin: {\n\t\ta: \"Grinning Face with Smiling Eyes\",\n\t\tb: \"1F601\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"smile\",\n\t\t\t\"joy\",\n\t\t\t\"kawaii\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t25\n\t\t]\n\t},\n\tmelon: {\n\t\ta: \"Melon\",\n\t\tb: \"1F348\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t10\n\t\t]\n\t},\n\ttriangular_flag_on_post: {\n\t\ta: \"Triangular Flag on Post\",\n\t\tb: \"1F6A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mark\",\n\t\t\t\"milestone\",\n\t\t\t\"place\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t14\n\t\t]\n\t},\n\tmonkey: {\n\t\ta: \"Monkey\",\n\t\tb: \"1F412\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"banana\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t48\n\t\t]\n\t},\n\tchristmas_tree: {\n\t\ta: \"Christmas Tree\",\n\t\tb: \"1F384\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"vacation\",\n\t\t\t\"december\",\n\t\t\t\"xmas\",\n\t\t\t\"celebration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t18\n\t\t]\n\t},\n\tput_litter_in_its_place: {\n\t\ta: \"Put Litter in Its Place Symbol\",\n\t\tb: \"1F6AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"sign\",\n\t\t\t\"human\",\n\t\t\t\"info\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t19\n\t\t]\n\t},\n\tspeaker: {\n\t\ta: \"Speaker\",\n\t\tb: \"1F508\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"volume\",\n\t\t\t\"silence\",\n\t\t\t\"broadcast\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t10\n\t\t]\n\t},\n\tearth_asia: {\n\t\ta: \"Earth Globe Asia-Australia\",\n\t\tb: \"1F30F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"globe\",\n\t\t\t\"world\",\n\t\t\t\"east\",\n\t\t\t\"international\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t7\n\t\t]\n\t},\n\tcrossed_flags: {\n\t\ta: \"Crossed Flags\",\n\t\tb: \"1F38C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"border\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t31\n\t\t]\n\t},\n\tjoy: {\n\t\ta: \"Face with Tears of Joy\",\n\t\tb: \"1F602\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cry\",\n\t\t\t\"tears\",\n\t\t\t\"weep\",\n\t\t\t\"happy\",\n\t\t\t\"happytears\",\n\t\t\t\"haha\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t26\n\t\t]\n\t},\n\tsound: {\n\t\ta: \"Speaker with One Sound Wave\",\n\t\tb: \"1F509\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"volume\",\n\t\t\t\"speaker\",\n\t\t\t\"broadcast\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t11\n\t\t]\n\t},\n\twatermelon: {\n\t\ta: \"Watermelon\",\n\t\tb: \"1F349\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"picnic\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t11\n\t\t]\n\t},\n\tgorilla: {\n\t\ta: \"Gorilla\",\n\t\tb: \"1F98D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t37\n\t\t],\n\t\to: 9\n\t},\n\tfireworks: {\n\t\ta: \"Fireworks\",\n\t\tb: \"1F386\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"festival\",\n\t\t\t\"carnival\",\n\t\t\t\"congratulations\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t25\n\t\t]\n\t},\n\tpotable_water: {\n\t\ta: \"Potable Water Symbol\",\n\t\tb: \"1F6B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"liquid\",\n\t\t\t\"restroom\",\n\t\t\t\"cleaning\",\n\t\t\t\"faucet\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t21\n\t\t]\n\t},\n\twheelchair: {\n\t\ta: \"Wheelchair Symbol\",\n\t\tb: \"267F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"disabled\",\n\t\t\t\"a11y\",\n\t\t\t\"accessibility\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t10\n\t\t],\n\t\to: 4\n\t},\n\trolling_on_the_floor_laughing: {\n\t\ta: \"Rolling on the Floor Laughing\",\n\t\tb: \"1F923\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t26\n\t\t],\n\t\to: 9\n\t},\n\tloud_sound: {\n\t\ta: \"Speaker with Three Sound Waves\",\n\t\tb: \"1F50A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"volume\",\n\t\t\t\"noise\",\n\t\t\t\"noisy\",\n\t\t\t\"speaker\",\n\t\t\t\"broadcast\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t12\n\t\t]\n\t},\n\twaving_black_flag: {\n\t\ta: \"Waving Black Flag\",\n\t\tb: \"1F3F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t19\n\t\t],\n\t\to: 7\n\t},\n\ttangerine: {\n\t\ta: \"Tangerine\",\n\t\tb: \"1F34A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"orange\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t12\n\t\t]\n\t},\n\tdog: {\n\t\ta: \"Dog Face\",\n\t\tb: \"1F436\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"friend\",\n\t\t\t\"nature\",\n\t\t\t\"woof\",\n\t\t\t\"puppy\",\n\t\t\t\"pet\",\n\t\t\t\"faithful\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t32\n\t\t]\n\t},\n\tsparkler: {\n\t\ta: \"Firework Sparkler\",\n\t\tb: \"1F387\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"night\",\n\t\t\t\"shine\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t26\n\t\t]\n\t},\n\tglobe_with_meridians: {\n\t\ta: \"Globe with Meridians\",\n\t\tb: \"1F310\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"earth\",\n\t\t\t\"international\",\n\t\t\t\"world\",\n\t\t\t\"internet\",\n\t\t\t\"interweb\",\n\t\t\t\"i18n\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t8\n\t\t]\n\t},\n\tsmiley: {\n\t\ta: \"Smiling Face with Open Mouth\",\n\t\tb: \"1F603\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"haha\",\n\t\t\t\":D\",\n\t\t\t\":)\",\n\t\t\t\"smile\",\n\t\t\t\"funny\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t27\n\t\t],\n\t\tl: [\n\t\t\t\"=)\",\n\t\t\t\"=-)\"\n\t\t],\n\t\tm: \":)\"\n\t},\n\tloudspeaker: {\n\t\ta: \"Public Address Loudspeaker\",\n\t\tb: \"1F4E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"volume\",\n\t\t\t\"sound\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t25\n\t\t]\n\t},\n\tsparkles: {\n\t\ta: \"Sparkles\",\n\t\tb: \"2728\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"shine\",\n\t\t\t\"shiny\",\n\t\t\t\"cool\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t48\n\t\t]\n\t},\n\tdog2: {\n\t\ta: \"Dog\",\n\t\tb: \"1F415\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"friend\",\n\t\t\t\"doge\",\n\t\t\t\"pet\",\n\t\t\t\"faithful\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t51\n\t\t]\n\t},\n\twaving_white_flag: {\n\t\ta: \"Waving White Flag\",\n\t\tb: \"1F3F3-FE0F\",\n\t\tc: \"1F3F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t15\n\t\t],\n\t\to: 7\n\t},\n\tworld_map: {\n\t\ta: \"World Map\",\n\t\tb: \"1F5FA-FE0F\",\n\t\tc: \"1F5FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"location\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\tlemon: {\n\t\ta: \"Lemon\",\n\t\tb: \"1F34B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t13\n\t\t]\n\t},\n\tmens: {\n\t\ta: \"Mens Symbol\",\n\t\tb: \"1F6B9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"toilet\",\n\t\t\t\"restroom\",\n\t\t\t\"wc\",\n\t\t\t\"blue-square\",\n\t\t\t\"gender\",\n\t\t\t\"male\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t29\n\t\t]\n\t},\n\twomens: {\n\t\ta: \"Womens Symbol\",\n\t\tb: \"1F6BA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"woman\",\n\t\t\t\"female\",\n\t\t\t\"toilet\",\n\t\t\t\"loo\",\n\t\t\t\"restroom\",\n\t\t\t\"gender\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t30\n\t\t]\n\t},\n\t\"rainbow-flag\": {\n\t\ta: \"Rainbow Flag\",\n\t\tb: \"1F3F3-FE0F-200D-1F308\",\n\t\tc: \"1F3F3-200D-1F308\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t12,\n\t\t\t14\n\t\t],\n\t\to: 7\n\t},\n\tsmile: {\n\t\ta: \"Smiling Face with Open Mouth and Smiling Eyes\",\n\t\tb: \"1F604\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"funny\",\n\t\t\t\"haha\",\n\t\t\t\"laugh\",\n\t\t\t\"like\",\n\t\t\t\":D\",\n\t\t\t\":)\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t28\n\t\t],\n\t\tl: [\n\t\t\t\"C:\",\n\t\t\t\"c:\",\n\t\t\t\":D\",\n\t\t\t\":-D\"\n\t\t],\n\t\tm: \":)\"\n\t},\n\tbanana: {\n\t\ta: \"Banana\",\n\t\tb: \"1F34C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"monkey\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t14\n\t\t]\n\t},\n\tmega: {\n\t\ta: \"Cheering Megaphone\",\n\t\tb: \"1F4E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"speaker\",\n\t\t\t\"volume\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t26\n\t\t]\n\t},\n\tjapan: {\n\t\ta: \"Silhouette of Japan\",\n\t\tb: \"1F5FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"japanese\",\n\t\t\t\"asia\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t22\n\t\t]\n\t},\n\tpoodle: {\n\t\ta: \"Poodle\",\n\t\tb: \"1F429\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dog\",\n\t\t\t\"animal\",\n\t\t\t\"101\",\n\t\t\t\"nature\",\n\t\t\t\"pet\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t19\n\t\t]\n\t},\n\tballoon: {\n\t\ta: \"Balloon\",\n\t\tb: \"1F388\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"party\",\n\t\t\t\"celebration\",\n\t\t\t\"birthday\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t27\n\t\t]\n\t},\n\t\"flag-ac\": {\n\t\ta: \"Ascension Island Flag\",\n\t\tb: \"1F1E6-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t31\n\t\t]\n\t},\n\tsweat_smile: {\n\t\ta: \"Smiling Face with Open Mouth and Cold Sweat\",\n\t\tb: \"1F605\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hot\",\n\t\t\t\"happy\",\n\t\t\t\"laugh\",\n\t\t\t\"sweat\",\n\t\t\t\"smile\",\n\t\t\t\"relief\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t29\n\t\t]\n\t},\n\tpineapple: {\n\t\ta: \"Pineapple\",\n\t\tb: \"1F34D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t15\n\t\t]\n\t},\n\trestroom: {\n\t\ta: \"Restroom\",\n\t\tb: \"1F6BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"toilet\",\n\t\t\t\"refresh\",\n\t\t\t\"wc\",\n\t\t\t\"gender\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t31\n\t\t]\n\t},\n\tpostal_horn: {\n\t\ta: \"Postal Horn\",\n\t\tb: \"1F4EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"instrument\",\n\t\t\t\"music\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t38\n\t\t]\n\t},\n\twolf: {\n\t\ta: \"Wolf Face\",\n\t\tb: \"1F43A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"wild\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t36\n\t\t]\n\t},\n\ttada: {\n\t\ta: \"Party Popper\",\n\t\tb: \"1F389\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"party\",\n\t\t\t\"congratulations\",\n\t\t\t\"birthday\",\n\t\t\t\"magic\",\n\t\t\t\"circus\",\n\t\t\t\"celebration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t28\n\t\t]\n\t},\n\tsnow_capped_mountain: {\n\t\ta: \"Snow Capped Mountain\",\n\t\tb: \"1F3D4-FE0F\",\n\t\tc: \"1F3D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t37\n\t\t],\n\t\to: 7\n\t},\n\tlaughing: {\n\t\ta: \"Smiling Face with Open Mouth and Tightly-Closed Eyes\",\n\t\tb: \"1F606\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"lol\",\n\t\t\t\"satisfied\",\n\t\t\t\"haha\",\n\t\t\t\"face\",\n\t\t\t\"glad\",\n\t\t\t\"XD\",\n\t\t\t\"laugh\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t30\n\t\t],\n\t\tl: [\n\t\t\t\":>\",\n\t\t\t\":->\"\n\t\t],\n\t\tn: [\n\t\t\t\"satisfied\"\n\t\t]\n\t},\n\tapple: {\n\t\ta: \"Red Apple\",\n\t\tb: \"1F34E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"mac\",\n\t\t\t\"school\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t16\n\t\t]\n\t},\n\t\"flag-ad\": {\n\t\ta: \"Andorra Flag\",\n\t\tb: \"1F1E6-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t32\n\t\t]\n\t},\n\tfox_face: {\n\t\ta: \"Fox Face\",\n\t\tb: \"1F98A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"face\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t34\n\t\t],\n\t\to: 9\n\t},\n\tconfetti_ball: {\n\t\ta: \"Confetti Ball\",\n\t\tb: \"1F38A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"party\",\n\t\t\t\"birthday\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t29\n\t\t]\n\t},\n\tbell: {\n\t\ta: \"Bell\",\n\t\tb: \"1F514\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"notification\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\",\n\t\t\t\"chime\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t22\n\t\t]\n\t},\n\tmountain: {\n\t\ta: \"Mountain\",\n\t\tb: \"26F0-FE0F\",\n\t\tc: \"26F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"nature\",\n\t\t\t\"environment\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t38\n\t\t],\n\t\to: 5\n\t},\n\tbaby_symbol: {\n\t\ta: \"Baby Symbol\",\n\t\tb: \"1F6BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"child\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t32\n\t\t]\n\t},\n\twc: {\n\t\ta: \"Water Closet\",\n\t\tb: \"1F6BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"toilet\",\n\t\t\t\"restroom\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t34\n\t\t]\n\t},\n\twink: {\n\t\ta: \"Winking Face\",\n\t\tb: \"1F609\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"happy\",\n\t\t\t\"mischievous\",\n\t\t\t\"secret\",\n\t\t\t\";)\",\n\t\t\t\"smile\",\n\t\t\t\"eye\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t33\n\t\t],\n\t\tl: [\n\t\t\t\";)\",\n\t\t\t\";-)\"\n\t\t],\n\t\tm: \";)\"\n\t},\n\tno_bell: {\n\t\ta: \"Bell with Cancellation Stroke\",\n\t\tb: \"1F515\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"volume\",\n\t\t\t\"mute\",\n\t\t\t\"quiet\",\n\t\t\t\"silent\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t23\n\t\t]\n\t},\n\tgreen_apple: {\n\t\ta: \"Green Apple\",\n\t\tb: \"1F34F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t17\n\t\t]\n\t},\n\ttanabata_tree: {\n\t\ta: \"Tanabata Tree\",\n\t\tb: \"1F38B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"branch\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-ae\": {\n\t\ta: \"United Arab Emirates Flag\",\n\t\tb: \"1F1E6-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t33\n\t\t]\n\t},\n\tvolcano: {\n\t\ta: \"Volcano\",\n\t\tb: \"1F30B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"nature\",\n\t\t\t\"disaster\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t3\n\t\t]\n\t},\n\tcat: {\n\t\ta: \"Cat Face\",\n\t\tb: \"1F431\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"meow\",\n\t\t\t\"nature\",\n\t\t\t\"pet\",\n\t\t\t\"kitten\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t27\n\t\t]\n\t},\n\t\"flag-af\": {\n\t\ta: \"Afghanistan Flag\",\n\t\tb: \"1F1E6-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t34\n\t\t]\n\t},\n\tmusical_score: {\n\t\ta: \"Musical Score\",\n\t\tb: \"1F3BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"treble\",\n\t\t\t\"clef\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t22\n\t\t]\n\t},\n\tblush: {\n\t\ta: \"Smiling Face with Smiling Eyes\",\n\t\tb: \"1F60A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\",\n\t\t\t\"happy\",\n\t\t\t\"flushed\",\n\t\t\t\"crush\",\n\t\t\t\"embarrassed\",\n\t\t\t\"shy\",\n\t\t\t\"joy\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t34\n\t\t],\n\t\tm: \":)\"\n\t},\n\tpear: {\n\t\ta: \"Pear\",\n\t\tb: \"1F350\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t18\n\t\t]\n\t},\n\tbamboo: {\n\t\ta: \"Pine Decoration\",\n\t\tb: \"1F38D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"vegetable\",\n\t\t\t\"panda\",\n\t\t\t\"pine_decoration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t32\n\t\t]\n\t},\n\tpassport_control: {\n\t\ta: \"Passport Control\",\n\t\tb: \"1F6C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"custom\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t43\n\t\t]\n\t},\n\tmount_fuji: {\n\t\ta: \"Mount Fuji\",\n\t\tb: \"1F5FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"mountain\",\n\t\t\t\"nature\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t19\n\t\t]\n\t},\n\tcat2: {\n\t\ta: \"Cat\",\n\t\tb: \"1F408\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"meow\",\n\t\t\t\"pet\",\n\t\t\t\"cats\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t38\n\t\t]\n\t},\n\tmusical_note: {\n\t\ta: \"Musical Note\",\n\t\tb: \"1F3B5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"score\",\n\t\t\t\"tone\",\n\t\t\t\"sound\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t15\n\t\t]\n\t},\n\tdolls: {\n\t\ta: \"Japanese Dolls\",\n\t\tb: \"1F38E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"toy\",\n\t\t\t\"kimono\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t33\n\t\t]\n\t},\n\tlion_face: {\n\t\ta: \"Lion Face\",\n\t\tb: \"1F981\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t25\n\t\t],\n\t\to: 8\n\t},\n\tcamping: {\n\t\ta: \"Camping\",\n\t\tb: \"1F3D5-FE0F\",\n\t\tc: \"1F3D5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"outdoors\",\n\t\t\t\"tent\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t38\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ag\": {\n\t\ta: \"Antigua & Barbuda Flag\",\n\t\tb: \"1F1E6-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t35\n\t\t]\n\t},\n\tcustoms: {\n\t\ta: \"Customs\",\n\t\tb: \"1F6C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"passport\",\n\t\t\t\"border\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t44\n\t\t]\n\t},\n\tyum: {\n\t\ta: \"Face Savouring Delicious Food\",\n\t\tb: \"1F60B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"happy\",\n\t\t\t\"joy\",\n\t\t\t\"tongue\",\n\t\t\t\"smile\",\n\t\t\t\"face\",\n\t\t\t\"silly\",\n\t\t\t\"yummy\",\n\t\t\t\"nom\",\n\t\t\t\"delicious\",\n\t\t\t\"savouring\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t35\n\t\t]\n\t},\n\tpeach: {\n\t\ta: \"Peach\",\n\t\tb: \"1F351\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t19\n\t\t]\n\t},\n\ttiger: {\n\t\ta: \"Tiger Face\",\n\t\tb: \"1F42F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cat\",\n\t\t\t\"danger\",\n\t\t\t\"wild\",\n\t\t\t\"nature\",\n\t\t\t\"roar\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t25\n\t\t]\n\t},\n\tnotes: {\n\t\ta: \"Multiple Musical Notes\",\n\t\tb: \"1F3B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"score\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t16\n\t\t]\n\t},\n\tflags: {\n\t\ta: \"Carp Streamer\",\n\t\tb: \"1F38F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fish\",\n\t\t\t\"japanese\",\n\t\t\t\"koinobori\",\n\t\t\t\"carp\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t34\n\t\t]\n\t},\n\tbeach_with_umbrella: {\n\t\ta: \"Beach with Umbrella\",\n\t\tb: \"1F3D6-FE0F\",\n\t\tc: \"1F3D6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t39\n\t\t],\n\t\to: 7\n\t},\n\tcherries: {\n\t\ta: \"Cherries\",\n\t\tb: \"1F352\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"fruit\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t20\n\t\t]\n\t},\n\t\"flag-ai\": {\n\t\ta: \"Anguilla Flag\",\n\t\tb: \"1F1E6-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t36\n\t\t]\n\t},\n\tbaggage_claim: {\n\t\ta: \"Baggage Claim\",\n\t\tb: \"1F6C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"airport\",\n\t\t\t\"transport\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t45\n\t\t]\n\t},\n\tsunglasses: {\n\t\ta: \"Smiling Face with Sunglasses\",\n\t\tb: \"1F60E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cool\",\n\t\t\t\"smile\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"sunglass\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t38\n\t\t],\n\t\tl: [\n\t\t\t\"8)\"\n\t\t]\n\t},\n\tleft_luggage: {\n\t\ta: \"Left Luggage\",\n\t\tb: \"1F6C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t46\n\t\t]\n\t},\n\twind_chime: {\n\t\ta: \"Wind Chime\",\n\t\tb: \"1F390\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"ding\",\n\t\t\t\"spring\",\n\t\t\t\"bell\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t35\n\t\t]\n\t},\n\tstrawberry: {\n\t\ta: \"Strawberry\",\n\t\tb: \"1F353\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t21\n\t\t]\n\t},\n\tdesert: {\n\t\ta: \"Desert\",\n\t\tb: \"1F3DC-FE0F\",\n\t\tc: \"1F3DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"warm\",\n\t\t\t\"saharah\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t45\n\t\t],\n\t\to: 7\n\t},\n\tstudio_microphone: {\n\t\ta: \"Studio Microphone\",\n\t\tb: \"1F399-FE0F\",\n\t\tc: \"1F399\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sing\",\n\t\t\t\"recording\",\n\t\t\t\"artist\",\n\t\t\t\"talkshow\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t41\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-al\": {\n\t\ta: \"Albania Flag\",\n\t\tb: \"1F1E6-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t37\n\t\t]\n\t},\n\ttiger2: {\n\t\ta: \"Tiger\",\n\t\tb: \"1F405\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"roar\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t35\n\t\t]\n\t},\n\theart_eyes: {\n\t\ta: \"Smiling Face with Heart-Shaped Eyes\",\n\t\tb: \"1F60D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"crush\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t37\n\t\t]\n\t},\n\tdesert_island: {\n\t\ta: \"Desert Island\",\n\t\tb: \"1F3DD-FE0F\",\n\t\tc: \"1F3DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"tropical\",\n\t\t\t\"mojito\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t46\n\t\t],\n\t\to: 7\n\t},\n\tkiwifruit: {\n\t\ta: \"Kiwifruit\",\n\t\tb: \"1F95D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t9\n\t\t],\n\t\to: 9\n\t},\n\trice_scene: {\n\t\ta: \"Moon Viewing Ceremony\",\n\t\tb: \"1F391\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"japan\",\n\t\t\t\"asia\",\n\t\t\t\"tsukimi\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t36\n\t\t]\n\t},\n\tkissing_heart: {\n\t\ta: \"Face Throwing a Kiss\",\n\t\tb: \"1F618\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t48\n\t\t],\n\t\tl: [\n\t\t\t\":*\",\n\t\t\t\":-*\"\n\t\t]\n\t},\n\twarning: {\n\t\ta: \"Warning Sign\",\n\t\tb: \"26A0-FE0F\",\n\t\tc: \"26A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"exclamation\",\n\t\t\t\"wip\",\n\t\t\t\"alert\",\n\t\t\t\"error\",\n\t\t\t\"problem\",\n\t\t\t\"issue\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t20\n\t\t],\n\t\to: 4\n\t},\n\t\"flag-am\": {\n\t\ta: \"Armenia Flag\",\n\t\tb: \"1F1E6-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t38\n\t\t]\n\t},\n\tleopard: {\n\t\ta: \"Leopard\",\n\t\tb: \"1F406\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t36\n\t\t]\n\t},\n\tlevel_slider: {\n\t\ta: \"Level Slider\",\n\t\tb: \"1F39A-FE0F\",\n\t\tc: \"1F39A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"scale\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t42\n\t\t],\n\t\to: 7\n\t},\n\thorse: {\n\t\ta: \"Horse Face\",\n\t\tb: \"1F434\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"brown\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t30\n\t\t]\n\t},\n\tchildren_crossing: {\n\t\ta: \"Children Crossing\",\n\t\tb: \"1F6B8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"school\",\n\t\t\t\"warning\",\n\t\t\t\"danger\",\n\t\t\t\"sign\",\n\t\t\t\"driving\",\n\t\t\t\"yellow-diamond\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t28\n\t\t]\n\t},\n\tribbon: {\n\t\ta: \"Ribbon\",\n\t\tb: \"1F380\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"decoration\",\n\t\t\t\"pink\",\n\t\t\t\"girl\",\n\t\t\t\"bowtie\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t14\n\t\t]\n\t},\n\tnational_park: {\n\t\ta: \"National Park\",\n\t\tb: \"1F3DE-FE0F\",\n\t\tc: \"1F3DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"environment\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t47\n\t\t],\n\t\to: 7\n\t},\n\tcontrol_knobs: {\n\t\ta: \"Control Knobs\",\n\t\tb: \"1F39B-FE0F\",\n\t\tc: \"1F39B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"dial\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\tkissing: {\n\t\ta: \"Kissing Face\",\n\t\tb: \"1F617\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"face\",\n\t\t\t\"3\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t47\n\t\t]\n\t},\n\ttomato: {\n\t\ta: \"Tomato\",\n\t\tb: \"1F345\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"vegetable\",\n\t\t\t\"nature\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t7\n\t\t]\n\t},\n\t\"flag-ao\": {\n\t\ta: \"Angola Flag\",\n\t\tb: \"1F1E6-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t39\n\t\t]\n\t},\n\tstadium: {\n\t\ta: \"Stadium\",\n\t\tb: \"1F3DF-FE0F\",\n\t\tc: \"1F3DF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"place\",\n\t\t\t\"sports\",\n\t\t\t\"concert\",\n\t\t\t\"venue\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t48\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-aq\": {\n\t\ta: \"Antarctica Flag\",\n\t\tb: \"1F1E6-1F1F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t40\n\t\t]\n\t},\n\tgift: {\n\t\ta: \"Wrapped Present\",\n\t\tb: \"1F381\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"present\",\n\t\t\t\"birthday\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t15\n\t\t]\n\t},\n\tno_entry: {\n\t\ta: \"No Entry\",\n\t\tb: \"26D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"limit\",\n\t\t\t\"security\",\n\t\t\t\"privacy\",\n\t\t\t\"bad\",\n\t\t\t\"denied\",\n\t\t\t\"stop\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t35\n\t\t],\n\t\to: 5\n\t},\n\tkissing_smiling_eyes: {\n\t\ta: \"Kissing Face with Smiling Eyes\",\n\t\tb: \"1F619\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t49\n\t\t]\n\t},\n\tcoconut: {\n\t\ta: \"Coconut\",\n\t\tb: \"1F965\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t17\n\t\t],\n\t\to: 10\n\t},\n\tracehorse: {\n\t\ta: \"Horse\",\n\t\tb: \"1F40E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"gamble\",\n\t\t\t\"luck\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t44\n\t\t]\n\t},\n\tmicrophone: {\n\t\ta: \"Microphone\",\n\t\tb: \"1F3A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sound\",\n\t\t\t\"music\",\n\t\t\t\"PA\",\n\t\t\t\"sing\",\n\t\t\t\"talkshow\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t50\n\t\t]\n\t},\n\tclassical_building: {\n\t\ta: \"Classical Building\",\n\t\tb: \"1F3DB-FE0F\",\n\t\tc: \"1F3DB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"art\",\n\t\t\t\"culture\",\n\t\t\t\"history\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tno_entry_sign: {\n\t\ta: \"No Entry Sign\",\n\t\tb: \"1F6AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"forbid\",\n\t\t\t\"stop\",\n\t\t\t\"limit\",\n\t\t\t\"denied\",\n\t\t\t\"disallow\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t16\n\t\t]\n\t},\n\treminder_ribbon: {\n\t\ta: \"Reminder Ribbon\",\n\t\tb: \"1F397-FE0F\",\n\t\tc: \"1F397\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"cause\",\n\t\t\t\"support\",\n\t\t\t\"awareness\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t40\n\t\t],\n\t\to: 7\n\t},\n\tkissing_closed_eyes: {\n\t\ta: \"Kissing Face with Closed Eyes\",\n\t\tb: \"1F61A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"infatuation\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t50\n\t\t]\n\t},\n\tunicorn_face: {\n\t\ta: \"Unicorn Face\",\n\t\tb: \"1F984\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t28\n\t\t],\n\t\to: 8\n\t},\n\t\"flag-ar\": {\n\t\ta: \"Argentina Flag\",\n\t\tb: \"1F1E6-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t41\n\t\t]\n\t},\n\theadphones: {\n\t\ta: \"Headphone\",\n\t\tb: \"1F3A7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"score\",\n\t\t\t\"gadgets\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t1\n\t\t]\n\t},\n\tavocado: {\n\t\ta: \"Avocado\",\n\t\tb: \"1F951\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t49\n\t\t],\n\t\to: 9\n\t},\n\trelaxed: {\n\t\ta: \"White Smiling Face\",\n\t\tb: \"263A-FE0F\",\n\t\tc: \"263A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"blush\",\n\t\t\t\"massage\",\n\t\t\t\"happiness\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t41\n\t\t],\n\t\to: 1\n\t},\n\tzebra_face: {\n\t\ta: \"Zebra Face\",\n\t\tb: \"1F993\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t43\n\t\t],\n\t\to: 10\n\t},\n\teggplant: {\n\t\ta: \"Aubergine\",\n\t\tb: \"1F346\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"nature\",\n\t\t\t\"food\",\n\t\t\t\"aubergine\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t8\n\t\t]\n\t},\n\tradio: {\n\t\ta: \"Radio\",\n\t\tb: \"1F4FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"music\",\n\t\t\t\"podcast\",\n\t\t\t\"program\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t50\n\t\t]\n\t},\n\tbuilding_construction: {\n\t\ta: \"Building Construction\",\n\t\tb: \"1F3D7-FE0F\",\n\t\tc: \"1F3D7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"wip\",\n\t\t\t\"working\",\n\t\t\t\"progress\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t40\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-as\": {\n\t\ta: \"American Samoa Flag\",\n\t\tb: \"1F1E6-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t42\n\t\t]\n\t},\n\tadmission_tickets: {\n\t\ta: \"Admission Tickets\",\n\t\tb: \"1F39F-FE0F\",\n\t\tc: \"1F39F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t45\n\t\t],\n\t\to: 7\n\t},\n\tno_bicycles: {\n\t\ta: \"No Bicycles\",\n\t\tb: \"1F6B3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cyclist\",\n\t\t\t\"prohibited\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t24\n\t\t]\n\t},\n\tno_smoking: {\n\t\ta: \"No Smoking Symbol\",\n\t\tb: \"1F6AD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cigarette\",\n\t\t\t\"blue-square\",\n\t\t\t\"smell\",\n\t\t\t\"smoke\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t18\n\t\t]\n\t},\n\tslightly_smiling_face: {\n\t\ta: \"Slightly Smiling Face\",\n\t\tb: \"1F642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t38\n\t\t],\n\t\tl: [\n\t\t\t\":)\",\n\t\t\t\"(:\",\n\t\t\t\":-)\"\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-at\": {\n\t\ta: \"Austria Flag\",\n\t\tb: \"1F1E6-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t43\n\t\t]\n\t},\n\tticket: {\n\t\ta: \"Ticket\",\n\t\tb: \"1F3AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"event\",\n\t\t\t\"concert\",\n\t\t\t\"pass\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t5\n\t\t]\n\t},\n\tsaxophone: {\n\t\ta: \"Saxophone\",\n\t\tb: \"1F3B7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"instrument\",\n\t\t\t\"jazz\",\n\t\t\t\"blues\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t17\n\t\t]\n\t},\n\tdeer: {\n\t\ta: \"Deer\",\n\t\tb: \"1F98C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"horns\",\n\t\t\t\"venison\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t36\n\t\t],\n\t\to: 9\n\t},\n\thouse_buildings: {\n\t\ta: \"House Buildings\",\n\t\tb: \"1F3D8-FE0F\",\n\t\tc: \"1F3D8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t41\n\t\t],\n\t\to: 7\n\t},\n\tpotato: {\n\t\ta: \"Potato\",\n\t\tb: \"1F954\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"tuber\",\n\t\t\t\"vegatable\",\n\t\t\t\"starch\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t0\n\t\t],\n\t\to: 9\n\t},\n\tguitar: {\n\t\ta: \"Guitar\",\n\t\tb: \"1F3B8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"instrument\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t18\n\t\t]\n\t},\n\tcarrot: {\n\t\ta: \"Carrot\",\n\t\tb: \"1F955\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"food\",\n\t\t\t\"orange\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t1\n\t\t],\n\t\to: 9\n\t},\n\tcityscape: {\n\t\ta: \"Cityscape\",\n\t\tb: \"1F3D9-FE0F\",\n\t\tc: \"1F3D9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"night life\",\n\t\t\t\"urban\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t42\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-au\": {\n\t\ta: \"Australia Flag\",\n\t\tb: \"1F1E6-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t44\n\t\t]\n\t},\n\tdo_not_litter: {\n\t\ta: \"Do Not Litter Symbol\",\n\t\tb: \"1F6AF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"trash\",\n\t\t\t\"bin\",\n\t\t\t\"garbage\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t20\n\t\t]\n\t},\n\thugging_face: {\n\t\ta: \"Hugging Face\",\n\t\tb: \"1F917\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t31\n\t\t],\n\t\to: 8\n\t},\n\tcow: {\n\t\ta: \"Cow Face\",\n\t\tb: \"1F42E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beef\",\n\t\t\t\"ox\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"moo\",\n\t\t\t\"milk\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t24\n\t\t]\n\t},\n\tmedal: {\n\t\ta: \"Medal\",\n\t\tb: \"1F396-FE0F\",\n\t\tc: \"1F396\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t39\n\t\t],\n\t\to: 7\n\t},\n\tmusical_keyboard: {\n\t\ta: \"Musical Keyboard\",\n\t\tb: \"1F3B9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"piano\",\n\t\t\t\"instrument\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t19\n\t\t]\n\t},\n\tcorn: {\n\t\ta: \"Ear of Maize\",\n\t\tb: \"1F33D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"vegetable\",\n\t\t\t\"plant\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t51\n\t\t]\n\t},\n\tderelict_house_building: {\n\t\ta: \"Derelict House Building\",\n\t\tb: \"1F3DA-FE0F\",\n\t\tc: \"1F3DA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\t\"non-potable_water\": {\n\t\ta: \"Non-Potable Water Symbol\",\n\t\tb: \"1F6B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"faucet\",\n\t\t\t\"tap\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t22\n\t\t]\n\t},\n\ttrophy: {\n\t\ta: \"Trophy\",\n\t\tb: \"1F3C6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"win\",\n\t\t\t\"award\",\n\t\t\t\"contest\",\n\t\t\t\"place\",\n\t\t\t\"ftw\",\n\t\t\t\"ceremony\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-aw\": {\n\t\ta: \"Aruba Flag\",\n\t\tb: \"1F1E6-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t45\n\t\t]\n\t},\n\t\"star-struck\": {\n\t\ta: \"Grinning Face with Star Eyes\",\n\t\tb: \"1F929\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t49\n\t\t],\n\t\tn: [\n\t\t\t\"grinning_face_with_star_eyes\"\n\t\t],\n\t\to: 10\n\t},\n\tox: {\n\t\ta: \"Ox\",\n\t\tb: \"1F402\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cow\",\n\t\t\t\"beef\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t32\n\t\t]\n\t},\n\ttrumpet: {\n\t\ta: \"Trumpet\",\n\t\tb: \"1F3BA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"brass\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t20\n\t\t]\n\t},\n\thot_pepper: {\n\t\ta: \"Hot Pepper\",\n\t\tb: \"1F336-FE0F\",\n\t\tc: \"1F336\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"spicy\",\n\t\t\t\"chilli\",\n\t\t\t\"chili\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tsports_medal: {\n\t\ta: \"Sports Medal\",\n\t\tb: \"1F3C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ax\": {\n\t\ta: \"Åland Islands Flag\",\n\t\tb: \"1F1E6-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t46\n\t\t]\n\t},\n\twater_buffalo: {\n\t\ta: \"Water Buffalo\",\n\t\tb: \"1F403\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"ox\",\n\t\t\t\"cow\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t33\n\t\t]\n\t},\n\tno_pedestrians: {\n\t\ta: \"No Pedestrians\",\n\t\tb: \"1F6B7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"rules\",\n\t\t\t\"crossing\",\n\t\t\t\"walking\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t27\n\t\t]\n\t},\n\tthinking_face: {\n\t\ta: \"Thinking Face\",\n\t\tb: \"1F914\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t28\n\t\t],\n\t\to: 8\n\t},\n\thouse: {\n\t\ta: \"House Building\",\n\t\tb: \"1F3E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"home\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t49\n\t\t]\n\t},\n\tno_mobile_phones: {\n\t\ta: \"No Mobile Phones\",\n\t\tb: \"1F4F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"iphone\",\n\t\t\t\"mute\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t44\n\t\t]\n\t},\n\t\"flag-az\": {\n\t\ta: \"Azerbaijan Flag\",\n\t\tb: \"1F1E6-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t47\n\t\t]\n\t},\n\tfirst_place_medal: {\n\t\ta: \"First Place Medal\",\n\t\tb: \"1F947\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t42\n\t\t],\n\t\to: 9\n\t},\n\thouse_with_garden: {\n\t\ta: \"House with Garden\",\n\t\tb: \"1F3E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"home\",\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t50\n\t\t]\n\t},\n\tviolin: {\n\t\ta: \"Violin\",\n\t\tb: \"1F3BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"music\",\n\t\t\t\"instrument\",\n\t\t\t\"orchestra\",\n\t\t\t\"symphony\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t21\n\t\t]\n\t},\n\tface_with_raised_eyebrow: {\n\t\ta: \"Face with One Eyebrow Raised\",\n\t\tb: \"1F928\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t48\n\t\t],\n\t\tn: [\n\t\t\t\"face_with_one_eyebrow_raised\"\n\t\t],\n\t\to: 10\n\t},\n\tcucumber: {\n\t\ta: \"Cucumber\",\n\t\tb: \"1F952\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fruit\",\n\t\t\t\"food\",\n\t\t\t\"pickle\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\tcow2: {\n\t\ta: \"Cow\",\n\t\tb: \"1F404\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beef\",\n\t\t\t\"ox\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"moo\",\n\t\t\t\"milk\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t34\n\t\t]\n\t},\n\t\"flag-ba\": {\n\t\ta: \"Bosnia & Herzegovina Flag\",\n\t\tb: \"1F1E7-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t0,\n\t\t\t48\n\t\t]\n\t},\n\tpig: {\n\t\ta: \"Pig Face\",\n\t\tb: \"1F437\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"oink\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t33\n\t\t]\n\t},\n\tdrum_with_drumsticks: {\n\t\ta: \"Drum with Drumsticks\",\n\t\tb: \"1F941\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t37\n\t\t],\n\t\to: 9\n\t},\n\tunderage: {\n\t\ta: \"No One Under Eighteen Symbol\",\n\t\tb: \"1F51E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"18\",\n\t\t\t\"drink\",\n\t\t\t\"pub\",\n\t\t\t\"night\",\n\t\t\t\"minor\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t32\n\t\t]\n\t},\n\tbroccoli: {\n\t\ta: \"Broccoli\",\n\t\tb: \"1F966\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t18\n\t\t],\n\t\to: 10\n\t},\n\toffice: {\n\t\ta: \"Office Building\",\n\t\tb: \"1F3E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"bureau\",\n\t\t\t\"work\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t51\n\t\t]\n\t},\n\tsecond_place_medal: {\n\t\ta: \"Second Place Medal\",\n\t\tb: \"1F948\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t43\n\t\t],\n\t\to: 9\n\t},\n\tneutral_face: {\n\t\ta: \"Neutral Face\",\n\t\tb: \"1F610\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"indifference\",\n\t\t\t\"meh\",\n\t\t\t\":|\",\n\t\t\t\"neutral\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t40\n\t\t],\n\t\tl: [\n\t\t\t\":|\",\n\t\t\t\":-|\"\n\t\t]\n\t},\n\tthird_place_medal: {\n\t\ta: \"Third Place Medal\",\n\t\tb: \"1F949\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t44\n\t\t],\n\t\to: 9\n\t},\n\tmushroom: {\n\t\ta: \"Mushroom\",\n\t\tb: \"1F344\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"vegetable\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-bb\": {\n\t\ta: \"Barbados Flag\",\n\t\tb: \"1F1E7-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t49\n\t\t]\n\t},\n\tradioactive_sign: {\n\t\ta: \"Radioactive Sign\",\n\t\tb: \"2622-FE0F\",\n\t\tc: \"2622\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t33\n\t\t],\n\t\to: 1\n\t},\n\tpig2: {\n\t\ta: \"Pig\",\n\t\tb: \"1F416\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t0\n\t\t]\n\t},\n\texpressionless: {\n\t\ta: \"Expressionless Face\",\n\t\tb: \"1F611\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"indifferent\",\n\t\t\t\"-_-\",\n\t\t\t\"meh\",\n\t\t\t\"deadpan\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t41\n\t\t]\n\t},\n\tiphone: {\n\t\ta: \"Mobile Phone\",\n\t\tb: \"1F4F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"apple\",\n\t\t\t\"gadgets\",\n\t\t\t\"dial\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t40\n\t\t]\n\t},\n\tpost_office: {\n\t\ta: \"Japanese Post Office\",\n\t\tb: \"1F3E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"envelope\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t0\n\t\t]\n\t},\n\teuropean_post_office: {\n\t\ta: \"European Post Office\",\n\t\tb: \"1F3E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"email\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t1\n\t\t]\n\t},\n\tsoccer: {\n\t\ta: \"Soccer Ball\",\n\t\tb: \"26BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"football\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t26\n\t\t],\n\t\to: 5\n\t},\n\tboar: {\n\t\ta: \"Boar\",\n\t\tb: \"1F417\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t1\n\t\t]\n\t},\n\tpeanuts: {\n\t\ta: \"Peanuts\",\n\t\tb: \"1F95C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"nut\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t8\n\t\t],\n\t\to: 9\n\t},\n\tcalling: {\n\t\ta: \"Mobile Phone with Rightwards Arrow at Left\",\n\t\tb: \"1F4F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"iphone\",\n\t\t\t\"incoming\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t41\n\t\t]\n\t},\n\tbiohazard_sign: {\n\t\ta: \"Biohazard Sign\",\n\t\tb: \"2623-FE0F\",\n\t\tc: \"2623\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t34\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-bd\": {\n\t\ta: \"Bangladesh Flag\",\n\t\tb: \"1F1E7-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t50\n\t\t]\n\t},\n\tno_mouth: {\n\t\ta: \"Face Without Mouth\",\n\t\tb: \"1F636\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hellokitty\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t26\n\t\t]\n\t},\n\tface_with_rolling_eyes: {\n\t\ta: \"Face with Rolling Eyes\",\n\t\tb: \"1F644\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t31,\n\t\t\t40\n\t\t],\n\t\to: 8\n\t},\n\tphone: {\n\t\ta: \"Black Telephone\",\n\t\tb: \"260E-FE0F\",\n\t\tc: \"260E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"communication\",\n\t\t\t\"dial\",\n\t\t\t\"telephone\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t21\n\t\t],\n\t\tn: [\n\t\t\t\"telephone\"\n\t\t],\n\t\to: 1\n\t},\n\tpig_nose: {\n\t\ta: \"Pig Nose\",\n\t\tb: \"1F43D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"oink\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t39\n\t\t]\n\t},\n\tchestnut: {\n\t\ta: \"Chestnut\",\n\t\tb: \"1F330\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"squirrel\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t38\n\t\t]\n\t},\n\tarrow_up: {\n\t\ta: \"Upwards Black Arrow\",\n\t\tb: \"2B06-FE0F\",\n\t\tc: \"2B06\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"continue\",\n\t\t\t\"top\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t18\n\t\t],\n\t\to: 4\n\t},\n\thospital: {\n\t\ta: \"Hospital\",\n\t\tb: \"1F3E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"health\",\n\t\t\t\"surgery\",\n\t\t\t\"doctor\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-be\": {\n\t\ta: \"Belgium Flag\",\n\t\tb: \"1F1E7-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t0,\n\t\t\t51\n\t\t]\n\t},\n\tbaseball: {\n\t\ta: \"Baseball\",\n\t\tb: \"26BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t27\n\t\t],\n\t\to: 5\n\t},\n\tsmirk: {\n\t\ta: \"Smirking Face\",\n\t\tb: \"1F60F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"smile\",\n\t\t\t\"mean\",\n\t\t\t\"prank\",\n\t\t\t\"smug\",\n\t\t\t\"sarcasm\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t39\n\t\t]\n\t},\n\tarrow_upper_right: {\n\t\ta: \"North East Arrow\",\n\t\tb: \"2197-FE0F\",\n\t\tc: \"2197\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"point\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"northeast\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t36\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-bf\": {\n\t\ta: \"Burkina Faso Flag\",\n\t\tb: \"1F1E7-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t0\n\t\t]\n\t},\n\tbasketball: {\n\t\ta: \"Basketball and Hoop\",\n\t\tb: \"1F3C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\",\n\t\t\t\"NBA\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t26\n\t\t]\n\t},\n\tram: {\n\t\ta: \"Ram\",\n\t\tb: \"1F40F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"sheep\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t45\n\t\t]\n\t},\n\tbank: {\n\t\ta: \"Bank\",\n\t\tb: \"1F3E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"cash\",\n\t\t\t\"business\",\n\t\t\t\"enterprise\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t3\n\t\t]\n\t},\n\tbread: {\n\t\ta: \"Bread\",\n\t\tb: \"1F35E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"wheat\",\n\t\t\t\"breakfast\",\n\t\t\t\"toast\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t32\n\t\t]\n\t},\n\ttelephone_receiver: {\n\t\ta: \"Telephone Receiver\",\n\t\tb: \"1F4DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"communication\",\n\t\t\t\"dial\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t21\n\t\t]\n\t},\n\tcroissant: {\n\t\ta: \"Croissant\",\n\t\tb: \"1F950\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"bread\",\n\t\t\t\"french\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t48\n\t\t],\n\t\to: 9\n\t},\n\tpager: {\n\t\ta: \"Pager\",\n\t\tb: \"1F4DF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bbcall\",\n\t\t\t\"oldschool\",\n\t\t\t\"90s\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t22\n\t\t]\n\t},\n\tsheep: {\n\t\ta: \"Sheep\",\n\t\tb: \"1F411\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"wool\",\n\t\t\t\"shipit\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t47\n\t\t]\n\t},\n\tarrow_right: {\n\t\ta: \"Black Rightwards Arrow\",\n\t\tb: \"27A1-FE0F\",\n\t\tc: \"27A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"next\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t12\n\t\t],\n\t\to: 1\n\t},\n\tpersevere: {\n\t\ta: \"Persevering Face\",\n\t\tb: \"1F623\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sick\",\n\t\t\t\"no\",\n\t\t\t\"upset\",\n\t\t\t\"oops\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t7\n\t\t]\n\t},\n\t\"flag-bg\": {\n\t\ta: \"Bulgaria Flag\",\n\t\tb: \"1F1E7-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\tvolleyball: {\n\t\ta: \"Volleyball\",\n\t\tb: \"1F3D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t33\n\t\t],\n\t\to: 8\n\t},\n\thotel: {\n\t\ta: \"Hotel\",\n\t\tb: \"1F3E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"accomodation\",\n\t\t\t\"checkin\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t5\n\t\t]\n\t},\n\tarrow_lower_right: {\n\t\ta: \"South East Arrow\",\n\t\tb: \"2198-FE0F\",\n\t\tc: \"2198\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"southeast\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t37\n\t\t],\n\t\to: 1\n\t},\n\tgoat: {\n\t\ta: \"Goat\",\n\t\tb: \"1F410\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t46\n\t\t]\n\t},\n\t\"flag-bh\": {\n\t\ta: \"Bahrain Flag\",\n\t\tb: \"1F1E7-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t2\n\t\t]\n\t},\n\tlove_hotel: {\n\t\ta: \"Love Hotel\",\n\t\tb: \"1F3E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"dating\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t6\n\t\t]\n\t},\n\tdisappointed_relieved: {\n\t\ta: \"Disappointed but Relieved Face\",\n\t\tb: \"1F625\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"phew\",\n\t\t\t\"sweat\",\n\t\t\t\"nervous\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t9\n\t\t]\n\t},\n\tbaguette_bread: {\n\t\ta: \"Baguette Bread\",\n\t\tb: \"1F956\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"bread\",\n\t\t\t\"french\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t2\n\t\t],\n\t\to: 9\n\t},\n\tfootball: {\n\t\ta: \"American Football\",\n\t\tb: \"1F3C8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\",\n\t\t\t\"NFL\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t26\n\t\t]\n\t},\n\tfax: {\n\t\ta: \"Fax Machine\",\n\t\tb: \"1F4E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"technology\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t23\n\t\t]\n\t},\n\tconvenience_store: {\n\t\ta: \"Convenience Store\",\n\t\tb: \"1F3EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"shopping\",\n\t\t\t\"groceries\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t7\n\t\t]\n\t},\n\tdromedary_camel: {\n\t\ta: \"Dromedary Camel\",\n\t\tb: \"1F42A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"hot\",\n\t\t\t\"desert\",\n\t\t\t\"hump\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t20\n\t\t]\n\t},\n\tarrow_down: {\n\t\ta: \"Downwards Black Arrow\",\n\t\tb: \"2B07-FE0F\",\n\t\tc: \"2B07\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t19\n\t\t],\n\t\to: 4\n\t},\n\tbattery: {\n\t\ta: \"Battery\",\n\t\tb: \"1F50B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"power\",\n\t\t\t\"energy\",\n\t\t\t\"sustain\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t13\n\t\t]\n\t},\n\trugby_football: {\n\t\ta: \"Rugby Football\",\n\t\tb: \"1F3C9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"team\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t27\n\t\t]\n\t},\n\tpretzel: {\n\t\ta: \"Pretzel\",\n\t\tb: \"1F968\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t20\n\t\t],\n\t\to: 10\n\t},\n\topen_mouth: {\n\t\ta: \"Face with Open Mouth\",\n\t\tb: \"1F62E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"surprise\",\n\t\t\t\"impressed\",\n\t\t\t\"wow\",\n\t\t\t\"whoa\",\n\t\t\t\":O\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t18\n\t\t],\n\t\tl: [\n\t\t\t\":o\",\n\t\t\t\":-o\",\n\t\t\t\":O\",\n\t\t\t\":-O\"\n\t\t]\n\t},\n\t\"flag-bi\": {\n\t\ta: \"Burundi Flag\",\n\t\tb: \"1F1E7-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t3\n\t\t]\n\t},\n\t\"flag-bj\": {\n\t\ta: \"Benin Flag\",\n\t\tb: \"1F1E7-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t4\n\t\t]\n\t},\n\tpancakes: {\n\t\ta: \"Pancakes\",\n\t\tb: \"1F95E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"breakfast\",\n\t\t\t\"flapjacks\",\n\t\t\t\"hotcakes\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t10\n\t\t],\n\t\to: 9\n\t},\n\tschool: {\n\t\ta: \"School\",\n\t\tb: \"1F3EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"student\",\n\t\t\t\"education\",\n\t\t\t\"learn\",\n\t\t\t\"teach\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t8\n\t\t]\n\t},\n\ttennis: {\n\t\ta: \"Tennis Racquet and Ball\",\n\t\tb: \"1F3BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"balls\",\n\t\t\t\"green\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t24\n\t\t]\n\t},\n\tzipper_mouth_face: {\n\t\ta: \"Zipper-Mouth Face\",\n\t\tb: \"1F910\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sealed\",\n\t\t\t\"zipper\",\n\t\t\t\"secret\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t24\n\t\t],\n\t\to: 8\n\t},\n\tcamel: {\n\t\ta: \"Bactrian Camel\",\n\t\tb: \"1F42B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"hot\",\n\t\t\t\"desert\",\n\t\t\t\"hump\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t21\n\t\t]\n\t},\n\tarrow_lower_left: {\n\t\ta: \"South West Arrow\",\n\t\tb: \"2199-FE0F\",\n\t\tc: \"2199\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"southwest\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t38\n\t\t],\n\t\to: 1\n\t},\n\telectric_plug: {\n\t\ta: \"Electric Plug\",\n\t\tb: \"1F50C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"charger\",\n\t\t\t\"power\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t14\n\t\t]\n\t},\n\tcheese_wedge: {\n\t\ta: \"Cheese Wedge\",\n\t\tb: \"1F9C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t48\n\t\t],\n\t\to: 8\n\t},\n\thushed: {\n\t\ta: \"Hushed Face\",\n\t\tb: \"1F62F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"woo\",\n\t\t\t\"shh\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t19\n\t\t]\n\t},\n\tcomputer: {\n\t\ta: \"Personal Computer\",\n\t\tb: \"1F4BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"laptop\",\n\t\t\t\"screen\",\n\t\t\t\"display\",\n\t\t\t\"monitor\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t38\n\t\t]\n\t},\n\tgiraffe_face: {\n\t\ta: \"Giraffe Face\",\n\t\tb: \"1F992\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t42\n\t\t],\n\t\to: 10\n\t},\n\t\"8ball\": {\n\t\ta: \"Billiards\",\n\t\tb: \"1F3B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pool\",\n\t\t\t\"hobby\",\n\t\t\t\"game\",\n\t\t\t\"luck\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t11\n\t\t]\n\t},\n\t\"flag-bl\": {\n\t\ta: \"St. Barthélemy Flag\",\n\t\tb: \"1F1E7-1F1F1\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t5\n\t\t]\n\t},\n\tarrow_left: {\n\t\ta: \"Leftwards Black Arrow\",\n\t\tb: \"2B05-FE0F\",\n\t\tc: \"2B05\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"previous\",\n\t\t\t\"back\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t17\n\t\t],\n\t\to: 4\n\t},\n\tdepartment_store: {\n\t\ta: \"Department Store\",\n\t\tb: \"1F3EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"shopping\",\n\t\t\t\"mall\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t9\n\t\t]\n\t},\n\tmeat_on_bone: {\n\t\ta: \"Meat on Bone\",\n\t\tb: \"1F356\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"good\",\n\t\t\t\"food\",\n\t\t\t\"drumstick\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t24\n\t\t]\n\t},\n\tarrow_upper_left: {\n\t\ta: \"North West Arrow\",\n\t\tb: \"2196-FE0F\",\n\t\tc: \"2196\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"point\",\n\t\t\t\"direction\",\n\t\t\t\"diagonal\",\n\t\t\t\"northwest\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t35\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-bm\": {\n\t\ta: \"Bermuda Flag\",\n\t\tb: \"1F1E7-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t6\n\t\t]\n\t},\n\tsleepy: {\n\t\ta: \"Sleepy Face\",\n\t\tb: \"1F62A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tired\",\n\t\t\t\"rest\",\n\t\t\t\"nap\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t14\n\t\t]\n\t},\n\tbowling: {\n\t\ta: \"Bowling\",\n\t\tb: \"1F3B3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"fun\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t13\n\t\t]\n\t},\n\tfactory: {\n\t\ta: \"Factory\",\n\t\tb: \"1F3ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"industry\",\n\t\t\t\"pollution\",\n\t\t\t\"smoke\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t10\n\t\t]\n\t},\n\tdesktop_computer: {\n\t\ta: \"Desktop Computer\",\n\t\tb: \"1F5A5-FE0F\",\n\t\tc: \"1F5A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"computing\",\n\t\t\t\"screen\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t51\n\t\t],\n\t\to: 7\n\t},\n\telephant: {\n\t\ta: \"Elephant\",\n\t\tb: \"1F418\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"nose\",\n\t\t\t\"th\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t2\n\t\t]\n\t},\n\trhinoceros: {\n\t\ta: \"Rhinoceros\",\n\t\tb: \"1F98F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"horn\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t39\n\t\t],\n\t\to: 9\n\t},\n\tarrow_up_down: {\n\t\ta: \"Up Down Arrow\",\n\t\tb: \"2195-FE0F\",\n\t\tc: \"2195\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"way\",\n\t\t\t\"vertical\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t34\n\t\t],\n\t\to: 1\n\t},\n\tcricket_bat_and_ball: {\n\t\ta: \"Cricket Bat and Ball\",\n\t\tb: \"1F3CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t32\n\t\t],\n\t\to: 8\n\t},\n\tprinter: {\n\t\ta: \"Printer\",\n\t\tb: \"1F5A8-FE0F\",\n\t\tc: \"1F5A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"paper\",\n\t\t\t\"ink\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t0\n\t\t],\n\t\to: 7\n\t},\n\tpoultry_leg: {\n\t\ta: \"Poultry Leg\",\n\t\tb: \"1F357\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"meat\",\n\t\t\t\"drumstick\",\n\t\t\t\"bird\",\n\t\t\t\"chicken\",\n\t\t\t\"turkey\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t25\n\t\t]\n\t},\n\ttired_face: {\n\t\ta: \"Tired Face\",\n\t\tb: \"1F62B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sick\",\n\t\t\t\"whine\",\n\t\t\t\"upset\",\n\t\t\t\"frustrated\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t15\n\t\t]\n\t},\n\tjapanese_castle: {\n\t\ta: \"Japanese Castle\",\n\t\tb: \"1F3EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"building\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t12\n\t\t]\n\t},\n\t\"flag-bn\": {\n\t\ta: \"Brunei Flag\",\n\t\tb: \"1F1E7-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t1,\n\t\t\t7\n\t\t]\n\t},\n\tfield_hockey_stick_and_ball: {\n\t\ta: \"Field Hockey Stick and Ball\",\n\t\tb: \"1F3D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t34\n\t\t],\n\t\to: 8\n\t},\n\tsleeping: {\n\t\ta: \"Sleeping Face\",\n\t\tb: \"1F634\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tired\",\n\t\t\t\"sleepy\",\n\t\t\t\"night\",\n\t\t\t\"zzz\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t24\n\t\t]\n\t},\n\tleft_right_arrow: {\n\t\ta: \"Left Right Arrow\",\n\t\tb: \"2194-FE0F\",\n\t\tc: \"2194\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"direction\",\n\t\t\t\"horizontal\",\n\t\t\t\"sideways\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t33\n\t\t],\n\t\to: 1\n\t},\n\tkeyboard: {\n\t\ta: \"Keyboard\",\n\t\tb: \"2328-FE0F\",\n\t\tc: \"2328\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"computer\",\n\t\t\t\"type\",\n\t\t\t\"input\",\n\t\t\t\"text\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t43\n\t\t],\n\t\to: 1\n\t},\n\teuropean_castle: {\n\t\ta: \"European Castle\",\n\t\tb: \"1F3F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"royalty\",\n\t\t\t\"history\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t13\n\t\t]\n\t},\n\tmouse: {\n\t\ta: \"Mouse Face\",\n\t\tb: \"1F42D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"cheese_wedge\",\n\t\t\t\"rodent\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-bo\": {\n\t\ta: \"Bolivia Flag\",\n\t\tb: \"1F1E7-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t8\n\t\t]\n\t},\n\tcut_of_meat: {\n\t\ta: \"Cut of Meat\",\n\t\tb: \"1F969\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t21\n\t\t],\n\t\to: 10\n\t},\n\tice_hockey_stick_and_puck: {\n\t\ta: \"Ice Hockey Stick and Puck\",\n\t\tb: \"1F3D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t35\n\t\t],\n\t\to: 8\n\t},\n\tmouse2: {\n\t\ta: \"Mouse\",\n\t\tb: \"1F401\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"rodent\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t31\n\t\t]\n\t},\n\tthree_button_mouse: {\n\t\ta: \"Three Button Mouse\",\n\t\tb: \"1F5B1-FE0F\",\n\t\tc: \"1F5B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t1\n\t\t],\n\t\to: 7\n\t},\n\tleftwards_arrow_with_hook: {\n\t\ta: \"Leftwards Arrow with Hook\",\n\t\tb: \"21A9-FE0F\",\n\t\tc: \"21A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"back\",\n\t\t\t\"return\",\n\t\t\t\"blue-square\",\n\t\t\t\"undo\",\n\t\t\t\"enter\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t39\n\t\t],\n\t\to: 1\n\t},\n\tbacon: {\n\t\ta: \"Bacon\",\n\t\tb: \"1F953\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"breakfast\",\n\t\t\t\"pork\",\n\t\t\t\"pig\",\n\t\t\t\"meat\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t51\n\t\t],\n\t\to: 9\n\t},\n\trelieved: {\n\t\ta: \"Relieved Face\",\n\t\tb: \"1F60C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"relaxed\",\n\t\t\t\"phew\",\n\t\t\t\"massage\",\n\t\t\t\"happiness\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-bq\": {\n\t\ta: \"Caribbean Netherlands Flag\",\n\t\tb: \"1F1E7-1F1F6\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t9\n\t\t]\n\t},\n\twedding: {\n\t\ta: \"Wedding\",\n\t\tb: \"1F492\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"couple\",\n\t\t\t\"marriage\",\n\t\t\t\"bride\",\n\t\t\t\"groom\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t44\n\t\t]\n\t},\n\ttokyo_tower: {\n\t\ta: \"Tokyo Tower\",\n\t\tb: \"1F5FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t20\n\t\t]\n\t},\n\tarrow_right_hook: {\n\t\ta: \"Rightwards Arrow with Hook\",\n\t\tb: \"21AA-FE0F\",\n\t\tc: \"21AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"return\",\n\t\t\t\"rotate\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t40\n\t\t],\n\t\to: 1\n\t},\n\thamburger: {\n\t\ta: \"Hamburger\",\n\t\tb: \"1F354\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"meat\",\n\t\t\t\"fast food\",\n\t\t\t\"beef\",\n\t\t\t\"cheeseburger\",\n\t\t\t\"mcdonalds\",\n\t\t\t\"burger king\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t22\n\t\t]\n\t},\n\tstuck_out_tongue: {\n\t\ta: \"Face with Stuck-out Tongue\",\n\t\tb: \"1F61B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"prank\",\n\t\t\t\"childish\",\n\t\t\t\"playful\",\n\t\t\t\"mischievous\",\n\t\t\t\"smile\",\n\t\t\t\"tongue\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t51\n\t\t],\n\t\tl: [\n\t\t\t\":p\",\n\t\t\t\":-p\",\n\t\t\t\":P\",\n\t\t\t\":-P\",\n\t\t\t\":b\",\n\t\t\t\":-b\"\n\t\t],\n\t\tm: \":p\"\n\t},\n\ttrackball: {\n\t\ta: \"Trackball\",\n\t\tb: \"1F5B2-FE0F\",\n\t\tc: \"1F5B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"trackpad\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t2\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-br\": {\n\t\ta: \"Brazil Flag\",\n\t\tb: \"1F1E7-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t10\n\t\t]\n\t},\n\trat: {\n\t\ta: \"Rat\",\n\t\tb: \"1F400\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"mouse\",\n\t\t\t\"rodent\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t30\n\t\t]\n\t},\n\ttable_tennis_paddle_and_ball: {\n\t\ta: \"Table Tennis Paddle and Ball\",\n\t\tb: \"1F3D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t36\n\t\t],\n\t\to: 8\n\t},\n\tminidisc: {\n\t\ta: \"Minidisc\",\n\t\tb: \"1F4BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"record\",\n\t\t\t\"data\",\n\t\t\t\"disk\",\n\t\t\t\"90s\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t40\n\t\t]\n\t},\n\tstuck_out_tongue_winking_eye: {\n\t\ta: \"Face with Stuck-out Tongue and Winking Eye\",\n\t\tb: \"1F61C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"prank\",\n\t\t\t\"childish\",\n\t\t\t\"playful\",\n\t\t\t\"mischievous\",\n\t\t\t\"smile\",\n\t\t\t\"wink\",\n\t\t\t\"tongue\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t0\n\t\t],\n\t\tl: [\n\t\t\t\";p\",\n\t\t\t\";-p\",\n\t\t\t\";b\",\n\t\t\t\";-b\",\n\t\t\t\";P\",\n\t\t\t\";-P\"\n\t\t],\n\t\tm: \";p\"\n\t},\n\tfries: {\n\t\ta: \"French Fries\",\n\t\tb: \"1F35F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chips\",\n\t\t\t\"snack\",\n\t\t\t\"fast food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t33\n\t\t]\n\t},\n\tbadminton_racquet_and_shuttlecock: {\n\t\ta: \"Badminton Racquet and Shuttlecock\",\n\t\tb: \"1F3F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t22\n\t\t],\n\t\to: 8\n\t},\n\tstatue_of_liberty: {\n\t\ta: \"Statue of Liberty\",\n\t\tb: \"1F5FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"american\",\n\t\t\t\"newyork\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-bs\": {\n\t\ta: \"Bahamas Flag\",\n\t\tb: \"1F1E7-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t11\n\t\t]\n\t},\n\tarrow_heading_up: {\n\t\ta: \"Arrow Pointing Rightwards Then Curving Upwards\",\n\t\tb: \"2934-FE0F\",\n\t\tc: \"2934\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t15\n\t\t],\n\t\to: 3\n\t},\n\thamster: {\n\t\ta: \"Hamster Face\",\n\t\tb: \"1F439\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t35\n\t\t]\n\t},\n\tstuck_out_tongue_closed_eyes: {\n\t\ta: \"Face with Stuck-out Tongue and Tightly-Closed Eyes\",\n\t\tb: \"1F61D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"prank\",\n\t\t\t\"playful\",\n\t\t\t\"mischievous\",\n\t\t\t\"smile\",\n\t\t\t\"tongue\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t1\n\t\t]\n\t},\n\tpizza: {\n\t\ta: \"Slice of Pizza\",\n\t\tb: \"1F355\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"party\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t23\n\t\t]\n\t},\n\tboxing_glove: {\n\t\ta: \"Boxing Glove\",\n\t\tb: \"1F94A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"fighting\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t45\n\t\t],\n\t\to: 9\n\t},\n\tfloppy_disk: {\n\t\ta: \"Floppy Disk\",\n\t\tb: \"1F4BE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"oldschool\",\n\t\t\t\"technology\",\n\t\t\t\"save\",\n\t\t\t\"90s\",\n\t\t\t\"80s\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t41\n\t\t]\n\t},\n\tarrow_heading_down: {\n\t\ta: \"Arrow Pointing Rightwards Then Curving Downwards\",\n\t\tb: \"2935-FE0F\",\n\t\tc: \"2935\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t16\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-bt\": {\n\t\ta: \"Bhutan Flag\",\n\t\tb: \"1F1E7-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t12\n\t\t]\n\t},\n\trabbit: {\n\t\ta: \"Rabbit Face\",\n\t\tb: \"1F430\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"pet\",\n\t\t\t\"spring\",\n\t\t\t\"magic\",\n\t\t\t\"bunny\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t26\n\t\t]\n\t},\n\tchurch: {\n\t\ta: \"Church\",\n\t\tb: \"26EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"building\",\n\t\t\t\"religion\",\n\t\t\t\"christ\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t37\n\t\t],\n\t\to: 5\n\t},\n\tdrooling_face: {\n\t\ta: \"Drooling Face\",\n\t\tb: \"1F924\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t27\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-bv\": {\n\t\ta: \"Bouvet Island Flag\",\n\t\tb: \"1F1E7-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t13\n\t\t]\n\t},\n\tmosque: {\n\t\ta: \"Mosque\",\n\t\tb: \"1F54C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"islam\",\n\t\t\t\"worship\",\n\t\t\t\"minaret\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t15\n\t\t],\n\t\to: 8\n\t},\n\trabbit2: {\n\t\ta: \"Rabbit\",\n\t\tb: \"1F407\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"pet\",\n\t\t\t\"magic\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t37\n\t\t]\n\t},\n\thotdog: {\n\t\ta: \"Hot Dog\",\n\t\tb: \"1F32D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"frankfurter\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t35\n\t\t],\n\t\to: 8\n\t},\n\tmartial_arts_uniform: {\n\t\ta: \"Martial Arts Uniform\",\n\t\tb: \"1F94B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"judo\",\n\t\t\t\"karate\",\n\t\t\t\"taekwondo\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t46\n\t\t],\n\t\to: 9\n\t},\n\tarrows_clockwise: {\n\t\ta: \"Clockwise Downwards and Upwards Open Circle Arrows\",\n\t\tb: \"1F503\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sync\",\n\t\t\t\"cycle\",\n\t\t\t\"round\",\n\t\t\t\"repeat\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t5\n\t\t]\n\t},\n\tcd: {\n\t\ta: \"Optical Disc\",\n\t\tb: \"1F4BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"dvd\",\n\t\t\t\"disk\",\n\t\t\t\"disc\",\n\t\t\t\"90s\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t42\n\t\t]\n\t},\n\tarrows_counterclockwise: {\n\t\ta: \"Anticlockwise Downwards and Upwards Open Circle Arrows\",\n\t\tb: \"1F504\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"sync\",\n\t\t\t\"cycle\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t6\n\t\t]\n\t},\n\tsandwich: {\n\t\ta: \"Sandwich\",\n\t\tb: \"1F96A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\tchipmunk: {\n\t\ta: \"Chipmunk\",\n\t\tb: \"1F43F-FE0F\",\n\t\tc: \"1F43F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"rodent\",\n\t\t\t\"squirrel\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t41\n\t\t],\n\t\to: 7\n\t},\n\tsynagogue: {\n\t\ta: \"Synagogue\",\n\t\tb: \"1F54D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"judaism\",\n\t\t\t\"worship\",\n\t\t\t\"temple\",\n\t\t\t\"jewish\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t16\n\t\t],\n\t\to: 8\n\t},\n\tunamused: {\n\t\ta: \"Unamused Face\",\n\t\tb: \"1F612\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"indifference\",\n\t\t\t\"bored\",\n\t\t\t\"straight face\",\n\t\t\t\"serious\",\n\t\t\t\"sarcasm\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t42\n\t\t],\n\t\tm: \":(\"\n\t},\n\tgoal_net: {\n\t\ta: \"Goal Net\",\n\t\tb: \"1F945\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t41\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-bw\": {\n\t\ta: \"Botswana Flag\",\n\t\tb: \"1F1E7-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t14\n\t\t]\n\t},\n\tdvd: {\n\t\ta: \"Dvd\",\n\t\tb: \"1F4C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cd\",\n\t\t\t\"disk\",\n\t\t\t\"disc\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t43\n\t\t]\n\t},\n\thedgehog: {\n\t\ta: \"Hedgehog\",\n\t\tb: \"1F994\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t44\n\t\t],\n\t\to: 10\n\t},\n\tdart: {\n\t\ta: \"Direct Hit\",\n\t\tb: \"1F3AF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"play\",\n\t\t\t\"bar\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t9\n\t\t]\n\t},\n\ttaco: {\n\t\ta: \"Taco\",\n\t\tb: \"1F32E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"mexican\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t36\n\t\t],\n\t\to: 8\n\t},\n\tback: {\n\t\ta: \"Back with Leftwards Arrow Above\",\n\t\tb: \"1F519\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"words\",\n\t\t\t\"return\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t27\n\t\t]\n\t},\n\t\"flag-by\": {\n\t\ta: \"Belarus Flag\",\n\t\tb: \"1F1E7-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t15\n\t\t]\n\t},\n\tshinto_shrine: {\n\t\ta: \"Shinto Shrine\",\n\t\tb: \"26E9-FE0F\",\n\t\tc: \"26E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"temple\",\n\t\t\t\"japan\",\n\t\t\t\"kyoto\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t36\n\t\t],\n\t\to: 5\n\t},\n\tmovie_camera: {\n\t\ta: \"Movie Camera\",\n\t\tb: \"1F3A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"film\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t51\n\t\t]\n\t},\n\tsweat: {\n\t\ta: \"Face with Cold Sweat\",\n\t\tb: \"1F613\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hot\",\n\t\t\t\"sad\",\n\t\t\t\"tired\",\n\t\t\t\"exercise\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t43\n\t\t]\n\t},\n\tburrito: {\n\t\ta: \"Burrito\",\n\t\tb: \"1F32F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"mexican\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t37\n\t\t],\n\t\to: 8\n\t},\n\t\"flag-bz\": {\n\t\ta: \"Belize Flag\",\n\t\tb: \"1F1E7-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t16\n\t\t]\n\t},\n\tpensive: {\n\t\ta: \"Pensive Face\",\n\t\tb: \"1F614\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sad\",\n\t\t\t\"depressed\",\n\t\t\t\"upset\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t44\n\t\t]\n\t},\n\tkaaba: {\n\t\ta: \"Kaaba\",\n\t\tb: \"1F54B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"mecca\",\n\t\t\t\"mosque\",\n\t\t\t\"islam\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t14\n\t\t],\n\t\to: 8\n\t},\n\tfilm_frames: {\n\t\ta: \"Film Frames\",\n\t\tb: \"1F39E-FE0F\",\n\t\tc: \"1F39E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tbat: {\n\t\ta: \"Bat\",\n\t\tb: \"1F987\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"blind\",\n\t\t\t\"vampire\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t31\n\t\t],\n\t\to: 9\n\t},\n\tgolf: {\n\t\ta: \"Flag in Hole\",\n\t\tb: \"26F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"business\",\n\t\t\t\"flag\",\n\t\t\t\"hole\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t41\n\t\t],\n\t\to: 5\n\t},\n\tend: {\n\t\ta: \"End with Leftwards Arrow Above\",\n\t\tb: \"1F51A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"arrow\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t28\n\t\t]\n\t},\n\tfilm_projector: {\n\t\ta: \"Film Projector\",\n\t\tb: \"1F4FD-FE0F\",\n\t\tc: \"1F4FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"video\",\n\t\t\t\"tape\",\n\t\t\t\"record\",\n\t\t\t\"movie\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t0\n\t\t],\n\t\to: 7\n\t},\n\tbear: {\n\t\ta: \"Bear Face\",\n\t\tb: \"1F43B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"wild\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t37\n\t\t]\n\t},\n\tice_skate: {\n\t\ta: \"Ice Skate\",\n\t\tb: \"26F8-FE0F\",\n\t\tc: \"26F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t45\n\t\t],\n\t\to: 5\n\t},\n\tfountain: {\n\t\ta: \"Fountain\",\n\t\tb: \"26F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"summer\",\n\t\t\t\"water\",\n\t\t\t\"fresh\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t40\n\t\t],\n\t\to: 5\n\t},\n\tconfused: {\n\t\ta: \"Confused Face\",\n\t\tb: \"1F615\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"indifference\",\n\t\t\t\"huh\",\n\t\t\t\"weird\",\n\t\t\t\"hmmm\",\n\t\t\t\":/\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t45\n\t\t],\n\t\tl: [\n\t\t\t\":\\\\\",\n\t\t\t\":-\\\\\",\n\t\t\t\":/\",\n\t\t\t\":-/\"\n\t\t]\n\t},\n\t\"flag-ca\": {\n\t\ta: \"Canada Flag\",\n\t\tb: \"1F1E8-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t17\n\t\t]\n\t},\n\ton: {\n\t\ta: \"On with Exclamation Mark with Left Right Arrow Above\",\n\t\tb: \"1F51B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t29\n\t\t]\n\t},\n\tstuffed_flatbread: {\n\t\ta: \"Stuffed Flatbread\",\n\t\tb: \"1F959\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"flatbread\",\n\t\t\t\"stuffed\",\n\t\t\t\"gyro\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t5\n\t\t],\n\t\to: 9\n\t},\n\tsoon: {\n\t\ta: \"Soon with Rightwards Arrow Above\",\n\t\tb: \"1F51C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t30\n\t\t]\n\t},\n\tupside_down_face: {\n\t\ta: \"Upside-Down Face\",\n\t\tb: \"1F643\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"flipped\",\n\t\t\t\"silly\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t39\n\t\t],\n\t\to: 8\n\t},\n\tfishing_pole_and_fish: {\n\t\ta: \"Fishing Pole and Fish\",\n\t\tb: \"1F3A3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"hobby\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t49\n\t\t]\n\t},\n\ttent: {\n\t\ta: \"Tent\",\n\t\tb: \"26FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"camping\",\n\t\t\t\"outdoors\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t12\n\t\t],\n\t\to: 5\n\t},\n\tclapper: {\n\t\ta: \"Clapper Board\",\n\t\tb: \"1F3AC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"movie\",\n\t\t\t\"film\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t6\n\t\t]\n\t},\n\tegg: {\n\t\ta: \"Egg\",\n\t\tb: \"1F95A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"chicken\",\n\t\t\t\"breakfast\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-cc\": {\n\t\ta: \"Cocos (keeling) Islands Flag\",\n\t\tb: \"1F1E8-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t18\n\t\t]\n\t},\n\tkoala: {\n\t\ta: \"Koala\",\n\t\tb: \"1F428\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t18\n\t\t]\n\t},\n\tfoggy: {\n\t\ta: \"Foggy\",\n\t\tb: \"1F301\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"mountain\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t45\n\t\t]\n\t},\n\ttv: {\n\t\ta: \"Television\",\n\t\tb: \"1F4FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"technology\",\n\t\t\t\"program\",\n\t\t\t\"oldschool\",\n\t\t\t\"show\",\n\t\t\t\"television\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t49\n\t\t]\n\t},\n\tpanda_face: {\n\t\ta: \"Panda Face\",\n\t\tb: \"1F43C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"panda\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t38\n\t\t]\n\t},\n\tfried_egg: {\n\t\ta: \"Cooking\",\n\t\tb: \"1F373\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"breakfast\",\n\t\t\t\"kitchen\",\n\t\t\t\"egg\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t1\n\t\t],\n\t\tn: [\n\t\t\t\"cooking\"\n\t\t]\n\t},\n\ttop: {\n\t\ta: \"Top with Upwards Arrow Above\",\n\t\tb: \"1F51D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t31\n\t\t]\n\t},\n\t\"flag-cd\": {\n\t\ta: \"Congo - Kinshasa Flag\",\n\t\tb: \"1F1E8-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t19\n\t\t]\n\t},\n\tmoney_mouth_face: {\n\t\ta: \"Money-Mouth Face\",\n\t\tb: \"1F911\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"rich\",\n\t\t\t\"dollar\",\n\t\t\t\"money\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t25\n\t\t],\n\t\to: 8\n\t},\n\trunning_shirt_with_sash: {\n\t\ta: \"Running Shirt with Sash\",\n\t\tb: \"1F3BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"play\",\n\t\t\t\"pageant\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t23\n\t\t]\n\t},\n\tastonished: {\n\t\ta: \"Astonished Face\",\n\t\tb: \"1F632\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"xox\",\n\t\t\t\"surprised\",\n\t\t\t\"poisoned\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t22\n\t\t]\n\t},\n\tfeet: {\n\t\ta: \"Paw Prints\",\n\t\tb: \"1F43E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t13,\n\t\t\t40\n\t\t],\n\t\tn: [\n\t\t\t\"paw_prints\"\n\t\t]\n\t},\n\tcamera: {\n\t\ta: \"Camera\",\n\t\tb: \"1F4F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"gadgets\",\n\t\t\t\"photography\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t46\n\t\t]\n\t},\n\t\"flag-cf\": {\n\t\ta: \"Central African Republic Flag\",\n\t\tb: \"1F1E8-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t20\n\t\t]\n\t},\n\tplace_of_worship: {\n\t\ta: \"Place of Worship\",\n\t\tb: \"1F6D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"religion\",\n\t\t\t\"church\",\n\t\t\t\"temple\",\n\t\t\t\"prayer\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t5\n\t\t],\n\t\to: 8\n\t},\n\tnight_with_stars: {\n\t\ta: \"Night with Stars\",\n\t\tb: \"1F303\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"evening\",\n\t\t\t\"city\",\n\t\t\t\"downtown\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t47\n\t\t]\n\t},\n\tski: {\n\t\ta: \"Ski and Ski Boot\",\n\t\tb: \"1F3BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"winter\",\n\t\t\t\"cold\",\n\t\t\t\"snow\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t25\n\t\t]\n\t},\n\tshallow_pan_of_food: {\n\t\ta: \"Shallow Pan of Food\",\n\t\tb: \"1F958\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"cooking\",\n\t\t\t\"casserole\",\n\t\t\t\"paella\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t4\n\t\t],\n\t\to: 9\n\t},\n\tcamera_with_flash: {\n\t\ta: \"Camera with Flash\",\n\t\tb: \"1F4F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t26,\n\t\t\t47\n\t\t],\n\t\to: 7\n\t},\n\tsunrise_over_mountains: {\n\t\ta: \"Sunrise over Mountains\",\n\t\tb: \"1F304\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"view\",\n\t\t\t\"vacation\",\n\t\t\t\"photo\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t48\n\t\t]\n\t},\n\tturkey: {\n\t\ta: \"Turkey\",\n\t\tb: \"1F983\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t27\n\t\t],\n\t\to: 8\n\t},\n\twhite_frowning_face: {\n\t\ta: \"White Frowning Face\",\n\t\tb: \"2639-FE0F\",\n\t\tc: \"2639\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t40\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-cg\": {\n\t\ta: \"Congo - Brazzaville Flag\",\n\t\tb: \"1F1E8-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t21\n\t\t]\n\t},\n\tstew: {\n\t\ta: \"Pot of Food\",\n\t\tb: \"1F372\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"meat\",\n\t\t\t\"soup\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t0\n\t\t]\n\t},\n\tsled: {\n\t\ta: \"Sled\",\n\t\tb: \"1F6F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\tatom_symbol: {\n\t\ta: \"Atom Symbol\",\n\t\tb: \"269B-FE0F\",\n\t\tc: \"269B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"science\",\n\t\t\t\"physics\",\n\t\t\t\"chemistry\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t18\n\t\t],\n\t\to: 4\n\t},\n\tcurling_stone: {\n\t\ta: \"Curling Stone\",\n\t\tb: \"1F94C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t47\n\t\t],\n\t\to: 10\n\t},\n\tslightly_frowning_face: {\n\t\ta: \"Slightly Frowning Face\",\n\t\tb: \"1F641\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"frowning\",\n\t\t\t\"disappointed\",\n\t\t\t\"sad\",\n\t\t\t\"upset\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t37\n\t\t],\n\t\to: 7\n\t},\n\tsunrise: {\n\t\ta: \"Sunrise\",\n\t\tb: \"1F305\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"morning\",\n\t\t\t\"view\",\n\t\t\t\"vacation\",\n\t\t\t\"photo\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t49\n\t\t]\n\t},\n\tom_symbol: {\n\t\ta: \"Om Symbol\",\n\t\tb: \"1F549-FE0F\",\n\t\tc: \"1F549\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\tchicken: {\n\t\ta: \"Chicken\",\n\t\tb: \"1F414\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cluck\",\n\t\t\t\"nature\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t50\n\t\t]\n\t},\n\tbowl_with_spoon: {\n\t\ta: \"Bowl with Spoon\",\n\t\tb: \"1F963\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t15\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-ch\": {\n\t\ta: \"Switzerland Flag\",\n\t\tb: \"1F1E8-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t22\n\t\t]\n\t},\n\tvideo_camera: {\n\t\ta: \"Video Camera\",\n\t\tb: \"1F4F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"film\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t48\n\t\t]\n\t},\n\tvideo_game: {\n\t\ta: \"Video Game\",\n\t\tb: \"1F3AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"play\",\n\t\t\t\"console\",\n\t\t\t\"PS4\",\n\t\t\t\"controller\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t8\n\t\t]\n\t},\n\trooster: {\n\t\ta: \"Rooster\",\n\t\tb: \"1F413\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"chicken\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t49\n\t\t]\n\t},\n\tvhs: {\n\t\ta: \"Videocassette\",\n\t\tb: \"1F4FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"record\",\n\t\t\t\"video\",\n\t\t\t\"oldschool\",\n\t\t\t\"90s\",\n\t\t\t\"80s\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t51\n\t\t]\n\t},\n\tcity_sunset: {\n\t\ta: \"Cityscape at Dusk\",\n\t\tb: \"1F306\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"evening\",\n\t\t\t\"sky\",\n\t\t\t\"buildings\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t50\n\t\t]\n\t},\n\tconfounded: {\n\t\ta: \"Confounded Face\",\n\t\tb: \"1F616\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"confused\",\n\t\t\t\"sick\",\n\t\t\t\"unwell\",\n\t\t\t\"oops\",\n\t\t\t\":S\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t46\n\t\t]\n\t},\n\tgreen_salad: {\n\t\ta: \"Green Salad\",\n\t\tb: \"1F957\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"healthy\",\n\t\t\t\"lettuce\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t3\n\t\t],\n\t\to: 9\n\t},\n\tstar_of_david: {\n\t\ta: \"Star of David\",\n\t\tb: \"2721-FE0F\",\n\t\tc: \"2721\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"judaism\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t47\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ci\": {\n\t\ta: \"Côte D’ivoire Flag\",\n\t\tb: \"1F1E8-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t23\n\t\t]\n\t},\n\tpopcorn: {\n\t\ta: \"Popcorn\",\n\t\tb: \"1F37F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"movie theater\",\n\t\t\t\"films\",\n\t\t\t\"snack\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t13\n\t\t],\n\t\to: 8\n\t},\n\tcity_sunrise: {\n\t\ta: \"Sunset over Buildings\",\n\t\tb: \"1F307\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"good morning\",\n\t\t\t\"dawn\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t51\n\t\t]\n\t},\n\tdisappointed: {\n\t\ta: \"Disappointed Face\",\n\t\tb: \"1F61E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sad\",\n\t\t\t\"upset\",\n\t\t\t\"depressed\",\n\t\t\t\":(\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t2\n\t\t],\n\t\tl: [\n\t\t\t\"):\",\n\t\t\t\":(\",\n\t\t\t\":-(\"\n\t\t],\n\t\tm: \":(\"\n\t},\n\tmag: {\n\t\ta: \"Left-Pointing Magnifying Glass\",\n\t\tb: \"1F50D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"search\",\n\t\t\t\"zoom\",\n\t\t\t\"find\",\n\t\t\t\"detective\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t15\n\t\t]\n\t},\n\thatching_chick: {\n\t\ta: \"Hatching Chick\",\n\t\tb: \"1F423\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"chicken\",\n\t\t\t\"egg\",\n\t\t\t\"born\",\n\t\t\t\"baby\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t13\n\t\t]\n\t},\n\tjoystick: {\n\t\ta: \"Joystick\",\n\t\tb: \"1F579-FE0F\",\n\t\tc: \"1F579\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t20\n\t\t],\n\t\to: 7\n\t},\n\twheel_of_dharma: {\n\t\ta: \"Wheel of Dharma\",\n\t\tb: \"2638-FE0F\",\n\t\tc: \"2638\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hinduism\",\n\t\t\t\"buddhism\",\n\t\t\t\"sikhism\",\n\t\t\t\"jainism\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t39\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ck\": {\n\t\ta: \"Cook Islands Flag\",\n\t\tb: \"1F1E8-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t24\n\t\t]\n\t},\n\tcanned_food: {\n\t\ta: \"Canned Food\",\n\t\tb: \"1F96B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t23\n\t\t],\n\t\to: 10\n\t},\n\tworried: {\n\t\ta: \"Worried Face\",\n\t\tb: \"1F61F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"concern\",\n\t\t\t\"nervous\",\n\t\t\t\":(\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t3\n\t\t]\n\t},\n\tbaby_chick: {\n\t\ta: \"Baby Chick\",\n\t\tb: \"1F424\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"chicken\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t14\n\t\t]\n\t},\n\t\"flag-cl\": {\n\t\ta: \"Chile Flag\",\n\t\tb: \"1F1E8-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t25\n\t\t]\n\t},\n\tgame_die: {\n\t\ta: \"Game Die\",\n\t\tb: \"1F3B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dice\",\n\t\t\t\"random\",\n\t\t\t\"tabletop\",\n\t\t\t\"play\",\n\t\t\t\"luck\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t12\n\t\t]\n\t},\n\tmag_right: {\n\t\ta: \"Right-Pointing Magnifying Glass\",\n\t\tb: \"1F50E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"search\",\n\t\t\t\"zoom\",\n\t\t\t\"find\",\n\t\t\t\"detective\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t16\n\t\t]\n\t},\n\tyin_yang: {\n\t\ta: \"Yin Yang\",\n\t\tb: \"262F-FE0F\",\n\t\tc: \"262F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"balance\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t38\n\t\t],\n\t\to: 1\n\t},\n\tbridge_at_night: {\n\t\ta: \"Bridge at Night\",\n\t\tb: \"1F309\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"sanfrancisco\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t1\n\t\t]\n\t},\n\tspades: {\n\t\ta: \"Black Spade Suit\",\n\t\tb: \"2660-FE0F\",\n\t\tc: \"2660\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"suits\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t4\n\t\t],\n\t\to: 1\n\t},\n\thatched_chick: {\n\t\ta: \"Front-Facing Baby Chick\",\n\t\tb: \"1F425\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"chicken\",\n\t\t\t\"baby\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-cm\": {\n\t\ta: \"Cameroon Flag\",\n\t\tb: \"1F1E8-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t26\n\t\t]\n\t},\n\tlatin_cross: {\n\t\ta: \"Latin Cross\",\n\t\tb: \"271D-FE0F\",\n\t\tc: \"271D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"christianity\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t46\n\t\t],\n\t\to: 1\n\t},\n\ttriumph: {\n\t\ta: \"Face with Look of Triumph\",\n\t\tb: \"1F624\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"gas\",\n\t\t\t\"phew\",\n\t\t\t\"proud\",\n\t\t\t\"pride\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t8\n\t\t]\n\t},\n\thotsprings: {\n\t\ta: \"Hot Springs\",\n\t\tb: \"2668-FE0F\",\n\t\tc: \"2668\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bath\",\n\t\t\t\"warm\",\n\t\t\t\"relax\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t8\n\t\t],\n\t\to: 1\n\t},\n\tbento: {\n\t\ta: \"Bento Box\",\n\t\tb: \"1F371\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\",\n\t\t\t\"box\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t51\n\t\t]\n\t},\n\tmicroscope: {\n\t\ta: \"Microscope\",\n\t\tb: \"1F52C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"laboratory\",\n\t\t\t\"experiment\",\n\t\t\t\"zoomin\",\n\t\t\t\"science\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t46\n\t\t]\n\t},\n\tcry: {\n\t\ta: \"Crying Face\",\n\t\tb: \"1F622\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tears\",\n\t\t\t\"sad\",\n\t\t\t\"depressed\",\n\t\t\t\"upset\",\n\t\t\t\":'(\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t6\n\t\t],\n\t\tl: [\n\t\t\t\":'(\"\n\t\t],\n\t\tm: \":'(\"\n\t},\n\tbird: {\n\t\ta: \"Bird\",\n\t\tb: \"1F426\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"fly\",\n\t\t\t\"tweet\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t16\n\t\t]\n\t},\n\tcn: {\n\t\ta: \"China Flag\",\n\t\tb: \"1F1E8-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"china\",\n\t\t\t\"chinese\",\n\t\t\t\"prc\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"nation\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t1,\n\t\t\t27\n\t\t],\n\t\tn: [\n\t\t\t\"flag-cn\"\n\t\t]\n\t},\n\ttelescope: {\n\t\ta: \"Telescope\",\n\t\tb: \"1F52D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"space\",\n\t\t\t\"zoom\",\n\t\t\t\"science\",\n\t\t\t\"astronomy\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t47\n\t\t]\n\t},\n\trice_cracker: {\n\t\ta: \"Rice Cracker\",\n\t\tb: \"1F358\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t26\n\t\t]\n\t},\n\thearts: {\n\t\ta: \"Black Heart Suit\",\n\t\tb: \"2665-FE0F\",\n\t\tc: \"2665\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"magic\",\n\t\t\t\"suits\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t6\n\t\t],\n\t\to: 1\n\t},\n\torthodox_cross: {\n\t\ta: \"Orthodox Cross\",\n\t\tb: \"2626-FE0F\",\n\t\tc: \"2626\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"suppedaneum\",\n\t\t\t\"religion\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t35\n\t\t],\n\t\to: 1\n\t},\n\tmilky_way: {\n\t\ta: \"Milky Way\",\n\t\tb: \"1F30C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"space\",\n\t\t\t\"stars\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t4\n\t\t]\n\t},\n\trice_ball: {\n\t\ta: \"Rice Ball\",\n\t\tb: \"1F359\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t27\n\t\t]\n\t},\n\tsatellite_antenna: {\n\t\ta: \"Satellite Antenna\",\n\t\tb: \"1F4E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t26,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-co\": {\n\t\ta: \"Colombia Flag\",\n\t\tb: \"1F1E8-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t28\n\t\t]\n\t},\n\tcarousel_horse: {\n\t\ta: \"Carousel Horse\",\n\t\tb: \"1F3A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"carnival\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t46\n\t\t]\n\t},\n\tsob: {\n\t\ta: \"Loudly Crying Face\",\n\t\tb: \"1F62D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cry\",\n\t\t\t\"tears\",\n\t\t\t\"sad\",\n\t\t\t\"upset\",\n\t\t\t\"depressed\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t17\n\t\t],\n\t\tm: \":'(\"\n\t},\n\tdiamonds: {\n\t\ta: \"Black Diamond Suit\",\n\t\tb: \"2666-FE0F\",\n\t\tc: \"2666\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"magic\",\n\t\t\t\"suits\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t7\n\t\t],\n\t\to: 1\n\t},\n\tstar_and_crescent: {\n\t\ta: \"Star and Crescent\",\n\t\tb: \"262A-FE0F\",\n\t\tc: \"262A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"islam\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t36\n\t\t],\n\t\to: 1\n\t},\n\tpenguin: {\n\t\ta: \"Penguin\",\n\t\tb: \"1F427\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t17\n\t\t]\n\t},\n\tdove_of_peace: {\n\t\ta: \"Dove of Peace\",\n\t\tb: \"1F54A-FE0F\",\n\t\tc: \"1F54A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t13\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-cp\": {\n\t\ta: \"Clipperton Island Flag\",\n\t\tb: \"1F1E8-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t1,\n\t\t\t29\n\t\t]\n\t},\n\tferris_wheel: {\n\t\ta: \"Ferris Wheel\",\n\t\tb: \"1F3A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"photo\",\n\t\t\t\"carnival\",\n\t\t\t\"londoneye\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t47\n\t\t]\n\t},\n\tclubs: {\n\t\ta: \"Black Club Suit\",\n\t\tb: \"2663-FE0F\",\n\t\tc: \"2663\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"magic\",\n\t\t\t\"suits\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t5\n\t\t],\n\t\to: 1\n\t},\n\tpeace_symbol: {\n\t\ta: \"Peace Symbol\",\n\t\tb: \"262E-FE0F\",\n\t\tc: \"262E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hippie\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t37\n\t\t],\n\t\to: 1\n\t},\n\tcandle: {\n\t\ta: \"Candle\",\n\t\tb: \"1F56F-FE0F\",\n\t\tc: \"1F56F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fire\",\n\t\t\t\"wax\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t42\n\t\t],\n\t\to: 7\n\t},\n\tfrowning: {\n\t\ta: \"Frowning Face with Open Mouth\",\n\t\tb: \"1F626\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"aw\",\n\t\t\t\"what\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t10\n\t\t]\n\t},\n\trice: {\n\t\ta: \"Cooked Rice\",\n\t\tb: \"1F35A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"china\",\n\t\t\t\"asian\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-cr\": {\n\t\ta: \"Costa Rica Flag\",\n\t\tb: \"1F1E8-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t30\n\t\t]\n\t},\n\troller_coaster: {\n\t\ta: \"Roller Coaster\",\n\t\tb: \"1F3A2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"carnival\",\n\t\t\t\"playground\",\n\t\t\t\"photo\",\n\t\t\t\"fun\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t48\n\t\t]\n\t},\n\tmenorah_with_nine_branches: {\n\t\ta: \"Menorah with Nine Branches\",\n\t\tb: \"1F54E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t17\n\t\t],\n\t\to: 8\n\t},\n\tblack_joker: {\n\t\ta: \"Playing Card Black Joker\",\n\t\tb: \"1F0CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"poker\",\n\t\t\t\"cards\",\n\t\t\t\"game\",\n\t\t\t\"play\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t15\n\t\t]\n\t},\n\teagle: {\n\t\ta: \"Eagle\",\n\t\tb: \"1F985\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"bird\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t29\n\t\t],\n\t\to: 9\n\t},\n\tcurry: {\n\t\ta: \"Curry and Rice\",\n\t\tb: \"1F35B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"spicy\",\n\t\t\t\"hot\",\n\t\t\t\"indian\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t29\n\t\t]\n\t},\n\tbulb: {\n\t\ta: \"Electric Light Bulb\",\n\t\tb: \"1F4A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"light\",\n\t\t\t\"electricity\",\n\t\t\t\"idea\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t7\n\t\t]\n\t},\n\tanguished: {\n\t\ta: \"Anguished Face\",\n\t\tb: \"1F627\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"stunned\",\n\t\t\t\"nervous\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t11\n\t\t],\n\t\tl: [\n\t\t\t\"D:\"\n\t\t]\n\t},\n\t\"flag-cu\": {\n\t\ta: \"Cuba Flag\",\n\t\tb: \"1F1E8-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t31\n\t\t]\n\t},\n\tbarber: {\n\t\ta: \"Barber Pole\",\n\t\tb: \"1F488\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hair\",\n\t\t\t\"salon\",\n\t\t\t\"style\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t34\n\t\t]\n\t},\n\tduck: {\n\t\ta: \"Duck\",\n\t\tb: \"1F986\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"bird\",\n\t\t\t\"mallard\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t30\n\t\t],\n\t\to: 9\n\t},\n\tsix_pointed_star: {\n\t\ta: \"Six Pointed Star with Middle Dot\",\n\t\tb: \"1F52F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"religion\",\n\t\t\t\"jewish\",\n\t\t\t\"hexagram\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t49\n\t\t]\n\t},\n\tramen: {\n\t\ta: \"Steaming Bowl\",\n\t\tb: \"1F35C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\",\n\t\t\t\"noodle\",\n\t\t\t\"chopsticks\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t30\n\t\t]\n\t},\n\tflashlight: {\n\t\ta: \"Electric Torch\",\n\t\tb: \"1F526\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dark\",\n\t\t\t\"camping\",\n\t\t\t\"sight\",\n\t\t\t\"night\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t40\n\t\t]\n\t},\n\tmahjong: {\n\t\ta: \"Mahjong Tile Red Dragon\",\n\t\tb: \"1F004\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"play\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t14\n\t\t],\n\t\to: 5\n\t},\n\tfearful: {\n\t\ta: \"Fearful Face\",\n\t\tb: \"1F628\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"scared\",\n\t\t\t\"terrified\",\n\t\t\t\"nervous\",\n\t\t\t\"oops\",\n\t\t\t\"huh\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t12\n\t\t]\n\t},\n\taries: {\n\t\ta: \"Aries\",\n\t\tb: \"2648\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t44\n\t\t],\n\t\to: 1\n\t},\n\tspaghetti: {\n\t\ta: \"Spaghetti\",\n\t\tb: \"1F35D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"italian\",\n\t\t\t\"noodle\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t31\n\t\t]\n\t},\n\tcircus_tent: {\n\t\ta: \"Circus Tent\",\n\t\tb: \"1F3AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"carnival\",\n\t\t\t\"party\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t4\n\t\t]\n\t},\n\tizakaya_lantern: {\n\t\ta: \"Izakaya Lantern\",\n\t\tb: \"1F3EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"light\",\n\t\t\t\"paper\",\n\t\t\t\"halloween\",\n\t\t\t\"spooky\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"lantern\"\n\t\t]\n\t},\n\t\"flag-cv\": {\n\t\ta: \"Cape Verde Flag\",\n\t\tb: \"1F1E8-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t32\n\t\t]\n\t},\n\tweary: {\n\t\ta: \"Weary Face\",\n\t\tb: \"1F629\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"tired\",\n\t\t\t\"sleepy\",\n\t\t\t\"sad\",\n\t\t\t\"frustrated\",\n\t\t\t\"upset\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t13\n\t\t]\n\t},\n\tflower_playing_cards: {\n\t\ta: \"Flower Playing Cards\",\n\t\tb: \"1F3B4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"sunset\",\n\t\t\t\"red\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t14\n\t\t]\n\t},\n\towl: {\n\t\ta: \"Owl\",\n\t\tb: \"1F989\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"bird\",\n\t\t\t\"hoot\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t33\n\t\t],\n\t\to: 9\n\t},\n\tperforming_arts: {\n\t\ta: \"Performing Arts\",\n\t\tb: \"1F3AD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"acting\",\n\t\t\t\"theater\",\n\t\t\t\"drama\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t7\n\t\t]\n\t},\n\tfrog: {\n\t\ta: \"Frog Face\",\n\t\tb: \"1F438\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"croak\",\n\t\t\t\"toad\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t34\n\t\t]\n\t},\n\t\"flag-cw\": {\n\t\ta: \"Curaçao Flag\",\n\t\tb: \"1F1E8-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t33\n\t\t]\n\t},\n\tnotebook_with_decorative_cover: {\n\t\ta: \"Notebook with Decorative Cover\",\n\t\tb: \"1F4D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"classroom\",\n\t\t\t\"notes\",\n\t\t\t\"record\",\n\t\t\t\"paper\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t11\n\t\t]\n\t},\n\texploding_head: {\n\t\ta: \"Shocked Face with Exploding Head\",\n\t\tb: \"1F92F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t3\n\t\t],\n\t\tn: [\n\t\t\t\"shocked_face_with_exploding_head\"\n\t\t],\n\t\to: 10\n\t},\n\ttaurus: {\n\t\ta: \"Taurus\",\n\t\tb: \"2649\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t45\n\t\t],\n\t\to: 1\n\t},\n\tsweet_potato: {\n\t\ta: \"Roasted Sweet Potato\",\n\t\tb: \"1F360\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t34\n\t\t]\n\t},\n\tclosed_book: {\n\t\ta: \"Closed Book\",\n\t\tb: \"1F4D5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"textbook\",\n\t\t\t\"learn\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t12\n\t\t]\n\t},\n\tgemini: {\n\t\ta: \"Gemini\",\n\t\tb: \"264A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t46\n\t\t],\n\t\to: 1\n\t},\n\tframe_with_picture: {\n\t\ta: \"Frame with Picture\",\n\t\tb: \"1F5BC-FE0F\",\n\t\tc: \"1F5BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t3\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-cx\": {\n\t\ta: \"Christmas Island Flag\",\n\t\tb: \"1F1E8-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t34\n\t\t]\n\t},\n\tgrimacing: {\n\t\ta: \"Grimacing Face\",\n\t\tb: \"1F62C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"grimace\",\n\t\t\t\"teeth\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t16\n\t\t]\n\t},\n\tcrocodile: {\n\t\ta: \"Crocodile\",\n\t\tb: \"1F40A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"reptile\",\n\t\t\t\"lizard\",\n\t\t\t\"alligator\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t40\n\t\t]\n\t},\n\toden: {\n\t\ta: \"Oden\",\n\t\tb: \"1F362\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-cy\": {\n\t\ta: \"Cyprus Flag\",\n\t\tb: \"1F1E8-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t35\n\t\t]\n\t},\n\tbook: {\n\t\ta: \"Open Book\",\n\t\tb: \"1F4D6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t26,\n\t\t\t13\n\t\t],\n\t\tn: [\n\t\t\t\"open_book\"\n\t\t]\n\t},\n\tturtle: {\n\t\ta: \"Turtle\",\n\t\tb: \"1F422\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"slow\",\n\t\t\t\"nature\",\n\t\t\t\"tortoise\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t12\n\t\t]\n\t},\n\tart: {\n\t\ta: \"Artist Palette\",\n\t\tb: \"1F3A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"design\",\n\t\t\t\"paint\",\n\t\t\t\"draw\",\n\t\t\t\"colors\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t2\n\t\t]\n\t},\n\tsushi: {\n\t\ta: \"Sushi\",\n\t\tb: \"1F363\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"fish\",\n\t\t\t\"japanese\",\n\t\t\t\"rice\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t37\n\t\t]\n\t},\n\tcold_sweat: {\n\t\ta: \"Face with Open Mouth and Cold Sweat\",\n\t\tb: \"1F630\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"nervous\",\n\t\t\t\"sweat\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t20\n\t\t]\n\t},\n\tcancer: {\n\t\ta: \"Cancer\",\n\t\tb: \"264B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t47\n\t\t],\n\t\to: 1\n\t},\n\tfried_shrimp: {\n\t\ta: \"Fried Shrimp\",\n\t\tb: \"1F364\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"animal\",\n\t\t\t\"appetizer\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t38\n\t\t]\n\t},\n\tslot_machine: {\n\t\ta: \"Slot Machine\",\n\t\tb: \"1F3B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bet\",\n\t\t\t\"gamble\",\n\t\t\t\"vegas\",\n\t\t\t\"fruit machine\",\n\t\t\t\"luck\",\n\t\t\t\"casino\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t10\n\t\t]\n\t},\n\tscream: {\n\t\ta: \"Face Screaming in Fear\",\n\t\tb: \"1F631\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"munch\",\n\t\t\t\"scared\",\n\t\t\t\"omg\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t21\n\t\t]\n\t},\n\tgreen_book: {\n\t\ta: \"Green Book\",\n\t\tb: \"1F4D7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t14\n\t\t]\n\t},\n\tleo: {\n\t\ta: \"Leo\",\n\t\tb: \"264C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t48\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-cz\": {\n\t\ta: \"Czechia Flag\",\n\t\tb: \"1F1E8-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t36\n\t\t]\n\t},\n\tlizard: {\n\t\ta: \"Lizard\",\n\t\tb: \"1F98E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"reptile\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t38\n\t\t],\n\t\to: 9\n\t},\n\tvirgo: {\n\t\ta: \"Virgo\",\n\t\tb: \"264D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t49\n\t\t],\n\t\to: 1\n\t},\n\tsteam_locomotive: {\n\t\ta: \"Steam Locomotive\",\n\t\tb: \"1F682\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"train\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t10\n\t\t]\n\t},\n\tde: {\n\t\ta: \"Germany Flag\",\n\t\tb: \"1F1E9-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"german\",\n\t\t\t\"nation\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t1,\n\t\t\t37\n\t\t],\n\t\tn: [\n\t\t\t\"flag-de\"\n\t\t]\n\t},\n\tflushed: {\n\t\ta: \"Flushed Face\",\n\t\tb: \"1F633\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"blush\",\n\t\t\t\"shy\",\n\t\t\t\"flattered\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t23\n\t\t]\n\t},\n\tblue_book: {\n\t\ta: \"Blue Book\",\n\t\tb: \"1F4D8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"learn\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t15\n\t\t]\n\t},\n\tsnake: {\n\t\ta: \"Snake\",\n\t\tb: \"1F40D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"evil\",\n\t\t\t\"nature\",\n\t\t\t\"hiss\",\n\t\t\t\"python\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t43\n\t\t]\n\t},\n\tfish_cake: {\n\t\ta: \"Fish Cake with Swirl Design\",\n\t\tb: \"1F365\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"japan\",\n\t\t\t\"sea\",\n\t\t\t\"beach\",\n\t\t\t\"narutomaki\",\n\t\t\t\"pink\",\n\t\t\t\"swirl\",\n\t\t\t\"kamaboko\",\n\t\t\t\"surimi\",\n\t\t\t\"ramen\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t39\n\t\t]\n\t},\n\trailway_car: {\n\t\ta: \"Railway Car\",\n\t\tb: \"1F683\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t11\n\t\t]\n\t},\n\tdango: {\n\t\ta: \"Dango\",\n\t\tb: \"1F361\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\",\n\t\t\t\"sweet\",\n\t\t\t\"japanese\",\n\t\t\t\"barbecue\",\n\t\t\t\"meat\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t35\n\t\t]\n\t},\n\torange_book: {\n\t\ta: \"Orange Book\",\n\t\tb: \"1F4D9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"library\",\n\t\t\t\"knowledge\",\n\t\t\t\"textbook\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t16\n\t\t]\n\t},\n\tlibra: {\n\t\ta: \"Libra\",\n\t\tb: \"264E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t50\n\t\t],\n\t\to: 1\n\t},\n\tdragon_face: {\n\t\ta: \"Dragon Face\",\n\t\tb: \"1F432\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"myth\",\n\t\t\t\"nature\",\n\t\t\t\"chinese\",\n\t\t\t\"green\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-dg\": {\n\t\ta: \"Diego Garcia Flag\",\n\t\tb: \"1F1E9-1F1EC\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t38\n\t\t]\n\t},\n\tzany_face: {\n\t\ta: \"Grinning Face with One Large and One Small Eye\",\n\t\tb: \"1F92A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t50\n\t\t],\n\t\tn: [\n\t\t\t\"grinning_face_with_one_large_and_one_small_eye\"\n\t\t],\n\t\to: 10\n\t},\n\tbooks: {\n\t\ta: \"Books\",\n\t\tb: \"1F4DA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"literature\",\n\t\t\t\"library\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t17\n\t\t]\n\t},\n\tdragon: {\n\t\ta: \"Dragon\",\n\t\tb: \"1F409\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"myth\",\n\t\t\t\"nature\",\n\t\t\t\"chinese\",\n\t\t\t\"green\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t39\n\t\t]\n\t},\n\t\"flag-dj\": {\n\t\ta: \"Djibouti Flag\",\n\t\tb: \"1F1E9-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t39\n\t\t]\n\t},\n\tdumpling: {\n\t\ta: \"Dumpling\",\n\t\tb: \"1F95F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t11\n\t\t],\n\t\to: 10\n\t},\n\tdizzy_face: {\n\t\ta: \"Dizzy Face\",\n\t\tb: \"1F635\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"spent\",\n\t\t\t\"unconscious\",\n\t\t\t\"xox\",\n\t\t\t\"dizzy\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t25\n\t\t]\n\t},\n\tscorpius: {\n\t\ta: \"Scorpius\",\n\t\tb: \"264F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\",\n\t\t\t\"scorpio\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t51\n\t\t],\n\t\to: 1\n\t},\n\tbullettrain_side: {\n\t\ta: \"High-Speed Train\",\n\t\tb: \"1F684\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t12\n\t\t]\n\t},\n\tbullettrain_front: {\n\t\ta: \"High-Speed Train with Bullet Nose\",\n\t\tb: \"1F685\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"speed\",\n\t\t\t\"fast\",\n\t\t\t\"public\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t13\n\t\t]\n\t},\n\tnotebook: {\n\t\ta: \"Notebook\",\n\t\tb: \"1F4D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"record\",\n\t\t\t\"notes\",\n\t\t\t\"paper\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t10\n\t\t]\n\t},\n\tfortune_cookie: {\n\t\ta: \"Fortune Cookie\",\n\t\tb: \"1F960\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t12\n\t\t],\n\t\to: 10\n\t},\n\tsagittarius: {\n\t\ta: \"Sagittarius\",\n\t\tb: \"2650\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t0\n\t\t],\n\t\to: 1\n\t},\n\tsauropod: {\n\t\ta: \"Sauropod\",\n\t\tb: \"1F995\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t45\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-dk\": {\n\t\ta: \"Denmark Flag\",\n\t\tb: \"1F1E9-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t40\n\t\t]\n\t},\n\trage: {\n\t\ta: \"Pouting Face\",\n\t\tb: \"1F621\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"angry\",\n\t\t\t\"mad\",\n\t\t\t\"hate\",\n\t\t\t\"despise\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t5\n\t\t]\n\t},\n\tledger: {\n\t\ta: \"Ledger\",\n\t\tb: \"1F4D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"notes\",\n\t\t\t\"paper\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t9\n\t\t]\n\t},\n\tangry: {\n\t\ta: \"Angry Face\",\n\t\tb: \"1F620\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mad\",\n\t\t\t\"face\",\n\t\t\t\"annoyed\",\n\t\t\t\"frustrated\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t4\n\t\t],\n\t\tl: [\n\t\t\t\">:(\",\n\t\t\t\">:-(\"\n\t\t]\n\t},\n\t\"t-rex\": {\n\t\ta: \"T-Rex\",\n\t\tb: \"1F996\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t46\n\t\t],\n\t\to: 10\n\t},\n\tcapricorn: {\n\t\ta: \"Capricorn\",\n\t\tb: \"2651\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"purple-square\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t1\n\t\t],\n\t\to: 1\n\t},\n\ttakeout_box: {\n\t\ta: \"Takeout Box\",\n\t\tb: \"1F961\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t13\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-dm\": {\n\t\ta: \"Dominica Flag\",\n\t\tb: \"1F1E9-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t41\n\t\t]\n\t},\n\ttrain2: {\n\t\ta: \"Train\",\n\t\tb: \"1F686\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t14\n\t\t]\n\t},\n\tpage_with_curl: {\n\t\ta: \"Page with Curl\",\n\t\tb: \"1F4C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"office\",\n\t\t\t\"paper\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t46\n\t\t]\n\t},\n\twhale: {\n\t\ta: \"Spouting Whale\",\n\t\tb: \"1F433\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t29\n\t\t]\n\t},\n\tface_with_symbols_on_mouth: {\n\t\ta: \"Serious Face with Symbols Covering Mouth\",\n\t\tb: \"1F92C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t0\n\t\t],\n\t\tn: [\n\t\t\t\"serious_face_with_symbols_covering_mouth\"\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-do\": {\n\t\ta: \"Dominican Republic Flag\",\n\t\tb: \"1F1E9-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t42\n\t\t]\n\t},\n\tmetro: {\n\t\ta: \"Metro\",\n\t\tb: \"1F687\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"blue-square\",\n\t\t\t\"mrt\",\n\t\t\t\"underground\",\n\t\t\t\"tube\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t15\n\t\t]\n\t},\n\ticecream: {\n\t\ta: \"Soft Ice Cream\",\n\t\tb: \"1F366\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"hot\",\n\t\t\t\"dessert\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t40\n\t\t]\n\t},\n\taquarius: {\n\t\ta: \"Aquarius\",\n\t\tb: \"2652\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t2\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-dz\": {\n\t\ta: \"Algeria Flag\",\n\t\tb: \"1F1E9-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t43\n\t\t]\n\t},\n\twhale2: {\n\t\ta: \"Whale\",\n\t\tb: \"1F40B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t41\n\t\t]\n\t},\n\tmask: {\n\t\ta: \"Face with Medical Mask\",\n\t\tb: \"1F637\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"sick\",\n\t\t\t\"ill\",\n\t\t\t\"disease\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t27\n\t\t]\n\t},\n\tscroll: {\n\t\ta: \"Scroll\",\n\t\tb: \"1F4DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"ancient\",\n\t\t\t\"history\",\n\t\t\t\"paper\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t19\n\t\t]\n\t},\n\tshaved_ice: {\n\t\ta: \"Shaved Ice\",\n\t\tb: \"1F367\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hot\",\n\t\t\t\"dessert\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t41\n\t\t]\n\t},\n\tpisces: {\n\t\ta: \"Pisces\",\n\t\tb: \"2653\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"sign\",\n\t\t\t\"zodiac\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t3\n\t\t],\n\t\to: 1\n\t},\n\tlight_rail: {\n\t\ta: \"Light Rail\",\n\t\tb: \"1F688\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t16\n\t\t]\n\t},\n\tdolphin: {\n\t\ta: \"Dolphin\",\n\t\tb: \"1F42C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"fish\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\",\n\t\t\t\"flipper\",\n\t\t\t\"fins\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t22\n\t\t],\n\t\tn: [\n\t\t\t\"flipper\"\n\t\t]\n\t},\n\tface_with_thermometer: {\n\t\ta: \"Face with Thermometer\",\n\t\tb: \"1F912\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sick\",\n\t\t\t\"temperature\",\n\t\t\t\"thermometer\",\n\t\t\t\"cold\",\n\t\t\t\"fever\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t26\n\t\t],\n\t\to: 8\n\t},\n\t\"flag-ea\": {\n\t\ta: \"Ceuta & Melilla Flag\",\n\t\tb: \"1F1EA-1F1E6\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t44\n\t\t]\n\t},\n\tophiuchus: {\n\t\ta: \"Ophiuchus\",\n\t\tb: \"26CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sign\",\n\t\t\t\"purple-square\",\n\t\t\t\"constellation\",\n\t\t\t\"astrology\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t31\n\t\t]\n\t},\n\tstation: {\n\t\ta: \"Station\",\n\t\tb: \"1F689\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"public\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t17\n\t\t]\n\t},\n\tice_cream: {\n\t\ta: \"Ice Cream\",\n\t\tb: \"1F368\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"hot\",\n\t\t\t\"dessert\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t42\n\t\t]\n\t},\n\tpage_facing_up: {\n\t\ta: \"Page Facing Up\",\n\t\tb: \"1F4C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"office\",\n\t\t\t\"paper\",\n\t\t\t\"information\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t47\n\t\t]\n\t},\n\tdoughnut: {\n\t\ta: \"Doughnut\",\n\t\tb: \"1F369\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\",\n\t\t\t\"snack\",\n\t\t\t\"sweet\",\n\t\t\t\"donut\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t43\n\t\t]\n\t},\n\tface_with_head_bandage: {\n\t\ta: \"Face with Head-Bandage\",\n\t\tb: \"1F915\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"injured\",\n\t\t\t\"clumsy\",\n\t\t\t\"bandage\",\n\t\t\t\"hurt\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t29\n\t\t],\n\t\to: 8\n\t},\n\tfish: {\n\t\ta: \"Fish\",\n\t\tb: \"1F41F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"food\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t9\n\t\t]\n\t},\n\tnewspaper: {\n\t\ta: \"Newspaper\",\n\t\tb: \"1F4F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"press\",\n\t\t\t\"headline\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t39\n\t\t]\n\t},\n\ttram: {\n\t\ta: \"Tram\",\n\t\tb: \"1F68A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t18\n\t\t]\n\t},\n\t\"flag-ec\": {\n\t\ta: \"Ecuador Flag\",\n\t\tb: \"1F1EA-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t45\n\t\t]\n\t},\n\ttwisted_rightwards_arrows: {\n\t\ta: \"Twisted Rightwards Arrows\",\n\t\tb: \"1F500\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"shuffle\",\n\t\t\t\"music\",\n\t\t\t\"random\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-ee\": {\n\t\ta: \"Estonia Flag\",\n\t\tb: \"1F1EA-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t46\n\t\t]\n\t},\n\tcookie: {\n\t\ta: \"Cookie\",\n\t\tb: \"1F36A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"snack\",\n\t\t\t\"oreo\",\n\t\t\t\"chocolate\",\n\t\t\t\"sweet\",\n\t\t\t\"dessert\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t44\n\t\t]\n\t},\n\tmonorail: {\n\t\ta: \"Monorail\",\n\t\tb: \"1F69D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t37\n\t\t]\n\t},\n\ttropical_fish: {\n\t\ta: \"Tropical Fish\",\n\t\tb: \"1F420\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"swim\",\n\t\t\t\"ocean\",\n\t\t\t\"beach\",\n\t\t\t\"nemo\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t10\n\t\t]\n\t},\n\trolled_up_newspaper: {\n\t\ta: \"Rolled Up Newspaper\",\n\t\tb: \"1F5DE-FE0F\",\n\t\tc: \"1F5DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\tnauseated_face: {\n\t\ta: \"Nauseated Face\",\n\t\tb: \"1F922\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"vomit\",\n\t\t\t\"gross\",\n\t\t\t\"green\",\n\t\t\t\"sick\",\n\t\t\t\"throw up\",\n\t\t\t\"ill\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t25\n\t\t],\n\t\to: 9\n\t},\n\trepeat: {\n\t\ta: \"Clockwise Rightwards and Leftwards Open Circle Arrows\",\n\t\tb: \"1F501\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"loop\",\n\t\t\t\"record\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t3\n\t\t]\n\t},\n\tbookmark_tabs: {\n\t\ta: \"Bookmark Tabs\",\n\t\tb: \"1F4D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"favorite\",\n\t\t\t\"save\",\n\t\t\t\"order\",\n\t\t\t\"tidy\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t8\n\t\t]\n\t},\n\trepeat_one: {\n\t\ta: \"Clockwise Rightwards and Leftwards Open Circle Arrows with Circled One Overlay\",\n\t\tb: \"1F502\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"loop\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-eg\": {\n\t\ta: \"Egypt Flag\",\n\t\tb: \"1F1EA-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t47\n\t\t]\n\t},\n\tmountain_railway: {\n\t\ta: \"Mountain Railway\",\n\t\tb: \"1F69E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t38\n\t\t]\n\t},\n\tbirthday: {\n\t\ta: \"Birthday Cake\",\n\t\tb: \"1F382\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\",\n\t\t\t\"cake\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t16\n\t\t]\n\t},\n\tblowfish: {\n\t\ta: \"Blowfish\",\n\t\tb: \"1F421\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"food\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t11\n\t\t]\n\t},\n\tface_vomiting: {\n\t\ta: \"Face with Open Mouth Vomiting\",\n\t\tb: \"1F92E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t2\n\t\t],\n\t\tn: [\n\t\t\t\"face_with_open_mouth_vomiting\"\n\t\t],\n\t\to: 10\n\t},\n\tarrow_forward: {\n\t\ta: \"Black Right-Pointing Triangle\",\n\t\tb: \"25B6-FE0F\",\n\t\tc: \"25B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"right\",\n\t\t\t\"direction\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t10\n\t\t],\n\t\to: 1\n\t},\n\tbookmark: {\n\t\ta: \"Bookmark\",\n\t\tb: \"1F516\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"favorite\",\n\t\t\t\"label\",\n\t\t\t\"save\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-eh\": {\n\t\ta: \"Western Sahara Flag\",\n\t\tb: \"1F1EA-1F1ED\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t48\n\t\t]\n\t},\n\tshark: {\n\t\ta: \"Shark\",\n\t\tb: \"1F988\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"fish\",\n\t\t\t\"sea\",\n\t\t\t\"ocean\",\n\t\t\t\"jaws\",\n\t\t\t\"fins\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t32\n\t\t],\n\t\to: 9\n\t},\n\ttrain: {\n\t\ta: \"Tram Car\",\n\t\tb: \"1F68B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"carriage\",\n\t\t\t\"public\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t19\n\t\t]\n\t},\n\tsneezing_face: {\n\t\ta: \"Sneezing Face\",\n\t\tb: \"1F927\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"gesundheit\",\n\t\t\t\"sneeze\",\n\t\t\t\"sick\",\n\t\t\t\"allergy\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t47\n\t\t],\n\t\to: 9\n\t},\n\tcake: {\n\t\ta: \"Shortcake\",\n\t\tb: \"1F370\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"dessert\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t50\n\t\t]\n\t},\n\tbus: {\n\t\ta: \"Bus\",\n\t\tb: \"1F68C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"car\",\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t20\n\t\t]\n\t},\n\tpie: {\n\t\ta: \"Pie\",\n\t\tb: \"1F967\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t19\n\t\t],\n\t\to: 10\n\t},\n\tinnocent: {\n\t\ta: \"Smiling Face with Halo\",\n\t\tb: \"1F607\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"angel\",\n\t\t\t\"heaven\",\n\t\t\t\"halo\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t31\n\t\t]\n\t},\n\tfast_forward: {\n\t\ta: \"Black Right-Pointing Double Triangle\",\n\t\tb: \"23E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"play\",\n\t\t\t\"speed\",\n\t\t\t\"continue\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t45\n\t\t]\n\t},\n\tlabel: {\n\t\ta: \"Label\",\n\t\tb: \"1F3F7-FE0F\",\n\t\tc: \"1F3F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sale\",\n\t\t\t\"tag\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t21\n\t\t],\n\t\to: 7\n\t},\n\toctopus: {\n\t\ta: \"Octopus\",\n\t\tb: \"1F419\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"creature\",\n\t\t\t\"ocean\",\n\t\t\t\"sea\",\n\t\t\t\"nature\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t3\n\t\t]\n\t},\n\t\"flag-er\": {\n\t\ta: \"Eritrea Flag\",\n\t\tb: \"1F1EA-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t49\n\t\t]\n\t},\n\tblack_right_pointing_double_triangle_with_vertical_bar: {\n\t\ta: \"Black Right Pointing Double Triangle with Vertical Bar\",\n\t\tb: \"23ED-FE0F\",\n\t\tc: \"23ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t49\n\t\t]\n\t},\n\tchocolate_bar: {\n\t\ta: \"Chocolate Bar\",\n\t\tb: \"1F36B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"snack\",\n\t\t\t\"dessert\",\n\t\t\t\"sweet\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t45\n\t\t]\n\t},\n\toncoming_bus: {\n\t\ta: \"Oncoming Bus\",\n\t\tb: \"1F68D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t21\n\t\t]\n\t},\n\tshell: {\n\t\ta: \"Spiral Shell\",\n\t\tb: \"1F41A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"sea\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t4\n\t\t]\n\t},\n\tface_with_cowboy_hat: {\n\t\ta: \"Face with Cowboy Hat\",\n\t\tb: \"1F920\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t23\n\t\t],\n\t\to: 9\n\t},\n\tmoneybag: {\n\t\ta: \"Money Bag\",\n\t\tb: \"1F4B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dollar\",\n\t\t\t\"payment\",\n\t\t\t\"coins\",\n\t\t\t\"sale\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t27\n\t\t]\n\t},\n\tes: {\n\t\ta: \"Spain Flag\",\n\t\tb: \"1F1EA-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"spain\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t1,\n\t\t\t50\n\t\t],\n\t\tn: [\n\t\t\t\"flag-es\"\n\t\t]\n\t},\n\tcrab: {\n\t\ta: \"Crab\",\n\t\tb: \"1F980\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"crustacean\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t24\n\t\t],\n\t\to: 8\n\t},\n\tyen: {\n\t\ta: \"Banknote with Yen Sign\",\n\t\tb: \"1F4B4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"japanese\",\n\t\t\t\"dollar\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t31\n\t\t]\n\t},\n\t\"flag-et\": {\n\t\ta: \"Ethiopia Flag\",\n\t\tb: \"1F1EA-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t1,\n\t\t\t51\n\t\t]\n\t},\n\tclown_face: {\n\t\ta: \"Clown Face\",\n\t\tb: \"1F921\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t24\n\t\t],\n\t\to: 9\n\t},\n\tblack_right_pointing_triangle_with_double_vertical_bar: {\n\t\ta: \"Black Right Pointing Triangle with Double Vertical Bar\",\n\t\tb: \"23EF-FE0F\",\n\t\tc: \"23EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t51\n\t\t]\n\t},\n\ttrolleybus: {\n\t\ta: \"Trolleybus\",\n\t\tb: \"1F68E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bart\",\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t22\n\t\t]\n\t},\n\tcandy: {\n\t\ta: \"Candy\",\n\t\tb: \"1F36C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"snack\",\n\t\t\t\"dessert\",\n\t\t\t\"sweet\",\n\t\t\t\"lolly\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t46\n\t\t]\n\t},\n\tlying_face: {\n\t\ta: \"Lying Face\",\n\t\tb: \"1F925\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"lie\",\n\t\t\t\"pinocchio\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t28\n\t\t],\n\t\to: 9\n\t},\n\tarrow_backward: {\n\t\ta: \"Black Left-Pointing Triangle\",\n\t\tb: \"25C0-FE0F\",\n\t\tc: \"25C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"left\",\n\t\t\t\"direction\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t11\n\t\t],\n\t\to: 1\n\t},\n\tdollar: {\n\t\ta: \"Banknote with Dollar Sign\",\n\t\tb: \"1F4B5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"bill\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t32\n\t\t]\n\t},\n\tshrimp: {\n\t\ta: \"Shrimp\",\n\t\tb: \"1F990\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"ocean\",\n\t\t\t\"nature\",\n\t\t\t\"seafood\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t40\n\t\t],\n\t\to: 9\n\t},\n\tminibus: {\n\t\ta: \"Minibus\",\n\t\tb: \"1F690\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"car\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-eu\": {\n\t\ta: \"European Union Flag\",\n\t\tb: \"1F1EA-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t0\n\t\t]\n\t},\n\tlollipop: {\n\t\ta: \"Lollipop\",\n\t\tb: \"1F36D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"snack\",\n\t\t\t\"candy\",\n\t\t\t\"sweet\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t47\n\t\t]\n\t},\n\tsquid: {\n\t\ta: \"Squid\",\n\t\tb: \"1F991\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"ocean\",\n\t\t\t\"sea\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t41\n\t\t],\n\t\to: 9\n\t},\n\teuro: {\n\t\ta: \"Banknote with Euro Sign\",\n\t\tb: \"1F4B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"dollar\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t33\n\t\t]\n\t},\n\t\"flag-fi\": {\n\t\ta: \"Finland Flag\",\n\t\tb: \"1F1EB-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t1\n\t\t]\n\t},\n\tambulance: {\n\t\ta: \"Ambulance\",\n\t\tb: \"1F691\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"health\",\n\t\t\t\"911\",\n\t\t\t\"hospital\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t25\n\t\t]\n\t},\n\tcustard: {\n\t\ta: \"Custard\",\n\t\tb: \"1F36E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dessert\",\n\t\t\t\"food\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t48\n\t\t]\n\t},\n\tshushing_face: {\n\t\ta: \"Face with Finger Covering Closed Lips\",\n\t\tb: \"1F92B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t51\n\t\t],\n\t\tn: [\n\t\t\t\"face_with_finger_covering_closed_lips\"\n\t\t],\n\t\to: 10\n\t},\n\trewind: {\n\t\ta: \"Black Left-Pointing Double Triangle\",\n\t\tb: \"23EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"play\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t46\n\t\t]\n\t},\n\tblack_left_pointing_double_triangle_with_vertical_bar: {\n\t\ta: \"Black Left Pointing Double Triangle with Vertical Bar\",\n\t\tb: \"23EE-FE0F\",\n\t\tc: \"23EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t50\n\t\t]\n\t},\n\tface_with_hand_over_mouth: {\n\t\ta: \"Smiling Face with Smiling Eyes and Hand Covering Mouth\",\n\t\tb: \"1F92D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t1\n\t\t],\n\t\tn: [\n\t\t\t\"smiling_face_with_smiling_eyes_and_hand_covering_mouth\"\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-fj\": {\n\t\ta: \"Fiji Flag\",\n\t\tb: \"1F1EB-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t2\n\t\t]\n\t},\n\thoney_pot: {\n\t\ta: \"Honey Pot\",\n\t\tb: \"1F36F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bees\",\n\t\t\t\"sweet\",\n\t\t\t\"kitchen\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t49\n\t\t]\n\t},\n\tsnail: {\n\t\ta: \"Snail\",\n\t\tb: \"1F40C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"slow\",\n\t\t\t\"animal\",\n\t\t\t\"shell\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t42\n\t\t]\n\t},\n\tpound: {\n\t\ta: \"Banknote with Pound Sign\",\n\t\tb: \"1F4B7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"british\",\n\t\t\t\"sterling\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"bills\",\n\t\t\t\"uk\",\n\t\t\t\"england\",\n\t\t\t\"currency\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t34\n\t\t]\n\t},\n\tfire_engine: {\n\t\ta: \"Fire Engine\",\n\t\tb: \"1F692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"cars\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t26\n\t\t]\n\t},\n\tbaby_bottle: {\n\t\ta: \"Baby Bottle\",\n\t\tb: \"1F37C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"food\",\n\t\t\t\"container\",\n\t\t\t\"milk\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t10\n\t\t]\n\t},\n\t\"flag-fk\": {\n\t\ta: \"Falkland Islands Flag\",\n\t\tb: \"1F1EB-1F1F0\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t},\n\tbutterfly: {\n\t\ta: \"Butterfly\",\n\t\tb: \"1F98B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"caterpillar\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t35\n\t\t],\n\t\to: 9\n\t},\n\tmoney_with_wings: {\n\t\ta: \"Money with Wings\",\n\t\tb: \"1F4B8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dollar\",\n\t\t\t\"bills\",\n\t\t\t\"payment\",\n\t\t\t\"sale\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t35\n\t\t]\n\t},\n\tface_with_monocle: {\n\t\ta: \"Face with Monocle\",\n\t\tb: \"1F9D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t49\n\t\t],\n\t\to: 10\n\t},\n\tpolice_car: {\n\t\ta: \"Police Car\",\n\t\tb: \"1F693\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"transportation\",\n\t\t\t\"law\",\n\t\t\t\"legal\",\n\t\t\t\"enforcement\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t27\n\t\t]\n\t},\n\tarrow_up_small: {\n\t\ta: \"Up-Pointing Small Red Triangle\",\n\t\tb: \"1F53C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"triangle\",\n\t\t\t\"direction\",\n\t\t\t\"point\",\n\t\t\t\"forward\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t10\n\t\t]\n\t},\n\t\"flag-fm\": {\n\t\ta: \"Micronesia Flag\",\n\t\tb: \"1F1EB-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t4\n\t\t]\n\t},\n\tglass_of_milk: {\n\t\ta: \"Glass of Milk\",\n\t\tb: \"1F95B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t7\n\t\t],\n\t\to: 9\n\t},\n\tcredit_card: {\n\t\ta: \"Credit Card\",\n\t\tb: \"1F4B3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"dollar\",\n\t\t\t\"bill\",\n\t\t\t\"payment\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t30\n\t\t]\n\t},\n\toncoming_police_car: {\n\t\ta: \"Oncoming Police Car\",\n\t\tb: \"1F694\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"law\",\n\t\t\t\"legal\",\n\t\t\t\"enforcement\",\n\t\t\t\"911\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t28\n\t\t]\n\t},\n\tbug: {\n\t\ta: \"Bug\",\n\t\tb: \"1F41B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"worm\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t5\n\t\t]\n\t},\n\tnerd_face: {\n\t\ta: \"Nerd Face\",\n\t\tb: \"1F913\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"nerdy\",\n\t\t\t\"geek\",\n\t\t\t\"dork\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t27\n\t\t],\n\t\to: 8\n\t},\n\tarrow_double_up: {\n\t\ta: \"Black Up-Pointing Double Triangle\",\n\t\tb: \"23EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t47\n\t\t]\n\t},\n\tchart: {\n\t\ta: \"Chart with Upwards Trend and Yen Sign\",\n\t\tb: \"1F4B9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"green-square\",\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-fo\": {\n\t\ta: \"Faroe Islands Flag\",\n\t\tb: \"1F1EB-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t5\n\t\t]\n\t},\n\tant: {\n\t\ta: \"Ant\",\n\t\tb: \"1F41C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"bug\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t6\n\t\t]\n\t},\n\tarrow_down_small: {\n\t\ta: \"Down-Pointing Small Red Triangle\",\n\t\tb: \"1F53D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t11\n\t\t]\n\t},\n\tsmiling_imp: {\n\t\ta: \"Smiling Face with Horns\",\n\t\tb: \"1F608\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"devil\",\n\t\t\t\"horns\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t32\n\t\t]\n\t},\n\ttaxi: {\n\t\ta: \"Taxi\",\n\t\tb: \"1F695\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"uber\",\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t29\n\t\t]\n\t},\n\tcoffee: {\n\t\ta: \"Hot Beverage\",\n\t\tb: \"2615\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beverage\",\n\t\t\t\"caffeine\",\n\t\t\t\"latte\",\n\t\t\t\"espresso\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t24\n\t\t],\n\t\to: 4\n\t},\n\tfr: {\n\t\ta: \"France Flag\",\n\t\tb: \"1F1EB-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"banner\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"france\",\n\t\t\t\"french\",\n\t\t\t\"country\"\n\t\t],\n\t\tk: [\n\t\t\t2,\n\t\t\t6\n\t\t],\n\t\tn: [\n\t\t\t\"flag-fr\"\n\t\t]\n\t},\n\toncoming_taxi: {\n\t\ta: \"Oncoming Taxi\",\n\t\tb: \"1F696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"uber\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t30\n\t\t]\n\t},\n\tarrow_double_down: {\n\t\ta: \"Black Down-Pointing Double Triangle\",\n\t\tb: \"23EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t48\n\t\t]\n\t},\n\timp: {\n\t\ta: \"Imp\",\n\t\tb: \"1F47F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"devil\",\n\t\t\t\"angry\",\n\t\t\t\"horns\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t51\n\t\t]\n\t},\n\tcurrency_exchange: {\n\t\ta: \"Currency Exchange\",\n\t\tb: \"1F4B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"dollar\",\n\t\t\t\"travel\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t28\n\t\t]\n\t},\n\ttea: {\n\t\ta: \"Teacup Without Handle\",\n\t\tb: \"1F375\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"bowl\",\n\t\t\t\"breakfast\",\n\t\t\t\"green\",\n\t\t\t\"british\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t3\n\t\t]\n\t},\n\tbee: {\n\t\ta: \"Honeybee\",\n\t\tb: \"1F41D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t13,\n\t\t\t7\n\t\t],\n\t\tn: [\n\t\t\t\"honeybee\"\n\t\t]\n\t},\n\theavy_dollar_sign: {\n\t\ta: \"Heavy Dollar Sign\",\n\t\tb: \"1F4B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"payment\",\n\t\t\t\"currency\",\n\t\t\t\"buck\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t29\n\t\t]\n\t},\n\tcar: {\n\t\ta: \"Automobile\",\n\t\tb: \"1F697\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t34,\n\t\t\t31\n\t\t],\n\t\tn: [\n\t\t\t\"red_car\"\n\t\t]\n\t},\n\tsake: {\n\t\ta: \"Sake Bottle and Cup\",\n\t\tb: \"1F376\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wine\",\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"beverage\",\n\t\t\t\"japanese\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-ga\": {\n\t\ta: \"Gabon Flag\",\n\t\tb: \"1F1EC-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t7\n\t\t]\n\t},\n\tbeetle: {\n\t\ta: \"Lady Beetle\",\n\t\tb: \"1F41E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"nature\",\n\t\t\t\"ladybug\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t8\n\t\t]\n\t},\n\tjapanese_ogre: {\n\t\ta: \"Japanese Ogre\",\n\t\tb: \"1F479\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"monster\",\n\t\t\t\"red\",\n\t\t\t\"mask\",\n\t\t\t\"halloween\",\n\t\t\t\"scary\",\n\t\t\t\"creepy\",\n\t\t\t\"devil\",\n\t\t\t\"demon\",\n\t\t\t\"japanese\",\n\t\t\t\"ogre\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t40\n\t\t]\n\t},\n\tdouble_vertical_bar: {\n\t\ta: \"Double Vertical Bar\",\n\t\tb: \"23F8-FE0F\",\n\t\tc: \"23F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t4\n\t\t],\n\t\to: 7\n\t},\n\tchampagne: {\n\t\ta: \"Bottle with Popping Cork\",\n\t\tb: \"1F37E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"wine\",\n\t\t\t\"bottle\",\n\t\t\t\"celebration\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t12\n\t\t],\n\t\to: 8\n\t},\n\tjapanese_goblin: {\n\t\ta: \"Japanese Goblin\",\n\t\tb: \"1F47A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red\",\n\t\t\t\"evil\",\n\t\t\t\"mask\",\n\t\t\t\"monster\",\n\t\t\t\"scary\",\n\t\t\t\"creepy\",\n\t\t\t\"japanese\",\n\t\t\t\"goblin\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t41\n\t\t]\n\t},\n\tblack_square_for_stop: {\n\t\ta: \"Black Square for Stop\",\n\t\tb: \"23F9-FE0F\",\n\t\tc: \"23F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t5\n\t\t],\n\t\to: 7\n\t},\n\toncoming_automobile: {\n\t\ta: \"Oncoming Automobile\",\n\t\tb: \"1F698\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"car\",\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t32\n\t\t]\n\t},\n\temail: {\n\t\ta: \"Envelope\",\n\t\tb: \"2709-FE0F\",\n\t\tc: \"2709\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"letter\",\n\t\t\t\"postal\",\n\t\t\t\"inbox\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t17\n\t\t],\n\t\tn: [\n\t\t\t\"envelope\"\n\t\t],\n\t\to: 1\n\t},\n\tcricket: {\n\t\ta: \"Cricket\",\n\t\tb: \"1F997\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t47\n\t\t],\n\t\to: 10\n\t},\n\tgb: {\n\t\ta: \"United Kingdom Flag\",\n\t\tb: \"1F1EC-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t8\n\t\t],\n\t\tn: [\n\t\t\t\"uk\",\n\t\t\t\"flag-gb\"\n\t\t]\n\t},\n\tblack_circle_for_record: {\n\t\ta: \"Black Circle for Record\",\n\t\tb: \"23FA-FE0F\",\n\t\tc: \"23FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t6\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-gd\": {\n\t\ta: \"Grenada Flag\",\n\t\tb: \"1F1EC-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t9\n\t\t]\n\t},\n\tspider: {\n\t\ta: \"Spider\",\n\t\tb: \"1F577-FE0F\",\n\t\tc: \"1F577\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"arachnid\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\tblue_car: {\n\t\ta: \"Recreational Vehicle\",\n\t\tb: \"1F699\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t33\n\t\t]\n\t},\n\tskull: {\n\t\ta: \"Skull\",\n\t\tb: \"1F480\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dead\",\n\t\t\t\"skeleton\",\n\t\t\t\"creepy\",\n\t\t\t\"death\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t0\n\t\t]\n\t},\n\t\"e-mail\": {\n\t\ta: \"E-Mail Symbol\",\n\t\tb: \"1F4E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t30\n\t\t]\n\t},\n\twine_glass: {\n\t\ta: \"Wine Glass\",\n\t\tb: \"1F377\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"beverage\",\n\t\t\t\"drunk\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t5\n\t\t]\n\t},\n\tspider_web: {\n\t\ta: \"Spider Web\",\n\t\tb: \"1F578-FE0F\",\n\t\tc: \"1F578\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"insect\",\n\t\t\t\"arachnid\",\n\t\t\t\"silk\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t19\n\t\t],\n\t\to: 7\n\t},\n\tcocktail: {\n\t\ta: \"Cocktail Glass\",\n\t\tb: \"1F378\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"alcohol\",\n\t\t\t\"beverage\",\n\t\t\t\"booze\",\n\t\t\t\"mojito\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t6\n\t\t]\n\t},\n\tskull_and_crossbones: {\n\t\ta: \"Skull and Crossbones\",\n\t\tb: \"2620-FE0F\",\n\t\tc: \"2620\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"poison\",\n\t\t\t\"danger\",\n\t\t\t\"deadly\",\n\t\t\t\"scary\",\n\t\t\t\"death\",\n\t\t\t\"pirate\",\n\t\t\t\"evil\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t32\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ge\": {\n\t\ta: \"Georgia Flag\",\n\t\tb: \"1F1EC-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t10\n\t\t]\n\t},\n\teject: {\n\t\ta: \"Eject\",\n\t\tb: \"23CF-FE0F\",\n\t\tc: \"23CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t44\n\t\t],\n\t\to: 4\n\t},\n\ttruck: {\n\t\ta: \"Delivery Truck\",\n\t\tb: \"1F69A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cars\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t34\n\t\t]\n\t},\n\tincoming_envelope: {\n\t\ta: \"Incoming Envelope\",\n\t\tb: \"1F4E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t31\n\t\t]\n\t},\n\ttropical_drink: {\n\t\ta: \"Tropical Drink\",\n\t\tb: \"1F379\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beverage\",\n\t\t\t\"cocktail\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\",\n\t\t\t\"mojito\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t7\n\t\t]\n\t},\n\tscorpion: {\n\t\ta: \"Scorpion\",\n\t\tb: \"1F982\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"arachnid\"\n\t\t],\n\t\tk: [\n\t\t\t42,\n\t\t\t26\n\t\t],\n\t\to: 8\n\t},\n\tcinema: {\n\t\ta: \"Cinema\",\n\t\tb: \"1F3A6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"record\",\n\t\t\t\"film\",\n\t\t\t\"movie\",\n\t\t\t\"curtain\",\n\t\t\t\"stage\",\n\t\t\t\"theater\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t0\n\t\t]\n\t},\n\tarticulated_lorry: {\n\t\ta: \"Articulated Lorry\",\n\t\tb: \"1F69B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"cars\",\n\t\t\t\"transportation\",\n\t\t\t\"express\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t35\n\t\t]\n\t},\n\tenvelope_with_arrow: {\n\t\ta: \"Envelope with Downwards Arrow Above\",\n\t\tb: \"1F4E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t32\n\t\t]\n\t},\n\tghost: {\n\t\ta: \"Ghost\",\n\t\tb: \"1F47B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"halloween\",\n\t\t\t\"spooky\",\n\t\t\t\"scary\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t42\n\t\t]\n\t},\n\t\"flag-gf\": {\n\t\ta: \"French Guiana Flag\",\n\t\tb: \"1F1EC-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t11\n\t\t]\n\t},\n\tbouquet: {\n\t\ta: \"Bouquet\",\n\t\tb: \"1F490\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"flowers\",\n\t\t\t\"nature\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t42\n\t\t]\n\t},\n\ttractor: {\n\t\ta: \"Tractor\",\n\t\tb: \"1F69C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"car\",\n\t\t\t\"farming\",\n\t\t\t\"agriculture\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t36\n\t\t]\n\t},\n\tbeer: {\n\t\ta: \"Beer Mug\",\n\t\tb: \"1F37A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"relax\",\n\t\t\t\"beverage\",\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"party\",\n\t\t\t\"pub\",\n\t\t\t\"summer\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t8\n\t\t]\n\t},\n\toutbox_tray: {\n\t\ta: \"Outbox Tray\",\n\t\tb: \"1F4E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"inbox\",\n\t\t\t\"email\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t27\n\t\t]\n\t},\n\tlow_brightness: {\n\t\ta: \"Low Brightness Symbol\",\n\t\tb: \"1F505\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sun\",\n\t\t\t\"afternoon\",\n\t\t\t\"warm\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t7\n\t\t]\n\t},\n\talien: {\n\t\ta: \"Extraterrestrial Alien\",\n\t\tb: \"1F47D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"UFO\",\n\t\t\t\"paul\",\n\t\t\t\"weird\",\n\t\t\t\"outer_space\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t49\n\t\t]\n\t},\n\t\"flag-gg\": {\n\t\ta: \"Guernsey Flag\",\n\t\tb: \"1F1EC-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t12\n\t\t]\n\t},\n\tcherry_blossom: {\n\t\ta: \"Cherry Blossom\",\n\t\tb: \"1F338\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"spring\",\n\t\t\t\"flower\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t46\n\t\t]\n\t},\n\tinbox_tray: {\n\t\ta: \"Inbox Tray\",\n\t\tb: \"1F4E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"documents\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-gh\": {\n\t\ta: \"Ghana Flag\",\n\t\tb: \"1F1EC-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t13\n\t\t]\n\t},\n\tbike: {\n\t\ta: \"Bicycle\",\n\t\tb: \"1F6B2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"bicycle\",\n\t\t\t\"exercise\",\n\t\t\t\"hipster\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t23\n\t\t]\n\t},\n\tspace_invader: {\n\t\ta: \"Alien Monster\",\n\t\tb: \"1F47E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"game\",\n\t\t\t\"arcade\",\n\t\t\t\"play\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t50\n\t\t]\n\t},\n\tbeers: {\n\t\ta: \"Clinking Beer Mugs\",\n\t\tb: \"1F37B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"relax\",\n\t\t\t\"beverage\",\n\t\t\t\"drink\",\n\t\t\t\"drunk\",\n\t\t\t\"party\",\n\t\t\t\"pub\",\n\t\t\t\"summer\",\n\t\t\t\"alcohol\",\n\t\t\t\"booze\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t9\n\t\t]\n\t},\n\thigh_brightness: {\n\t\ta: \"High Brightness Symbol\",\n\t\tb: \"1F506\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sun\",\n\t\t\t\"light\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t8\n\t\t]\n\t},\n\t\"package\": {\n\t\ta: \"Package\",\n\t\tb: \"1F4E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mail\",\n\t\t\t\"gift\",\n\t\t\t\"cardboard\",\n\t\t\t\"box\",\n\t\t\t\"moving\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t29\n\t\t]\n\t},\n\tscooter: {\n\t\ta: \"Scooter\",\n\t\tb: \"1F6F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t19\n\t\t],\n\t\to: 9\n\t},\n\twhite_flower: {\n\t\ta: \"White Flower\",\n\t\tb: \"1F4AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t25\n\t\t]\n\t},\n\tclinking_glasses: {\n\t\ta: \"Clinking Glasses\",\n\t\tb: \"1F942\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"beverage\",\n\t\t\t\"drink\",\n\t\t\t\"party\",\n\t\t\t\"alcohol\",\n\t\t\t\"celebrate\",\n\t\t\t\"cheers\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t38\n\t\t],\n\t\to: 9\n\t},\n\trobot_face: {\n\t\ta: \"Robot Face\",\n\t\tb: \"1F916\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t30\n\t\t],\n\t\to: 8\n\t},\n\tsignal_strength: {\n\t\ta: \"Antenna with Bars\",\n\t\tb: \"1F4F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"reception\",\n\t\t\t\"phone\",\n\t\t\t\"internet\",\n\t\t\t\"connection\",\n\t\t\t\"wifi\",\n\t\t\t\"bluetooth\",\n\t\t\t\"bars\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t45\n\t\t]\n\t},\n\t\"flag-gi\": {\n\t\ta: \"Gibraltar Flag\",\n\t\tb: \"1F1EC-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t14\n\t\t]\n\t},\n\t\"flag-gl\": {\n\t\ta: \"Greenland Flag\",\n\t\tb: \"1F1EC-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t15\n\t\t]\n\t},\n\tmotor_scooter: {\n\t\ta: \"Motor Scooter\",\n\t\tb: \"1F6F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"vespa\",\n\t\t\t\"sasha\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t20\n\t\t],\n\t\to: 9\n\t},\n\tmailbox: {\n\t\ta: \"Closed Mailbox with Raised Flag\",\n\t\tb: \"1F4EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t34\n\t\t]\n\t},\n\tvibration_mode: {\n\t\ta: \"Vibration Mode\",\n\t\tb: \"1F4F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"phone\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t42\n\t\t]\n\t},\n\thankey: {\n\t\ta: \"Pile of Poo\",\n\t\tb: \"1F4A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t25,\n\t\t\t15\n\t\t],\n\t\tn: [\n\t\t\t\"poop\",\n\t\t\t\"shit\"\n\t\t]\n\t},\n\trosette: {\n\t\ta: \"Rosette\",\n\t\tb: \"1F3F5-FE0F\",\n\t\tc: \"1F3F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"flower\",\n\t\t\t\"decoration\",\n\t\t\t\"military\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t20\n\t\t],\n\t\to: 7\n\t},\n\ttumbler_glass: {\n\t\ta: \"Tumbler Glass\",\n\t\tb: \"1F943\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"drink\",\n\t\t\t\"beverage\",\n\t\t\t\"drunk\",\n\t\t\t\"alcohol\",\n\t\t\t\"liquor\",\n\t\t\t\"booze\",\n\t\t\t\"bourbon\",\n\t\t\t\"scotch\",\n\t\t\t\"whisky\",\n\t\t\t\"glass\",\n\t\t\t\"shot\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t39\n\t\t],\n\t\to: 9\n\t},\n\tcup_with_straw: {\n\t\ta: \"Cup with Straw\",\n\t\tb: \"1F964\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-gm\": {\n\t\ta: \"Gambia Flag\",\n\t\tb: \"1F1EC-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t16\n\t\t]\n\t},\n\tmailbox_closed: {\n\t\ta: \"Closed Mailbox with Lowered Flag\",\n\t\tb: \"1F4EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"communication\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t33\n\t\t]\n\t},\n\tmobile_phone_off: {\n\t\ta: \"Mobile Phone off\",\n\t\tb: \"1F4F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mute\",\n\t\t\t\"orange-square\",\n\t\t\t\"silence\",\n\t\t\t\"quiet\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t43\n\t\t]\n\t},\n\tbusstop: {\n\t\ta: \"Bus Stop\",\n\t\tb: \"1F68F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"wait\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t23\n\t\t]\n\t},\n\tsmiley_cat: {\n\t\ta: \"Smiling Cat Face with Open Mouth\",\n\t\tb: \"1F63A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"happy\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t30\n\t\t]\n\t},\n\trose: {\n\t\ta: \"Rose\",\n\t\tb: \"1F339\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"flowers\",\n\t\t\t\"valentines\",\n\t\t\t\"love\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t47\n\t\t]\n\t},\n\tmotorway: {\n\t\ta: \"Motorway\",\n\t\tb: \"1F6E3-FE0F\",\n\t\tc: \"1F6E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"road\",\n\t\t\t\"cupertino\",\n\t\t\t\"interstate\",\n\t\t\t\"highway\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\tsmile_cat: {\n\t\ta: \"Grinning Cat Face with Smiling Eyes\",\n\t\tb: \"1F638\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"smile\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-gn\": {\n\t\ta: \"Guinea Flag\",\n\t\tb: \"1F1EC-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t17\n\t\t]\n\t},\n\twilted_flower: {\n\t\ta: \"Wilted Flower\",\n\t\tb: \"1F940\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"flower\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t36\n\t\t],\n\t\to: 9\n\t},\n\tmailbox_with_mail: {\n\t\ta: \"Open Mailbox with Raised Flag\",\n\t\tb: \"1F4EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\",\n\t\t\t\"communication\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t35\n\t\t]\n\t},\n\tchopsticks: {\n\t\ta: \"Chopsticks\",\n\t\tb: \"1F962\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t14\n\t\t],\n\t\to: 10\n\t},\n\tfemale_sign: {\n\t\ta: \"Female Sign\",\n\t\tb: \"2640-FE0F\",\n\t\tc: \"2640\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t42\n\t\t],\n\t\to: 1\n\t},\n\tmailbox_with_no_mail: {\n\t\ta: \"Open Mailbox with Lowered Flag\",\n\t\tb: \"1F4ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"inbox\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t36\n\t\t]\n\t},\n\tknife_fork_plate: {\n\t\ta: \"Knife Fork Plate\",\n\t\tb: \"1F37D-FE0F\",\n\t\tc: \"1F37D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t8,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\thibiscus: {\n\t\ta: \"Hibiscus\",\n\t\tb: \"1F33A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"flowers\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t48\n\t\t]\n\t},\n\t\"flag-gp\": {\n\t\ta: \"Guadeloupe Flag\",\n\t\tb: \"1F1EC-1F1F5\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t18\n\t\t]\n\t},\n\trailway_track: {\n\t\ta: \"Railway Track\",\n\t\tb: \"1F6E4-FE0F\",\n\t\tc: \"1F6E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"train\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\tmale_sign: {\n\t\ta: \"Male Sign\",\n\t\tb: \"2642-FE0F\",\n\t\tc: \"2642\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t47,\n\t\t\t43\n\t\t],\n\t\to: 1\n\t},\n\tjoy_cat: {\n\t\ta: \"Cat Face with Tears of Joy\",\n\t\tb: \"1F639\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"haha\",\n\t\t\t\"happy\",\n\t\t\t\"tears\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t29\n\t\t]\n\t},\n\tfuelpump: {\n\t\ta: \"Fuel Pump\",\n\t\tb: \"26FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"gas station\",\n\t\t\t\"petroleum\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t13\n\t\t],\n\t\to: 5\n\t},\n\tsunflower: {\n\t\ta: \"Sunflower\",\n\t\tb: \"1F33B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"fall\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t49\n\t\t]\n\t},\n\tpostbox: {\n\t\ta: \"Postbox\",\n\t\tb: \"1F4EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"letter\",\n\t\t\t\"envelope\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t37\n\t\t]\n\t},\n\t\"flag-gq\": {\n\t\ta: \"Equatorial Guinea Flag\",\n\t\tb: \"1F1EC-1F1F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t19\n\t\t]\n\t},\n\theart_eyes_cat: {\n\t\ta: \"Smiling Cat Face with Heart-Shaped Eyes\",\n\t\tb: \"1F63B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"cats\",\n\t\t\t\"valentines\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t31\n\t\t]\n\t},\n\tfork_and_knife: {\n\t\ta: \"Fork and Knife\",\n\t\tb: \"1F374\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cutlery\",\n\t\t\t\"kitchen\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t2\n\t\t]\n\t},\n\tmedical_symbol: {\n\t\ta: \"Medical Symbol\",\n\t\tb: \"2695-FE0F\",\n\t\tc: \"2695\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t14\n\t\t],\n\t\tn: [\n\t\t\t\"staff_of_aesculapius\"\n\t\t],\n\t\to: 4\n\t},\n\trecycle: {\n\t\ta: \"Black Universal Recycling Symbol\",\n\t\tb: \"267B-FE0F\",\n\t\tc: \"267B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arrow\",\n\t\t\t\"environment\",\n\t\t\t\"garbage\",\n\t\t\t\"trash\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t9\n\t\t],\n\t\to: 3\n\t},\n\tspoon: {\n\t\ta: \"Spoon\",\n\t\tb: \"1F944\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"cutlery\",\n\t\t\t\"kitchen\",\n\t\t\t\"tableware\"\n\t\t],\n\t\tk: [\n\t\t\t41,\n\t\t\t40\n\t\t],\n\t\to: 9\n\t},\n\tblossom: {\n\t\ta: \"Blossom\",\n\t\tb: \"1F33C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"flowers\",\n\t\t\t\"yellow\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t50\n\t\t]\n\t},\n\trotating_light: {\n\t\ta: \"Police Cars Revolving Light\",\n\t\tb: \"1F6A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"police\",\n\t\t\t\"ambulance\",\n\t\t\t\"911\",\n\t\t\t\"emergency\",\n\t\t\t\"alert\",\n\t\t\t\"error\",\n\t\t\t\"pinged\",\n\t\t\t\"law\",\n\t\t\t\"legal\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t13\n\t\t]\n\t},\n\tsmirk_cat: {\n\t\ta: \"Cat Face with Wry Smile\",\n\t\tb: \"1F63C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"smirk\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t32\n\t\t]\n\t},\n\tballot_box_with_ballot: {\n\t\ta: \"Ballot Box with Ballot\",\n\t\tb: \"1F5F3-FE0F\",\n\t\tc: \"1F5F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-gr\": {\n\t\ta: \"Greece Flag\",\n\t\tb: \"1F1EC-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t20\n\t\t]\n\t},\n\tkissing_cat: {\n\t\ta: \"Kissing Cat Face with Closed Eyes\",\n\t\tb: \"1F63D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t33\n\t\t]\n\t},\n\tpencil2: {\n\t\ta: \"Pencil\",\n\t\tb: \"270F-FE0F\",\n\t\tc: \"270F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"write\",\n\t\t\t\"paper\",\n\t\t\t\"writing\",\n\t\t\t\"school\",\n\t\t\t\"study\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t42\n\t\t],\n\t\to: 1\n\t},\n\ttraffic_light: {\n\t\ta: \"Horizontal Traffic Light\",\n\t\tb: \"1F6A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"signal\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t10\n\t\t]\n\t},\n\tfleur_de_lis: {\n\t\ta: \"Fleur De Lis\",\n\t\tb: \"269C-FE0F\",\n\t\tc: \"269C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"decorative\",\n\t\t\t\"scout\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t19\n\t\t],\n\t\to: 4\n\t},\n\ttulip: {\n\t\ta: \"Tulip\",\n\t\tb: \"1F337\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"flowers\",\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"summer\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t45\n\t\t]\n\t},\n\thocho: {\n\t\ta: \"Hocho\",\n\t\tb: \"1F52A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"knife\",\n\t\t\t\"blade\",\n\t\t\t\"cutlery\",\n\t\t\t\"kitchen\",\n\t\t\t\"weapon\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t44\n\t\t],\n\t\tn: [\n\t\t\t\"knife\"\n\t\t]\n\t},\n\t\"flag-gs\": {\n\t\ta: \"South Georgia & South Sandwich Islands Flag\",\n\t\tb: \"1F1EC-1F1F8\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t21\n\t\t]\n\t},\n\tseedling: {\n\t\ta: \"Seedling\",\n\t\tb: \"1F331\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"grass\",\n\t\t\t\"lawn\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t39\n\t\t]\n\t},\n\tamphora: {\n\t\ta: \"Amphora\",\n\t\tb: \"1F3FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vase\",\n\t\t\t\"jar\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t24\n\t\t],\n\t\to: 8\n\t},\n\tscream_cat: {\n\t\ta: \"Weary Cat Face\",\n\t\tb: \"1F640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\",\n\t\t\t\"munch\",\n\t\t\t\"scared\",\n\t\t\t\"scream\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t36\n\t\t]\n\t},\n\tvertical_traffic_light: {\n\t\ta: \"Vertical Traffic Light\",\n\t\tb: \"1F6A6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"driving\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t11\n\t\t]\n\t},\n\tblack_nib: {\n\t\ta: \"Black Nib\",\n\t\tb: \"2712-FE0F\",\n\t\tc: \"2712\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pen\",\n\t\t\t\"stationery\",\n\t\t\t\"writing\",\n\t\t\t\"write\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t43\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-gt\": {\n\t\ta: \"Guatemala Flag\",\n\t\tb: \"1F1EC-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t22\n\t\t]\n\t},\n\ttrident: {\n\t\ta: \"Trident Emblem\",\n\t\tb: \"1F531\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weapon\",\n\t\t\t\"spear\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t51\n\t\t]\n\t},\n\t\"flag-gu\": {\n\t\ta: \"Guam Flag\",\n\t\tb: \"1F1EC-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t23\n\t\t]\n\t},\n\tname_badge: {\n\t\ta: \"Name Badge\",\n\t\tb: \"1F4DB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fire\",\n\t\t\t\"forbid\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t18\n\t\t]\n\t},\n\tconstruction: {\n\t\ta: \"Construction Sign\",\n\t\tb: \"1F6A7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wip\",\n\t\t\t\"progress\",\n\t\t\t\"caution\",\n\t\t\t\"warning\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t12\n\t\t]\n\t},\n\tlower_left_fountain_pen: {\n\t\ta: \"Lower Left Fountain Pen\",\n\t\tb: \"1F58B-FE0F\",\n\t\tc: \"1F58B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t29\n\t\t],\n\t\to: 7\n\t},\n\tevergreen_tree: {\n\t\ta: \"Evergreen Tree\",\n\t\tb: \"1F332\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t40\n\t\t]\n\t},\n\tcrying_cat_face: {\n\t\ta: \"Crying Cat Face\",\n\t\tb: \"1F63F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"tears\",\n\t\t\t\"weep\",\n\t\t\t\"sad\",\n\t\t\t\"cats\",\n\t\t\t\"upset\",\n\t\t\t\"cry\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t35\n\t\t]\n\t},\n\t\"flag-gw\": {\n\t\ta: \"Guinea-Bissau Flag\",\n\t\tb: \"1F1EC-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t24\n\t\t]\n\t},\n\tlower_left_ballpoint_pen: {\n\t\ta: \"Lower Left Ballpoint Pen\",\n\t\tb: \"1F58A-FE0F\",\n\t\tc: \"1F58A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t28\n\t\t],\n\t\to: 7\n\t},\n\tpouting_cat: {\n\t\ta: \"Pouting Cat Face\",\n\t\tb: \"1F63E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"cats\"\n\t\t],\n\t\tk: [\n\t\t\t31,\n\t\t\t34\n\t\t]\n\t},\n\tdeciduous_tree: {\n\t\ta: \"Deciduous Tree\",\n\t\tb: \"1F333\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t41\n\t\t]\n\t},\n\toctagonal_sign: {\n\t\ta: \"Octagonal Sign\",\n\t\tb: \"1F6D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\tbeginner: {\n\t\ta: \"Japanese Symbol for Beginner\",\n\t\tb: \"1F530\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"badge\",\n\t\t\t\"shield\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t50\n\t\t]\n\t},\n\t\"flag-gy\": {\n\t\ta: \"Guyana Flag\",\n\t\tb: \"1F1EC-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t25\n\t\t]\n\t},\n\tlower_left_paintbrush: {\n\t\ta: \"Lower Left Paintbrush\",\n\t\tb: \"1F58C-FE0F\",\n\t\tc: \"1F58C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t30\n\t\t],\n\t\to: 7\n\t},\n\to: {\n\t\ta: \"Heavy Large Circle\",\n\t\tb: \"2B55\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"circle\",\n\t\t\t\"round\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t23\n\t\t],\n\t\to: 5\n\t},\n\tpalm_tree: {\n\t\ta: \"Palm Tree\",\n\t\tb: \"1F334\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"nature\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"mojito\",\n\t\t\t\"tropical\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t42\n\t\t]\n\t},\n\tanchor: {\n\t\ta: \"Anchor\",\n\t\tb: \"2693\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ship\",\n\t\t\t\"ferry\",\n\t\t\t\"sea\",\n\t\t\t\"boat\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t12\n\t\t],\n\t\to: 4\n\t},\n\tsee_no_evil: {\n\t\ta: \"See-No-Evil Monkey\",\n\t\tb: \"1F648\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"monkey\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"haha\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t43\n\t\t]\n\t},\n\tboat: {\n\t\ta: \"Sailboat\",\n\t\tb: \"26F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t48,\n\t\t\t43\n\t\t],\n\t\tn: [\n\t\t\t\"sailboat\"\n\t\t],\n\t\to: 5\n\t},\n\twhite_check_mark: {\n\t\ta: \"White Heavy Check Mark\",\n\t\tb: \"2705\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"green-square\",\n\t\t\t\"ok\",\n\t\t\t\"agree\",\n\t\t\t\"vote\",\n\t\t\t\"election\",\n\t\t\t\"answer\",\n\t\t\t\"tick\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-hk\": {\n\t\ta: \"Hong Kong Sar China Flag\",\n\t\tb: \"1F1ED-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t26\n\t\t]\n\t},\n\tlower_left_crayon: {\n\t\ta: \"Lower Left Crayon\",\n\t\tb: \"1F58D-FE0F\",\n\t\tc: \"1F58D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t31\n\t\t],\n\t\to: 7\n\t},\n\thear_no_evil: {\n\t\ta: \"Hear-No-Evil Monkey\",\n\t\tb: \"1F649\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"monkey\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t44\n\t\t]\n\t},\n\tcactus: {\n\t\ta: \"Cactus\",\n\t\tb: \"1F335\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"nature\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t43\n\t\t]\n\t},\n\tear_of_rice: {\n\t\ta: \"Ear of Rice\",\n\t\tb: \"1F33E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t0\n\t\t]\n\t},\n\tspeak_no_evil: {\n\t\ta: \"Speak-No-Evil Monkey\",\n\t\tb: \"1F64A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"monkey\",\n\t\t\t\"animal\",\n\t\t\t\"nature\",\n\t\t\t\"omg\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t45\n\t\t]\n\t},\n\t\"flag-hm\": {\n\t\ta: \"Heard & Mcdonald Islands Flag\",\n\t\tb: \"1F1ED-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t27\n\t\t]\n\t},\n\tballot_box_with_check: {\n\t\ta: \"Ballot Box with Check\",\n\t\tb: \"2611-FE0F\",\n\t\tc: \"2611\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ok\",\n\t\t\t\"agree\",\n\t\t\t\"confirm\",\n\t\t\t\"black-square\",\n\t\t\t\"vote\",\n\t\t\t\"election\",\n\t\t\t\"yes\",\n\t\t\t\"tick\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t22\n\t\t],\n\t\to: 1\n\t},\n\tcanoe: {\n\t\ta: \"Canoe\",\n\t\tb: \"1F6F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"boat\",\n\t\t\t\"paddle\",\n\t\t\t\"water\",\n\t\t\t\"ship\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t21\n\t\t],\n\t\to: 9\n\t},\n\tmemo: {\n\t\ta: \"Memo\",\n\t\tb: \"1F4DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"write\",\n\t\t\t\"documents\",\n\t\t\t\"stationery\",\n\t\t\t\"pencil\",\n\t\t\t\"paper\",\n\t\t\t\"writing\",\n\t\t\t\"legal\",\n\t\t\t\"exam\",\n\t\t\t\"quiz\",\n\t\t\t\"test\",\n\t\t\t\"study\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t20\n\t\t],\n\t\tn: [\n\t\t\t\"pencil\"\n\t\t]\n\t},\n\therb: {\n\t\ta: \"Herb\",\n\t\tb: \"1F33F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"medicine\",\n\t\t\t\"weed\",\n\t\t\t\"grass\",\n\t\t\t\"lawn\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-hn\": {\n\t\ta: \"Honduras Flag\",\n\t\tb: \"1F1ED-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t28\n\t\t]\n\t},\n\theavy_check_mark: {\n\t\ta: \"Heavy Check Mark\",\n\t\tb: \"2714-FE0F\",\n\t\tc: \"2714\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ok\",\n\t\t\t\"nike\",\n\t\t\t\"answer\",\n\t\t\t\"yes\",\n\t\t\t\"tick\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t44\n\t\t],\n\t\to: 1\n\t},\n\tbriefcase: {\n\t\ta: \"Briefcase\",\n\t\tb: \"1F4BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"business\",\n\t\t\t\"documents\",\n\t\t\t\"work\",\n\t\t\t\"law\",\n\t\t\t\"legal\",\n\t\t\t\"job\",\n\t\t\t\"career\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t39\n\t\t]\n\t},\n\tspeedboat: {\n\t\ta: \"Speedboat\",\n\t\tb: \"1F6A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ship\",\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t9\n\t\t]\n\t},\n\tbaby: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F476-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F476-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F476-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F476-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F476-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f476-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Baby\",\n\t\tb: \"1F476\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"child\",\n\t\t\t\"boy\",\n\t\t\t\"girl\",\n\t\t\t\"toddler\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t10\n\t\t]\n\t},\n\theavy_multiplication_x: {\n\t\ta: \"Heavy Multiplication X\",\n\t\tb: \"2716-FE0F\",\n\t\tc: \"2716\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"math\",\n\t\t\t\"calculation\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t45\n\t\t],\n\t\to: 1\n\t},\n\tchild: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D2-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D2-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D2-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D2-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D2-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d2-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Child\",\n\t\tb: \"1F9D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t4\n\t\t],\n\t\to: 10\n\t},\n\tshamrock: {\n\t\ta: \"Shamrock\",\n\t\tb: \"2618-FE0F\",\n\t\tc: \"2618\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"irish\",\n\t\t\t\"clover\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t25\n\t\t],\n\t\to: 4\n\t},\n\tpassenger_ship: {\n\t\ta: \"Passenger Ship\",\n\t\tb: \"1F6F3-FE0F\",\n\t\tc: \"1F6F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"yacht\",\n\t\t\t\"cruise\",\n\t\t\t\"ferry\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-hr\": {\n\t\ta: \"Croatia Flag\",\n\t\tb: \"1F1ED-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t29\n\t\t]\n\t},\n\tfile_folder: {\n\t\ta: \"File Folder\",\n\t\tb: \"1F4C1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"business\",\n\t\t\t\"office\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t44\n\t\t]\n\t},\n\tx: {\n\t\ta: \"Cross Mark\",\n\t\tb: \"274C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"no\",\n\t\t\t\"delete\",\n\t\t\t\"remove\",\n\t\t\t\"cancel\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t1\n\t\t]\n\t},\n\tfour_leaf_clover: {\n\t\ta: \"Four Leaf Clover\",\n\t\tb: \"1F340\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vegetable\",\n\t\t\t\"plant\",\n\t\t\t\"nature\",\n\t\t\t\"lucky\",\n\t\t\t\"irish\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t2\n\t\t]\n\t},\n\topen_file_folder: {\n\t\ta: \"Open File Folder\",\n\t\tb: \"1F4C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"load\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t45\n\t\t]\n\t},\n\tboy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F466-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F466-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F466-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F466-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F466-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f466-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Boy\",\n\t\tb: \"1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"man\",\n\t\t\t\"male\",\n\t\t\t\"guy\",\n\t\t\t\"teenager\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t42\n\t\t]\n\t},\n\tferry: {\n\t\ta: \"Ferry\",\n\t\tb: \"26F4-FE0F\",\n\t\tc: \"26F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"boat\",\n\t\t\t\"ship\",\n\t\t\t\"yacht\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t42\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-ht\": {\n\t\ta: \"Haiti Flag\",\n\t\tb: \"1F1ED-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t30\n\t\t]\n\t},\n\tgirl: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F467-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F467-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F467-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F467-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3fe.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F467-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f467-1f3ff.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Girl\",\n\t\tb: \"1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"woman\",\n\t\t\t\"teenager\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t48\n\t\t]\n\t},\n\tnegative_squared_cross_mark: {\n\t\ta: \"Negative Squared Cross Mark\",\n\t\tb: \"274E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"x\",\n\t\t\t\"green-square\",\n\t\t\t\"no\",\n\t\t\t\"deny\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-hu\": {\n\t\ta: \"Hungary Flag\",\n\t\tb: \"1F1ED-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t31\n\t\t]\n\t},\n\tcard_index_dividers: {\n\t\ta: \"Card Index Dividers\",\n\t\tb: \"1F5C2-FE0F\",\n\t\tc: \"1F5C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"organizing\",\n\t\t\t\"business\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t4\n\t\t],\n\t\to: 7\n\t},\n\tmaple_leaf: {\n\t\ta: \"Maple Leaf\",\n\t\tb: \"1F341\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"ca\",\n\t\t\t\"fall\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t3\n\t\t]\n\t},\n\tmotor_boat: {\n\t\ta: \"Motor Boat\",\n\t\tb: \"1F6E5-FE0F\",\n\t\tc: \"1F6E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"ship\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t13\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ic\": {\n\t\ta: \"Canary Islands Flag\",\n\t\tb: \"1F1EE-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t32\n\t\t]\n\t},\n\tfallen_leaf: {\n\t\ta: \"Fallen Leaf\",\n\t\tb: \"1F342\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"vegetable\",\n\t\t\t\"leaves\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t4\n\t\t]\n\t},\n\tadult: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D1-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fb.png\",\n\t\t\t\tsheet_x: 42,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D1-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D1-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D1-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D1-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d1-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Adult\",\n\t\tb: \"1F9D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t42,\n\t\t\t50\n\t\t],\n\t\to: 10\n\t},\n\tship: {\n\t\ta: \"Ship\",\n\t\tb: \"1F6A2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"titanic\",\n\t\t\t\"deploy\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t42\n\t\t]\n\t},\n\theavy_plus_sign: {\n\t\ta: \"Heavy Plus Sign\",\n\t\tb: \"2795\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"math\",\n\t\t\t\"calculation\",\n\t\t\t\"addition\",\n\t\t\t\"more\",\n\t\t\t\"increase\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t9\n\t\t]\n\t},\n\tdate: {\n\t\ta: \"Calendar\",\n\t\tb: \"1F4C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"calendar\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t48\n\t\t]\n\t},\n\tman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Man\",\n\t\tb: \"1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mustache\",\n\t\t\t\"father\",\n\t\t\t\"dad\",\n\t\t\t\"guy\",\n\t\t\t\"classy\",\n\t\t\t\"sir\",\n\t\t\t\"moustache\"\n\t\t],\n\t\tk: [\n\t\t\t18,\n\t\t\t11\n\t\t]\n\t},\n\t\"flag-id\": {\n\t\ta: \"Indonesia Flag\",\n\t\tb: \"1F1EE-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t33\n\t\t]\n\t},\n\tleaves: {\n\t\ta: \"Leaf Fluttering in Wind\",\n\t\tb: \"1F343\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"plant\",\n\t\t\t\"tree\",\n\t\t\t\"vegetable\",\n\t\t\t\"grass\",\n\t\t\t\"lawn\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t7,\n\t\t\t5\n\t\t]\n\t},\n\theavy_minus_sign: {\n\t\ta: \"Heavy Minus Sign\",\n\t\tb: \"2796\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"math\",\n\t\t\t\"calculation\",\n\t\t\t\"subtract\",\n\t\t\t\"less\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t10\n\t\t]\n\t},\n\tcalendar: {\n\t\ta: \"Tear-off Calendar\",\n\t\tb: \"1F4C6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"schedule\",\n\t\t\t\"date\",\n\t\t\t\"planning\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t49\n\t\t]\n\t},\n\tairplane: {\n\t\ta: \"Airplane\",\n\t\tb: \"2708-FE0F\",\n\t\tc: \"2708\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\",\n\t\t\t\"flight\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t16\n\t\t],\n\t\to: 1\n\t},\n\tspiral_note_pad: {\n\t\ta: \"Spiral Note Pad\",\n\t\tb: \"1F5D2-FE0F\",\n\t\tc: \"1F5D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t8\n\t\t],\n\t\to: 7\n\t},\n\theavy_division_sign: {\n\t\ta: \"Heavy Division Sign\",\n\t\tb: \"2797\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"divide\",\n\t\t\t\"math\",\n\t\t\t\"calculation\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t11\n\t\t]\n\t},\n\tsmall_airplane: {\n\t\ta: \"Small Airplane\",\n\t\tb: \"1F6E9-FE0F\",\n\t\tc: \"1F6E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"flight\",\n\t\t\t\"transportation\",\n\t\t\t\"fly\",\n\t\t\t\"vehicle\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t14\n\t\t],\n\t\to: 7\n\t},\n\twoman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Woman\",\n\t\tb: \"1F469\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"girls\",\n\t\t\t\"lady\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-ie\": {\n\t\ta: \"Ireland Flag\",\n\t\tb: \"1F1EE-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t34\n\t\t]\n\t},\n\tcurly_loop: {\n\t\ta: \"Curly Loop\",\n\t\tb: \"27B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"scribble\",\n\t\t\t\"draw\",\n\t\t\t\"shape\",\n\t\t\t\"squiggle\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-il\": {\n\t\ta: \"Israel Flag\",\n\t\tb: \"1F1EE-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t35\n\t\t]\n\t},\n\tairplane_departure: {\n\t\ta: \"Airplane Departure\",\n\t\tb: \"1F6EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t15\n\t\t],\n\t\to: 7\n\t},\n\tspiral_calendar_pad: {\n\t\ta: \"Spiral Calendar Pad\",\n\t\tb: \"1F5D3-FE0F\",\n\t\tc: \"1F5D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t9\n\t\t],\n\t\to: 7\n\t},\n\tolder_adult: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D3-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D3-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D3-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D3-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D3-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d3-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Older Adult\",\n\t\tb: \"1F9D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t10\n\t\t],\n\t\to: 10\n\t},\n\tairplane_arriving: {\n\t\ta: \"Airplane Arriving\",\n\t\tb: \"1F6EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t16\n\t\t],\n\t\to: 7\n\t},\n\tcard_index: {\n\t\ta: \"Card Index\",\n\t\tb: \"1F4C7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"business\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t50\n\t\t]\n\t},\n\tloop: {\n\t\ta: \"Double Curly Loop\",\n\t\tb: \"27BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"tape\",\n\t\t\t\"cassette\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t14\n\t\t]\n\t},\n\tolder_man: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F474-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F474-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F474-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F474-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F474-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f474-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Older Man\",\n\t\tb: \"1F474\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"human\",\n\t\t\t\"male\",\n\t\t\t\"men\",\n\t\t\t\"old\",\n\t\t\t\"elder\",\n\t\t\t\"senior\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t50\n\t\t]\n\t},\n\t\"flag-im\": {\n\t\ta: \"Isle of Man Flag\",\n\t\tb: \"1F1EE-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-in\": {\n\t\ta: \"India Flag\",\n\t\tb: \"1F1EE-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t37\n\t\t]\n\t},\n\tchart_with_upwards_trend: {\n\t\ta: \"Chart with Upwards Trend\",\n\t\tb: \"1F4C8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\",\n\t\t\t\"recovery\",\n\t\t\t\"business\",\n\t\t\t\"economics\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"good\",\n\t\t\t\"success\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t51\n\t\t]\n\t},\n\tpart_alternation_mark: {\n\t\ta: \"Part Alternation Mark\",\n\t\tb: \"303D-FE0F\",\n\t\tc: \"303D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\",\n\t\t\t\"business\",\n\t\t\t\"economics\",\n\t\t\t\"bad\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t25\n\t\t],\n\t\to: 3\n\t},\n\tseat: {\n\t\ta: \"Seat\",\n\t\tb: \"1F4BA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sit\",\n\t\t\t\"airplane\",\n\t\t\t\"transport\",\n\t\t\t\"bus\",\n\t\t\t\"flight\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t37\n\t\t]\n\t},\n\tolder_woman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F475-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F475-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F475-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F475-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F475-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f475-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Older Woman\",\n\t\tb: \"1F475\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"human\",\n\t\t\t\"female\",\n\t\t\t\"women\",\n\t\t\t\"lady\",\n\t\t\t\"old\",\n\t\t\t\"elder\",\n\t\t\t\"senior\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t4\n\t\t]\n\t},\n\teight_spoked_asterisk: {\n\t\ta: \"Eight Spoked Asterisk\",\n\t\tb: \"2733-FE0F\",\n\t\tc: \"2733\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"star\",\n\t\t\t\"sparkle\",\n\t\t\t\"green-square\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t49\n\t\t],\n\t\to: 1\n\t},\n\tchart_with_downwards_trend: {\n\t\ta: \"Chart with Downwards Trend\",\n\t\tb: \"1F4C9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\",\n\t\t\t\"recession\",\n\t\t\t\"business\",\n\t\t\t\"economics\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"bad\",\n\t\t\t\"failure\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t0\n\t\t]\n\t},\n\t\"flag-io\": {\n\t\ta: \"British Indian Ocean Territory Flag\",\n\t\tb: \"1F1EE-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t38\n\t\t]\n\t},\n\t\"male-doctor\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FB-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fb-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FC-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fc-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FD-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fd-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FE-200D-2695\",\n\t\t\t\timage: \"1f468-1f3fe-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FF-200D-2695\",\n\t\t\t\timage: \"1f468-1f3ff-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Doctor\",\n\t\tb: \"1F468-200D-2695-FE0F\",\n\t\tc: \"1F468-200D-2695\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t43\n\t\t]\n\t},\n\thelicopter: {\n\t\ta: \"Helicopter\",\n\t\tb: \"1F681\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t9\n\t\t]\n\t},\n\t\"female-doctor\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FB-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fb-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FC-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fc-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FD-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fd-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FE-200D-2695\",\n\t\t\t\timage: \"1f469-1f3fe-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-2695-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FF-200D-2695\",\n\t\t\t\timage: \"1f469-1f3ff-200d-2695-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Doctor\",\n\t\tb: \"1F469-200D-2695-FE0F\",\n\t\tc: \"1F469-200D-2695\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t1\n\t\t]\n\t},\n\tsuspension_railway: {\n\t\ta: \"Suspension Railway\",\n\t\tb: \"1F69F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"vehicle\",\n\t\t\t\"transportation\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t39\n\t\t]\n\t},\n\tbar_chart: {\n\t\ta: \"Bar Chart\",\n\t\tb: \"1F4CA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"graph\",\n\t\t\t\"presentation\",\n\t\t\t\"stats\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-iq\": {\n\t\ta: \"Iraq Flag\",\n\t\tb: \"1F1EE-1F1F6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t39\n\t\t]\n\t},\n\teight_pointed_black_star: {\n\t\ta: \"Eight Pointed Black Star\",\n\t\tb: \"2734-FE0F\",\n\t\tc: \"2734\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"shape\",\n\t\t\t\"polygon\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t50\n\t\t],\n\t\to: 1\n\t},\n\tmountain_cableway: {\n\t\ta: \"Mountain Cableway\",\n\t\tb: \"1F6A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"ski\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t40\n\t\t]\n\t},\n\t\"male-student\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f393.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Student\",\n\t\tb: \"1F468-200D-1F393\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t14\n\t\t]\n\t},\n\tclipboard: {\n\t\ta: \"Clipboard\",\n\t\tb: \"1F4CB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"documents\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-ir\": {\n\t\ta: \"Iran Flag\",\n\t\tb: \"1F1EE-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t40\n\t\t]\n\t},\n\tsparkle: {\n\t\ta: \"Sparkle\",\n\t\tb: \"2747-FE0F\",\n\t\tc: \"2747\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stars\",\n\t\t\t\"green-square\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"fireworks\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t0\n\t\t],\n\t\to: 1\n\t},\n\t\"female-student\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F393\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f393.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Student\",\n\t\tb: \"1F469-200D-1F393\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t29\n\t\t]\n\t},\n\tpushpin: {\n\t\ta: \"Pushpin\",\n\t\tb: \"1F4CC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"mark\",\n\t\t\t\"here\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t3\n\t\t]\n\t},\n\taerial_tramway: {\n\t\ta: \"Aerial Tramway\",\n\t\tb: \"1F6A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"transportation\",\n\t\t\t\"vehicle\",\n\t\t\t\"ski\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-is\": {\n\t\ta: \"Iceland Flag\",\n\t\tb: \"1F1EE-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t41\n\t\t]\n\t},\n\tbangbang: {\n\t\ta: \"Double Exclamation Mark\",\n\t\tb: \"203C-FE0F\",\n\t\tc: \"203C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"exclamation\",\n\t\t\t\"surprise\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t29\n\t\t],\n\t\to: 1\n\t},\n\tinterrobang: {\n\t\ta: \"Exclamation Question Mark\",\n\t\tb: \"2049-FE0F\",\n\t\tc: \"2049\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wat\",\n\t\t\t\"punctuation\",\n\t\t\t\"surprise\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t30\n\t\t],\n\t\to: 3\n\t},\n\tsatellite: {\n\t\ta: \"Satellite\",\n\t\tb: \"1F6F0-FE0F\",\n\t\tc: \"1F6F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"communication\",\n\t\t\t\"future\",\n\t\t\t\"radio\",\n\t\t\t\"space\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\tit: {\n\t\ta: \"Italy Flag\",\n\t\tb: \"1F1EE-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"italy\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t2,\n\t\t\t42\n\t\t],\n\t\tn: [\n\t\t\t\"flag-it\"\n\t\t]\n\t},\n\t\"male-teacher\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Teacher\",\n\t\tb: \"1F468-200D-1F3EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t32\n\t\t]\n\t},\n\tround_pushpin: {\n\t\ta: \"Round Pushpin\",\n\t\tb: \"1F4CD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"location\",\n\t\t\t\"map\",\n\t\t\t\"here\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-je\": {\n\t\ta: \"Jersey Flag\",\n\t\tb: \"1F1EF-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t43\n\t\t]\n\t},\n\tquestion: {\n\t\ta: \"Black Question Mark Ornament\",\n\t\tb: \"2753\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"doubt\",\n\t\t\t\"confused\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t3\n\t\t]\n\t},\n\trocket: {\n\t\ta: \"Rocket\",\n\t\tb: \"1F680\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"launch\",\n\t\t\t\"ship\",\n\t\t\t\"staffmode\",\n\t\t\t\"NASA\",\n\t\t\t\"outer space\",\n\t\t\t\"outer_space\",\n\t\t\t\"fly\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t8\n\t\t]\n\t},\n\t\"female-teacher\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3EB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3eb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Teacher\",\n\t\tb: \"1F469-200D-1F3EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t47\n\t\t]\n\t},\n\tpaperclip: {\n\t\ta: \"Paperclip\",\n\t\tb: \"1F4CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"documents\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t5\n\t\t]\n\t},\n\tlinked_paperclips: {\n\t\ta: \"Linked Paperclips\",\n\t\tb: \"1F587-FE0F\",\n\t\tc: \"1F587\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t27\n\t\t],\n\t\to: 7\n\t},\n\tflying_saucer: {\n\t\ta: \"Flying Saucer\",\n\t\tb: \"1F6F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t23\n\t\t],\n\t\to: 10\n\t},\n\t\"male-judge\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FB-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fb-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FC-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fc-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FD-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fd-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FE-200D-2696\",\n\t\t\t\timage: \"1f468-1f3fe-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FF-200D-2696\",\n\t\t\t\timage: \"1f468-1f3ff-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Judge\",\n\t\tb: \"1F468-200D-2696-FE0F\",\n\t\tc: \"1F468-200D-2696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t49\n\t\t]\n\t},\n\tgrey_question: {\n\t\ta: \"White Question Mark Ornament\",\n\t\tb: \"2754\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"doubts\",\n\t\t\t\"gray\",\n\t\t\t\"huh\",\n\t\t\t\"confused\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-jm\": {\n\t\ta: \"Jamaica Flag\",\n\t\tb: \"1F1EF-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t44\n\t\t]\n\t},\n\tbellhop_bell: {\n\t\ta: \"Bellhop Bell\",\n\t\tb: \"1F6CE-FE0F\",\n\t\tc: \"1F6CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"service\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t3\n\t\t],\n\t\to: 7\n\t},\n\tstraight_ruler: {\n\t\ta: \"Straight Ruler\",\n\t\tb: \"1F4CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"calculate\",\n\t\t\t\"length\",\n\t\t\t\"math\",\n\t\t\t\"school\",\n\t\t\t\"drawing\",\n\t\t\t\"architect\",\n\t\t\t\"sketch\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-jo\": {\n\t\ta: \"Jordan Flag\",\n\t\tb: \"1F1EF-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t45\n\t\t]\n\t},\n\t\"female-judge\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FB-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fb-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FC-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fc-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FD-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fd-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FE-200D-2696\",\n\t\t\t\timage: \"1f469-1f3fe-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-2696-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FF-200D-2696\",\n\t\t\t\timage: \"1f469-1f3ff-200d-2696-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Judge\",\n\t\tb: \"1F469-200D-2696-FE0F\",\n\t\tc: \"1F469-200D-2696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t7\n\t\t]\n\t},\n\tgrey_exclamation: {\n\t\ta: \"White Exclamation Mark Ornament\",\n\t\tb: \"2755\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"surprise\",\n\t\t\t\"punctuation\",\n\t\t\t\"gray\",\n\t\t\t\"wow\",\n\t\t\t\"warning\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t5\n\t\t]\n\t},\n\tdoor: {\n\t\ta: \"Door\",\n\t\tb: \"1F6AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"house\",\n\t\t\t\"entry\",\n\t\t\t\"exit\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t15\n\t\t]\n\t},\n\t\"male-farmer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f33e.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Farmer\",\n\t\tb: \"1F468-200D-1F33E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t2\n\t\t]\n\t},\n\tjp: {\n\t\ta: \"Japan Flag\",\n\t\tb: \"1F1EF-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"nation\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t2,\n\t\t\t46\n\t\t],\n\t\tn: [\n\t\t\t\"flag-jp\"\n\t\t]\n\t},\n\ttriangular_ruler: {\n\t\ta: \"Triangular Ruler\",\n\t\tb: \"1F4D0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"math\",\n\t\t\t\"architect\",\n\t\t\t\"sketch\"\n\t\t],\n\t\tk: [\n\t\t\t26,\n\t\t\t7\n\t\t]\n\t},\n\texclamation: {\n\t\ta: \"Heavy Exclamation Mark Symbol\",\n\t\tb: \"2757\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"heavy_exclamation_mark\",\n\t\t\t\"danger\",\n\t\t\t\"surprise\",\n\t\t\t\"punctuation\",\n\t\t\t\"wow\",\n\t\t\t\"warning\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t6\n\t\t],\n\t\tn: [\n\t\t\t\"heavy_exclamation_mark\"\n\t\t],\n\t\to: 5\n\t},\n\tbed: {\n\t\ta: \"Bed\",\n\t\tb: \"1F6CF-FE0F\",\n\t\tc: \"1F6CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sleep\",\n\t\t\t\"rest\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t4\n\t\t],\n\t\to: 7\n\t},\n\t\"female-farmer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F33E\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f33e.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Farmer\",\n\t\tb: \"1F469-200D-1F33E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t17\n\t\t]\n\t},\n\tscissors: {\n\t\ta: \"Black Scissors\",\n\t\tb: \"2702-FE0F\",\n\t\tc: \"2702\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"stationery\",\n\t\t\t\"cut\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t14\n\t\t],\n\t\to: 1\n\t},\n\twavy_dash: {\n\t\ta: \"Wavy Dash\",\n\t\tb: \"3030-FE0F\",\n\t\tc: \"3030\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"draw\",\n\t\t\t\"line\",\n\t\t\t\"moustache\",\n\t\t\t\"mustache\",\n\t\t\t\"squiggle\",\n\t\t\t\"scribble\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t24\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-ke\": {\n\t\ta: \"Kenya Flag\",\n\t\tb: \"1F1F0-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t47\n\t\t]\n\t},\n\t\"flag-kg\": {\n\t\ta: \"Kyrgyzstan Flag\",\n\t\tb: \"1F1F0-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t48\n\t\t]\n\t},\n\tcouch_and_lamp: {\n\t\ta: \"Couch and Lamp\",\n\t\tb: \"1F6CB-FE0F\",\n\t\tc: \"1F6CB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"read\",\n\t\t\t\"chill\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t47\n\t\t],\n\t\to: 7\n\t},\n\t\"male-cook\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f373.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Cook\",\n\t\tb: \"1F468-200D-1F373\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t8\n\t\t]\n\t},\n\tcard_file_box: {\n\t\ta: \"Card File Box\",\n\t\tb: \"1F5C3-FE0F\",\n\t\tc: \"1F5C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"business\",\n\t\t\t\"stationery\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t5\n\t\t],\n\t\to: 7\n\t},\n\tcopyright: {\n\t\ta: \"Copyright Sign\",\n\t\tb: \"00A9-FE0F\",\n\t\tc: \"00A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: false,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"ip\",\n\t\t\t\"license\",\n\t\t\t\"circle\",\n\t\t\t\"law\",\n\t\t\t\"legal\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t12\n\t\t],\n\t\to: 1\n\t},\n\tfile_cabinet: {\n\t\ta: \"File Cabinet\",\n\t\tb: \"1F5C4-FE0F\",\n\t\tc: \"1F5C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"filing\",\n\t\t\t\"organizing\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t6\n\t\t],\n\t\to: 7\n\t},\n\tregistered: {\n\t\ta: \"Registered Sign\",\n\t\tb: \"00AE-FE0F\",\n\t\tc: \"00AE\",\n\t\td: true,\n\t\te: true,\n\t\tf: false,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t13\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-kh\": {\n\t\ta: \"Cambodia Flag\",\n\t\tb: \"1F1F0-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t49\n\t\t]\n\t},\n\t\"female-cook\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F373\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f373.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Cook\",\n\t\tb: \"1F469-200D-1F373\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t23\n\t\t]\n\t},\n\ttoilet: {\n\t\ta: \"Toilet\",\n\t\tb: \"1F6BD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"restroom\",\n\t\t\t\"wc\",\n\t\t\t\"washroom\",\n\t\t\t\"bathroom\",\n\t\t\t\"potty\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t33\n\t\t]\n\t},\n\twastebasket: {\n\t\ta: \"Wastebasket\",\n\t\tb: \"1F5D1-FE0F\",\n\t\tc: \"1F5D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"bin\",\n\t\t\t\"trash\",\n\t\t\t\"rubbish\",\n\t\t\t\"garbage\",\n\t\t\t\"toss\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t7\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-ki\": {\n\t\ta: \"Kiribati Flag\",\n\t\tb: \"1F1F0-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t50\n\t\t]\n\t},\n\tshower: {\n\t\ta: \"Shower\",\n\t\tb: \"1F6BF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clean\",\n\t\t\t\"water\",\n\t\t\t\"bathroom\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t35\n\t\t]\n\t},\n\t\"male-mechanic\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f527.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Mechanic\",\n\t\tb: \"1F468-200D-1F527\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t19\n\t\t]\n\t},\n\ttm: {\n\t\ta: \"Trade Mark Sign\",\n\t\tb: \"2122-FE0F\",\n\t\tc: \"2122\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"trademark\",\n\t\t\t\"brand\",\n\t\t\t\"law\",\n\t\t\t\"legal\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t31\n\t\t],\n\t\to: 1\n\t},\n\thash: {\n\t\ta: \"Hash Key\",\n\t\tb: \"0023-FE0F-20E3\",\n\t\tc: \"0023-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"symbol\",\n\t\t\t\"blue-square\",\n\t\t\t\"twitter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-km\": {\n\t\ta: \"Comoros Flag\",\n\t\tb: \"1F1F0-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t2,\n\t\t\t51\n\t\t]\n\t},\n\tbathtub: {\n\t\ta: \"Bathtub\",\n\t\tb: \"1F6C1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clean\",\n\t\t\t\"shower\",\n\t\t\t\"bathroom\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t42\n\t\t]\n\t},\n\t\"female-mechanic\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F527\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f527.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Mechanic\",\n\t\tb: \"1F469-200D-1F527\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t29\n\t\t]\n\t},\n\tlock: {\n\t\ta: \"Lock\",\n\t\tb: \"1F512\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"security\",\n\t\t\t\"password\",\n\t\t\t\"padlock\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t20\n\t\t]\n\t},\n\t\"male-factory-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Factory Worker\",\n\t\tb: \"1F468-200D-1F3ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t38\n\t\t]\n\t},\n\t\"flag-kn\": {\n\t\ta: \"St. Kitts & Nevis Flag\",\n\t\tb: \"1F1F0-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t0\n\t\t]\n\t},\n\thourglass: {\n\t\ta: \"Hourglass\",\n\t\tb: \"231B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"clock\",\n\t\t\t\"oldschool\",\n\t\t\t\"limit\",\n\t\t\t\"exam\",\n\t\t\t\"quiz\",\n\t\t\t\"test\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t42\n\t\t],\n\t\to: 1\n\t},\n\tkeycap_star: {\n\t\ta: \"Keycap Star\",\n\t\tb: \"002A-FE0F-20E3\",\n\t\tc: \"002A-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t0,\n\t\t\t1\n\t\t],\n\t\to: 3\n\t},\n\tunlock: {\n\t\ta: \"Open Lock\",\n\t\tb: \"1F513\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"privacy\",\n\t\t\t\"security\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-kp\": {\n\t\ta: \"North Korea Flag\",\n\t\tb: \"1F1F0-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t1\n\t\t]\n\t},\n\t\"female-factory-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3ED\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3ed.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Factory Worker\",\n\t\tb: \"1F469-200D-1F3ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t1\n\t\t]\n\t},\n\tzero: {\n\t\ta: \"Keycap 0\",\n\t\tb: \"0030-FE0F-20E3\",\n\t\tc: \"0030-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"0\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\",\n\t\t\t\"null\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t2\n\t\t],\n\t\to: 3\n\t},\n\tlock_with_ink_pen: {\n\t\ta: \"Lock with Ink Pen\",\n\t\tb: \"1F50F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"security\",\n\t\t\t\"secret\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t17\n\t\t]\n\t},\n\thourglass_flowing_sand: {\n\t\ta: \"Hourglass with Flowing Sand\",\n\t\tb: \"23F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"oldschool\",\n\t\t\t\"time\",\n\t\t\t\"countdown\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t3\n\t\t]\n\t},\n\tone: {\n\t\ta: \"Keycap 1\",\n\t\tb: \"0031-FE0F-20E3\",\n\t\tc: \"0031-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"numbers\",\n\t\t\t\"1\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t3\n\t\t],\n\t\to: 3\n\t},\n\tkr: {\n\t\ta: \"South Korea Flag\",\n\t\tb: \"1F1F0-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"south\",\n\t\t\t\"korea\",\n\t\t\t\"nation\",\n\t\t\t\"flag\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t3,\n\t\t\t2\n\t\t],\n\t\tn: [\n\t\t\t\"flag-kr\"\n\t\t]\n\t},\n\twatch: {\n\t\ta: \"Watch\",\n\t\tb: \"231A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"accessories\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t41\n\t\t],\n\t\to: 1\n\t},\n\t\"male-office-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Office Worker\",\n\t\tb: \"1F468-200D-1F4BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t13\n\t\t]\n\t},\n\tclosed_lock_with_key: {\n\t\ta: \"Closed Lock with Key\",\n\t\tb: \"1F510\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"security\",\n\t\t\t\"privacy\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t18\n\t\t]\n\t},\n\t\"female-office-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F4BC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f4bc.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Office Worker\",\n\t\tb: \"1F469-200D-1F4BC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t23\n\t\t]\n\t},\n\ttwo: {\n\t\ta: \"Keycap 2\",\n\t\tb: \"0032-FE0F-20E3\",\n\t\tc: \"0032-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"numbers\",\n\t\t\t\"2\",\n\t\t\t\"prime\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t4\n\t\t],\n\t\to: 3\n\t},\n\talarm_clock: {\n\t\ta: \"Alarm Clock\",\n\t\tb: \"23F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"wake\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t0\n\t\t]\n\t},\n\tkey: {\n\t\ta: \"Key\",\n\t\tb: \"1F511\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"lock\",\n\t\t\t\"door\",\n\t\t\t\"password\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-kw\": {\n\t\ta: \"Kuwait Flag\",\n\t\tb: \"1F1F0-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t3\n\t\t]\n\t},\n\tstopwatch: {\n\t\ta: \"Stopwatch\",\n\t\tb: \"23F1-FE0F\",\n\t\tc: \"23F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"deadline\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t1\n\t\t]\n\t},\n\t\"male-scientist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f52c.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Scientist\",\n\t\tb: \"1F468-200D-1F52C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t25\n\t\t]\n\t},\n\tthree: {\n\t\ta: \"Keycap 3\",\n\t\tb: \"0033-FE0F-20E3\",\n\t\tc: \"0033-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"3\",\n\t\t\t\"numbers\",\n\t\t\t\"prime\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t5\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-ky\": {\n\t\ta: \"Cayman Islands Flag\",\n\t\tb: \"1F1F0-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t4\n\t\t]\n\t},\n\told_key: {\n\t\ta: \"Old Key\",\n\t\tb: \"1F5DD-FE0F\",\n\t\tc: \"1F5DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"lock\",\n\t\t\t\"door\",\n\t\t\t\"password\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-kz\": {\n\t\ta: \"Kazakhstan Flag\",\n\t\tb: \"1F1F0-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t5\n\t\t]\n\t},\n\thammer: {\n\t\ta: \"Hammer\",\n\t\tb: \"1F528\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"build\",\n\t\t\t\"create\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t42\n\t\t]\n\t},\n\t\"female-scientist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F52C\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f52c.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Scientist\",\n\t\tb: \"1F469-200D-1F52C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t35\n\t\t]\n\t},\n\ttimer_clock: {\n\t\ta: \"Timer Clock\",\n\t\tb: \"23F2-FE0F\",\n\t\tc: \"23F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"alarm\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t2\n\t\t]\n\t},\n\tfour: {\n\t\ta: \"Keycap 4\",\n\t\tb: \"0034-FE0F-20E3\",\n\t\tc: \"0034-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"4\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t6\n\t\t],\n\t\to: 3\n\t},\n\t\"male-technologist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Technologist\",\n\t\tb: \"1F468-200D-1F4BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t7\n\t\t]\n\t},\n\tmantelpiece_clock: {\n\t\ta: \"Mantelpiece Clock\",\n\t\tb: \"1F570-FE0F\",\n\t\tc: \"1F570\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"time\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\tfive: {\n\t\ta: \"Keycap 5\",\n\t\tb: \"0035-FE0F-20E3\",\n\t\tc: \"0035-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"5\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\",\n\t\t\t\"prime\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t7\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-la\": {\n\t\ta: \"Laos Flag\",\n\t\tb: \"1F1F1-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t6\n\t\t]\n\t},\n\tpick: {\n\t\ta: \"Pick\",\n\t\tb: \"26CF-FE0F\",\n\t\tc: \"26CF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"dig\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t32\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-lb\": {\n\t\ta: \"Lebanon Flag\",\n\t\tb: \"1F1F1-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t7\n\t\t]\n\t},\n\tclock12: {\n\t\ta: \"Clock Face Twelve Oclock\",\n\t\tb: \"1F55B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"noon\",\n\t\t\t\"midnight\",\n\t\t\t\"midday\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t29\n\t\t]\n\t},\n\thammer_and_pick: {\n\t\ta: \"Hammer and Pick\",\n\t\tb: \"2692-FE0F\",\n\t\tc: \"2692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"build\",\n\t\t\t\"create\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t11\n\t\t],\n\t\to: 4\n\t},\n\tsix: {\n\t\ta: \"Keycap 6\",\n\t\tb: \"0036-FE0F-20E3\",\n\t\tc: \"0036-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"6\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t8\n\t\t],\n\t\to: 3\n\t},\n\t\"female-technologist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F4BB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f4bb.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Technologist\",\n\t\tb: \"1F469-200D-1F4BB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t17\n\t\t]\n\t},\n\thammer_and_wrench: {\n\t\ta: \"Hammer and Wrench\",\n\t\tb: \"1F6E0-FE0F\",\n\t\tc: \"1F6E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"build\",\n\t\t\t\"create\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t8\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-lc\": {\n\t\ta: \"St. Lucia Flag\",\n\t\tb: \"1F1F1-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t8\n\t\t]\n\t},\n\tclock1230: {\n\t\ta: \"Clock Face Twelve-Thirty\",\n\t\tb: \"1F567\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t41\n\t\t]\n\t},\n\tseven: {\n\t\ta: \"Keycap 7\",\n\t\tb: \"0037-FE0F-20E3\",\n\t\tc: \"0037-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"7\",\n\t\t\t\"numbers\",\n\t\t\t\"blue-square\",\n\t\t\t\"prime\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t9\n\t\t],\n\t\to: 3\n\t},\n\t\"male-singer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Singer\",\n\t\tb: \"1F468-200D-1F3A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t20\n\t\t]\n\t},\n\teight: {\n\t\ta: \"Keycap 8\",\n\t\tb: \"0038-FE0F-20E3\",\n\t\tc: \"0038-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"8\",\n\t\t\t\"blue-square\",\n\t\t\t\"numbers\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t10\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-li\": {\n\t\ta: \"Liechtenstein Flag\",\n\t\tb: \"1F1F1-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t9\n\t\t]\n\t},\n\tdagger_knife: {\n\t\ta: \"Dagger Knife\",\n\t\tb: \"1F5E1-FE0F\",\n\t\tc: \"1F5E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t13\n\t\t],\n\t\to: 7\n\t},\n\tclock1: {\n\t\ta: \"Clock Face One Oclock\",\n\t\tb: \"1F550\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t18\n\t\t]\n\t},\n\t\"female-singer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3A4\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3a4.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Singer\",\n\t\tb: \"1F469-200D-1F3A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t35\n\t\t]\n\t},\n\t\"male-artist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 16,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Artist\",\n\t\tb: \"1F468-200D-1F3A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t26\n\t\t]\n\t},\n\tcrossed_swords: {\n\t\ta: \"Crossed Swords\",\n\t\tb: \"2694-FE0F\",\n\t\tc: \"2694\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weapon\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t13\n\t\t],\n\t\to: 4\n\t},\n\tnine: {\n\t\ta: \"Keycap 9\",\n\t\tb: \"0039-FE0F-20E3\",\n\t\tc: \"0039-20E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"numbers\",\n\t\t\t\"9\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t11\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-lk\": {\n\t\ta: \"Sri Lanka Flag\",\n\t\tb: \"1F1F1-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t10\n\t\t]\n\t},\n\tclock130: {\n\t\ta: \"Clock Face One-Thirty\",\n\t\tb: \"1F55C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t30\n\t\t]\n\t},\n\tclock2: {\n\t\ta: \"Clock Face Two Oclock\",\n\t\tb: \"1F551\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t19\n\t\t]\n\t},\n\tgun: {\n\t\ta: \"Pistol\",\n\t\tb: \"1F52B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"violence\",\n\t\t\t\"weapon\",\n\t\t\t\"pistol\",\n\t\t\t\"revolver\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t45\n\t\t]\n\t},\n\tkeycap_ten: {\n\t\ta: \"Keycap Ten\",\n\t\tb: \"1F51F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"numbers\",\n\t\t\t\"10\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t33\n\t\t]\n\t},\n\t\"female-artist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F3A8\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f3a8.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Artist\",\n\t\tb: \"1F469-200D-1F3A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-lr\": {\n\t\ta: \"Liberia Flag\",\n\t\tb: \"1F1F1-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t11\n\t\t]\n\t},\n\tclock230: {\n\t\ta: \"Clock Face Two-Thirty\",\n\t\tb: \"1F55D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t31\n\t\t]\n\t},\n\tbow_and_arrow: {\n\t\ta: \"Bow and Arrow\",\n\t\tb: \"1F3F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\"\n\t\t],\n\t\tk: [\n\t\t\t12,\n\t\t\t23\n\t\t],\n\t\to: 8\n\t},\n\t\"male-pilot\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FB-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fb-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FC-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fc-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FD-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fd-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FE-200D-2708\",\n\t\t\t\timage: \"1f468-1f3fe-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F468-1F3FF-200D-2708\",\n\t\t\t\timage: \"1f468-1f3ff-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 18,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Pilot\",\n\t\tb: \"1F468-200D-2708-FE0F\",\n\t\tc: \"1F468-200D-2708\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t18,\n\t\t\t3\n\t\t]\n\t},\n\t\"flag-ls\": {\n\t\ta: \"Lesotho Flag\",\n\t\tb: \"1F1F1-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t12\n\t\t]\n\t},\n\t\"flag-lt\": {\n\t\ta: \"Lithuania Flag\",\n\t\tb: \"1F1F1-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t13\n\t\t]\n\t},\n\tcapital_abcd: {\n\t\ta: \"Input Symbol for Latin Capital Letters\",\n\t\tb: \"1F520\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"words\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t34\n\t\t]\n\t},\n\t\"female-pilot\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FB-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fb-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FC-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fc-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FD-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fd-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FE-200D-2708\",\n\t\t\t\timage: \"1f469-1f3fe-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-2708-FE0F\",\n\t\t\t\tnon_qualified: \"1F469-1F3FF-200D-2708\",\n\t\t\t\timage: \"1f469-1f3ff-200d-2708-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Pilot\",\n\t\tb: \"1F469-200D-2708-FE0F\",\n\t\tc: \"1F469-200D-2708\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t13\n\t\t]\n\t},\n\tclock3: {\n\t\ta: \"Clock Face Three Oclock\",\n\t\tb: \"1F552\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t20\n\t\t]\n\t},\n\tshield: {\n\t\ta: \"Shield\",\n\t\tb: \"1F6E1-FE0F\",\n\t\tc: \"1F6E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"protection\",\n\t\t\t\"security\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t9\n\t\t],\n\t\to: 7\n\t},\n\t\"male-astronaut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f680.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Astronaut\",\n\t\tb: \"1F468-200D-1F680\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t31\n\t\t]\n\t},\n\tabcd: {\n\t\ta: \"Input Symbol for Latin Small Letters\",\n\t\tb: \"1F521\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t35\n\t\t]\n\t},\n\tclock330: {\n\t\ta: \"Clock Face Three-Thirty\",\n\t\tb: \"1F55E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t32\n\t\t]\n\t},\n\t\"flag-lu\": {\n\t\ta: \"Luxembourg Flag\",\n\t\tb: \"1F1F1-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t14\n\t\t]\n\t},\n\twrench: {\n\t\ta: \"Wrench\",\n\t\tb: \"1F527\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"tools\",\n\t\t\t\"diy\",\n\t\t\t\"ikea\",\n\t\t\t\"fix\",\n\t\t\t\"maintainer\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t41\n\t\t]\n\t},\n\tnut_and_bolt: {\n\t\ta: \"Nut and Bolt\",\n\t\tb: \"1F529\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"handy\",\n\t\t\t\"tools\",\n\t\t\t\"fix\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t43\n\t\t]\n\t},\n\tclock4: {\n\t\ta: \"Clock Face Four Oclock\",\n\t\tb: \"1F553\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t21\n\t\t]\n\t},\n\t\"female-astronaut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F680\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f680.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Astronaut\",\n\t\tb: \"1F469-200D-1F680\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-lv\": {\n\t\ta: \"Latvia Flag\",\n\t\tb: \"1F1F1-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t15\n\t\t]\n\t},\n\tgear: {\n\t\ta: \"Gear\",\n\t\tb: \"2699-FE0F\",\n\t\tc: \"2699\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"cog\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t17\n\t\t],\n\t\to: 4\n\t},\n\t\"male-firefighter\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F468-1F3FB-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fb-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F468-1F3FC-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fc-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F468-1F3FD-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fd-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F468-1F3FE-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3fe-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F468-1F3FF-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f468-1f3ff-200d-1f692.png\",\n\t\t\t\tsheet_x: 17,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Firefighter\",\n\t\tb: \"1F468-200D-1F692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t17,\n\t\t\t37\n\t\t]\n\t},\n\t\"flag-ly\": {\n\t\ta: \"Libya Flag\",\n\t\tb: \"1F1F1-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t16\n\t\t]\n\t},\n\tsymbols: {\n\t\ta: \"Input Symbol for Symbols\",\n\t\tb: \"1F523\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"music\",\n\t\t\t\"note\",\n\t\t\t\"ampersand\",\n\t\t\t\"percent\",\n\t\t\t\"glyphs\",\n\t\t\t\"characters\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t37\n\t\t]\n\t},\n\tclock430: {\n\t\ta: \"Clock Face Four-Thirty\",\n\t\tb: \"1F55F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t33\n\t\t]\n\t},\n\t\"flag-ma\": {\n\t\ta: \"Morocco Flag\",\n\t\tb: \"1F1F2-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t17\n\t\t]\n\t},\n\tcompression: {\n\t\ta: \"Compression\",\n\t\tb: \"1F5DC-FE0F\",\n\t\tc: \"1F5DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t10\n\t\t],\n\t\to: 7\n\t},\n\t\"female-firefighter\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F469-1F3FB-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fb-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F469-1F3FC-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fc-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F469-1F3FD-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fd-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F469-1F3FE-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3fe-200d-1f692.png\",\n\t\t\t\tsheet_x: 19,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F469-1F3FF-200D-1F692\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f469-1f3ff-200d-1f692.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Firefighter\",\n\t\tb: \"1F469-200D-1F692\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t47\n\t\t]\n\t},\n\tabc: {\n\t\ta: \"Input Symbol for Latin Letters\",\n\t\tb: \"1F524\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t38\n\t\t]\n\t},\n\tclock5: {\n\t\ta: \"Clock Face Five Oclock\",\n\t\tb: \"1F554\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t22\n\t\t]\n\t},\n\tclock530: {\n\t\ta: \"Clock Face Five-Thirty\",\n\t\tb: \"1F560\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t34\n\t\t]\n\t},\n\ta: {\n\t\ta: \"Negative Squared Latin Capital Letter a\",\n\t\tb: \"1F170-FE0F\",\n\t\tc: \"1F170\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t16\n\t\t]\n\t},\n\talembic: {\n\t\ta: \"Alembic\",\n\t\tb: \"2697-FE0F\",\n\t\tc: \"2697\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"distilling\",\n\t\t\t\"science\",\n\t\t\t\"experiment\",\n\t\t\t\"chemistry\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t16\n\t\t],\n\t\to: 4\n\t},\n\t\"flag-mc\": {\n\t\ta: \"Monaco Flag\",\n\t\tb: \"1F1F2-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t18\n\t\t]\n\t},\n\tcop: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F46E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fb.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F46E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fc.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F46E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fd.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F46E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3fe.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F46E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f46e-1f3ff.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F46E-200D-2642-FE0F\",\n\t\ta: \"Police Officer\",\n\t\tb: \"1F46E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t45\n\t\t]\n\t},\n\tscales: {\n\t\ta: \"Scales\",\n\t\tb: \"2696-FE0F\",\n\t\tc: \"2696\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t15\n\t\t],\n\t\to: 4\n\t},\n\tclock6: {\n\t\ta: \"Clock Face Six Oclock\",\n\t\tb: \"1F555\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\",\n\t\t\t\"dawn\",\n\t\t\t\"dusk\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-md\": {\n\t\ta: \"Moldova Flag\",\n\t\tb: \"1F1F2-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t19\n\t\t]\n\t},\n\tab: {\n\t\ta: \"Negative Squared Ab\",\n\t\tb: \"1F18E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red-square\",\n\t\t\t\"alphabet\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t20\n\t\t]\n\t},\n\t\"male-police-officer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F46E-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F46E-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F46E-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F46E-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F46E-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f46e-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F46E\",\n\t\ta: \"Male Police Officer\",\n\t\tb: \"1F46E-200D-2642-FE0F\",\n\t\tc: \"1F46E-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t39\n\t\t]\n\t},\n\tlink: {\n\t\ta: \"Link Symbol\",\n\t\tb: \"1F517\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"rings\",\n\t\t\t\"url\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-me\": {\n\t\ta: \"Montenegro Flag\",\n\t\tb: \"1F1F2-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t20\n\t\t]\n\t},\n\tclock630: {\n\t\ta: \"Clock Face Six-Thirty\",\n\t\tb: \"1F561\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t35\n\t\t]\n\t},\n\tb: {\n\t\ta: \"Negative Squared Latin Capital Letter B\",\n\t\tb: \"1F171-FE0F\",\n\t\tc: \"1F171\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"red-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t17\n\t\t]\n\t},\n\t\"female-police-officer\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F46E-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F46E-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F46E-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F46E-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F46E-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F46E-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f46e-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 20,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Police Officer\",\n\t\tb: \"1F46E-200D-2640-FE0F\",\n\t\tc: \"1F46E-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t33\n\t\t]\n\t},\n\tclock7: {\n\t\ta: \"Clock Face Seven Oclock\",\n\t\tb: \"1F556\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t24\n\t\t]\n\t},\n\tcl: {\n\t\ta: \"Squared Cl\",\n\t\tb: \"1F191\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"words\",\n\t\t\t\"red-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t21\n\t\t]\n\t},\n\tsleuth_or_spy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F575-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F575-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F575-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F575-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F575-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f575-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F575-FE0F-200D-2642-FE0F\",\n\t\ta: \"Sleuth or Spy\",\n\t\tb: \"1F575-FE0F\",\n\t\tc: \"1F575\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t11\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-mf\": {\n\t\ta: \"St. Martin Flag\",\n\t\tb: \"1F1F2-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t21\n\t\t]\n\t},\n\tchains: {\n\t\ta: \"Chains\",\n\t\tb: \"26D3-FE0F\",\n\t\tc: \"26D3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"lock\",\n\t\t\t\"arrest\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t34\n\t\t],\n\t\to: 5\n\t},\n\tsyringe: {\n\t\ta: \"Syringe\",\n\t\tb: \"1F489\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"health\",\n\t\t\t\"hospital\",\n\t\t\t\"drugs\",\n\t\t\t\"blood\",\n\t\t\t\"medicine\",\n\t\t\t\"needle\",\n\t\t\t\"doctor\",\n\t\t\t\"nurse\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t35\n\t\t]\n\t},\n\t\"male-detective\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F575-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F575-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F575-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F575-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f575-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F575-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f575-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F575-FE0F\",\n\t\ta: \"Male Detective\",\n\t\tb: \"1F575-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t5\n\t\t],\n\t\to: 7\n\t},\n\tcool: {\n\t\ta: \"Squared Cool\",\n\t\tb: \"1F192\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t22\n\t\t]\n\t},\n\tclock730: {\n\t\ta: \"Clock Face Seven-Thirty\",\n\t\tb: \"1F562\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-mg\": {\n\t\ta: \"Madagascar Flag\",\n\t\tb: \"1F1F2-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t22\n\t\t]\n\t},\n\tfree: {\n\t\ta: \"Squared Free\",\n\t\tb: \"1F193\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-mh\": {\n\t\ta: \"Marshall Islands Flag\",\n\t\tb: \"1F1F2-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t23\n\t\t]\n\t},\n\tclock8: {\n\t\ta: \"Clock Face Eight Oclock\",\n\t\tb: \"1F557\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t25\n\t\t]\n\t},\n\tpill: {\n\t\ta: \"Pill\",\n\t\tb: \"1F48A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"health\",\n\t\t\t\"medicine\",\n\t\t\t\"doctor\",\n\t\t\t\"pharmacy\",\n\t\t\t\"drug\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t36\n\t\t]\n\t},\n\t\"female-detective\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F575-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F575-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F575-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F575-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f575-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F575-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F575-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f575-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Detective\",\n\t\tb: \"1F575-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t51\n\t\t],\n\t\to: 7\n\t},\n\tclock830: {\n\t\ta: \"Clock Face Eight-Thirty\",\n\t\tb: \"1F563\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t37\n\t\t]\n\t},\n\tguardsman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F482-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F482-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F482-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F482-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F482-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f482-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F482-200D-2642-FE0F\",\n\t\ta: \"Guardsman\",\n\t\tb: \"1F482\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"uk\",\n\t\t\t\"gb\",\n\t\t\t\"british\",\n\t\t\t\"male\",\n\t\t\t\"guy\",\n\t\t\t\"royal\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t31\n\t\t]\n\t},\n\tinformation_source: {\n\t\ta: \"Information Source\",\n\t\tb: \"2139-FE0F\",\n\t\tc: \"2139\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t46,\n\t\t\t32\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-mk\": {\n\t\ta: \"Macedonia Flag\",\n\t\tb: \"1F1F2-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t24\n\t\t]\n\t},\n\tsmoking: {\n\t\ta: \"Smoking Symbol\",\n\t\tb: \"1F6AC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"kills\",\n\t\t\t\"tobacco\",\n\t\t\t\"cigarette\",\n\t\t\t\"joint\",\n\t\t\t\"smoke\"\n\t\t],\n\t\tk: [\n\t\t\t35,\n\t\t\t17\n\t\t]\n\t},\n\tid: {\n\t\ta: \"Squared Id\",\n\t\tb: \"1F194\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"words\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t24\n\t\t]\n\t},\n\tclock9: {\n\t\ta: \"Clock Face Nine Oclock\",\n\t\tb: \"1F558\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t26\n\t\t]\n\t},\n\t\"flag-ml\": {\n\t\ta: \"Mali Flag\",\n\t\tb: \"1F1F2-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t25\n\t\t]\n\t},\n\tcoffin: {\n\t\ta: \"Coffin\",\n\t\tb: \"26B0-FE0F\",\n\t\tc: \"26B0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"vampire\",\n\t\t\t\"dead\",\n\t\t\t\"die\",\n\t\t\t\"death\",\n\t\t\t\"rip\",\n\t\t\t\"graveyard\",\n\t\t\t\"cemetery\",\n\t\t\t\"casket\",\n\t\t\t\"funeral\",\n\t\t\t\"box\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t24\n\t\t],\n\t\to: 4\n\t},\n\t\"male-guard\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F482-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F482-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F482-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F482-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f482-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F482-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f482-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F482\",\n\t\ta: \"Male Guard\",\n\t\tb: \"1F482-200D-2642-FE0F\",\n\t\tc: \"1F482-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t25\n\t\t]\n\t},\n\tm: {\n\t\ta: \"Circled Latin Capital Letter M\",\n\t\tb: \"24C2-FE0F\",\n\t\tc: \"24C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"blue-circle\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t7\n\t\t],\n\t\to: 1\n\t},\n\tfuneral_urn: {\n\t\ta: \"Funeral Urn\",\n\t\tb: \"26B1-FE0F\",\n\t\tc: \"26B1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"dead\",\n\t\t\t\"die\",\n\t\t\t\"death\",\n\t\t\t\"rip\",\n\t\t\t\"ashes\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t25\n\t\t],\n\t\to: 4\n\t},\n\t\"female-guard\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F482-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F482-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F482-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F482-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f482-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F482-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F482-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f482-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Guard\",\n\t\tb: \"1F482-200D-2640-FE0F\",\n\t\tc: \"1F482-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-mm\": {\n\t\ta: \"Myanmar (burma) Flag\",\n\t\tb: \"1F1F2-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t26\n\t\t]\n\t},\n\tclock930: {\n\t\ta: \"Clock Face Nine-Thirty\",\n\t\tb: \"1F564\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t38\n\t\t]\n\t},\n\tmoyai: {\n\t\ta: \"Moyai\",\n\t\tb: \"1F5FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"rock\",\n\t\t\t\"easter island\",\n\t\t\t\"moai\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t23\n\t\t]\n\t},\n\t\"new\": {\n\t\ta: \"Squared New\",\n\t\tb: \"1F195\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"words\",\n\t\t\t\"start\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-mn\": {\n\t\ta: \"Mongolia Flag\",\n\t\tb: \"1F1F2-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t27\n\t\t]\n\t},\n\tconstruction_worker: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F477-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F477-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F477-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F477-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F477-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f477-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F477-200D-2642-FE0F\",\n\t\ta: \"Construction Worker\",\n\t\tb: \"1F477\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t22,\n\t\t\t28\n\t\t]\n\t},\n\tclock10: {\n\t\ta: \"Clock Face Ten Oclock\",\n\t\tb: \"1F559\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t27\n\t\t]\n\t},\n\tclock1030: {\n\t\ta: \"Clock Face Ten-Thirty\",\n\t\tb: \"1F565\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t39\n\t\t]\n\t},\n\tng: {\n\t\ta: \"Squared Ng\",\n\t\tb: \"1F196\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"words\",\n\t\t\t\"shape\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t26\n\t\t]\n\t},\n\t\"male-construction-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F477-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F477-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F477-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F477-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f477-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F477-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f477-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F477\",\n\t\ta: \"Male Construction Worker\",\n\t\tb: \"1F477-200D-2642-FE0F\",\n\t\tc: \"1F477-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t22,\n\t\t\t22\n\t\t]\n\t},\n\t\"flag-mo\": {\n\t\ta: \"Macau Sar China Flag\",\n\t\tb: \"1F1F2-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t28\n\t\t]\n\t},\n\toil_drum: {\n\t\ta: \"Oil Drum\",\n\t\tb: \"1F6E2-FE0F\",\n\t\tc: \"1F6E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"barrell\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t10\n\t\t],\n\t\to: 7\n\t},\n\to2: {\n\t\ta: \"Negative Squared Latin Capital Letter O\",\n\t\tb: \"1F17E-FE0F\",\n\t\tc: \"1F17E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"alphabet\",\n\t\t\t\"red-square\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t18\n\t\t]\n\t},\n\t\"female-construction-worker\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F477-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F477-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F477-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F477-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f477-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F477-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F477-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f477-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Construction Worker\",\n\t\tb: \"1F477-200D-2640-FE0F\",\n\t\tc: \"1F477-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t22,\n\t\t\t16\n\t\t]\n\t},\n\tclock11: {\n\t\ta: \"Clock Face Eleven Oclock\",\n\t\tb: \"1F55A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t28\n\t\t]\n\t},\n\tcrystal_ball: {\n\t\ta: \"Crystal Ball\",\n\t\tb: \"1F52E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"disco\",\n\t\t\t\"party\",\n\t\t\t\"magic\",\n\t\t\t\"circus\",\n\t\t\t\"fortune_teller\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t48\n\t\t]\n\t},\n\t\"flag-mp\": {\n\t\ta: \"Northern Mariana Islands Flag\",\n\t\tb: \"1F1F2-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t29\n\t\t]\n\t},\n\t\"flag-mq\": {\n\t\ta: \"Martinique Flag\",\n\t\tb: \"1F1F2-1F1F6\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t30\n\t\t]\n\t},\n\tprince: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F934-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F934-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F934-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F934-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F934-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f934-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Prince\",\n\t\tb: \"1F934\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"boy\",\n\t\t\t\"man\",\n\t\t\t\"male\",\n\t\t\t\"crown\",\n\t\t\t\"royal\",\n\t\t\t\"king\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t28\n\t\t],\n\t\to: 9\n\t},\n\tok: {\n\t\ta: \"Squared Ok\",\n\t\tb: \"1F197\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"good\",\n\t\t\t\"agree\",\n\t\t\t\"yes\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t27\n\t\t]\n\t},\n\tclock1130: {\n\t\ta: \"Clock Face Eleven-Thirty\",\n\t\tb: \"1F566\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"time\",\n\t\t\t\"late\",\n\t\t\t\"early\",\n\t\t\t\"schedule\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t40\n\t\t]\n\t},\n\tshopping_trolley: {\n\t\ta: \"Shopping Trolley\",\n\t\tb: \"1F6D2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t7\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-mr\": {\n\t\ta: \"Mauritania Flag\",\n\t\tb: \"1F1F2-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t31\n\t\t]\n\t},\n\tprincess: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F478-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F478-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F478-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F478-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F478-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f478-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Princess\",\n\t\tb: \"1F478\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"girl\",\n\t\t\t\"woman\",\n\t\t\t\"female\",\n\t\t\t\"blond\",\n\t\t\t\"crown\",\n\t\t\t\"royal\",\n\t\t\t\"queen\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t34\n\t\t]\n\t},\n\tnew_moon: {\n\t\ta: \"New Moon Symbol\",\n\t\tb: \"1F311\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t9\n\t\t]\n\t},\n\tparking: {\n\t\ta: \"Negative Squared Latin Capital Letter P\",\n\t\tb: \"1F17F-FE0F\",\n\t\tc: \"1F17F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cars\",\n\t\t\t\"blue-square\",\n\t\t\t\"alphabet\",\n\t\t\t\"letter\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t19\n\t\t],\n\t\to: 5\n\t},\n\tsos: {\n\t\ta: \"Squared Sos\",\n\t\tb: \"1F198\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"help\",\n\t\t\t\"red-square\",\n\t\t\t\"words\",\n\t\t\t\"emergency\",\n\t\t\t\"911\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t28\n\t\t]\n\t},\n\tman_with_turban: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F473-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F473-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F473-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F473-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F473-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f473-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F473-200D-2642-FE0F\",\n\t\ta: \"Man with Turban\",\n\t\tb: \"1F473\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"male\",\n\t\t\t\"indian\",\n\t\t\t\"hinduism\",\n\t\t\t\"arabs\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t44\n\t\t]\n\t},\n\t\"flag-ms\": {\n\t\ta: \"Montserrat Flag\",\n\t\tb: \"1F1F2-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t32\n\t\t]\n\t},\n\twaxing_crescent_moon: {\n\t\ta: \"Waxing Crescent Moon Symbol\",\n\t\tb: \"1F312\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t10\n\t\t]\n\t},\n\tup: {\n\t\ta: \"Squared Up with Exclamation Mark\",\n\t\tb: \"1F199\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"above\",\n\t\t\t\"high\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t29\n\t\t]\n\t},\n\tfirst_quarter_moon: {\n\t\ta: \"First Quarter Moon Symbol\",\n\t\tb: \"1F313\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t11\n\t\t]\n\t},\n\t\"flag-mt\": {\n\t\ta: \"Malta Flag\",\n\t\tb: \"1F1F2-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t33\n\t\t]\n\t},\n\t\"man-wearing-turban\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F473-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F473-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F473-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F473-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f473-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F473-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f473-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F473\",\n\t\ta: \"Man Wearing Turban\",\n\t\tb: \"1F473-200D-2642-FE0F\",\n\t\tc: \"1F473-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t38\n\t\t]\n\t},\n\tmoon: {\n\t\ta: \"Waxing Gibbous Moon Symbol\",\n\t\tb: \"1F314\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t6,\n\t\t\t12\n\t\t],\n\t\tn: [\n\t\t\t\"waxing_gibbous_moon\"\n\t\t]\n\t},\n\t\"woman-wearing-turban\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F473-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F473-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F473-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F473-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f473-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F473-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F473-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f473-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Wearing Turban\",\n\t\tb: \"1F473-200D-2640-FE0F\",\n\t\tc: \"1F473-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t32\n\t\t]\n\t},\n\tvs: {\n\t\ta: \"Squared Vs\",\n\t\tb: \"1F19A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t0,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-mu\": {\n\t\ta: \"Mauritius Flag\",\n\t\tb: \"1F1F2-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t34\n\t\t]\n\t},\n\tman_with_gua_pi_mao: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F472-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F472-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F472-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F472-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F472-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f472-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Man with Gua Pi Mao\",\n\t\tb: \"1F472\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"male\",\n\t\t\t\"boy\",\n\t\t\t\"chinese\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t26\n\t\t]\n\t},\n\tkoko: {\n\t\ta: \"Squared Katakana Koko\",\n\t\tb: \"1F201\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue-square\",\n\t\t\t\"here\",\n\t\t\t\"katakana\",\n\t\t\t\"japanese\",\n\t\t\t\"destination\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t29\n\t\t]\n\t},\n\tfull_moon: {\n\t\ta: \"Full Moon Symbol\",\n\t\tb: \"1F315\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"yellow\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-mv\": {\n\t\ta: \"Maldives Flag\",\n\t\tb: \"1F1F2-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t35\n\t\t]\n\t},\n\tperson_with_headscarf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D5-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D5-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D5-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D5-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D5-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d5-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Person with Headscarf\",\n\t\tb: \"1F9D5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\twaning_gibbous_moon: {\n\t\ta: \"Waning Gibbous Moon Symbol\",\n\t\tb: \"1F316\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\",\n\t\t\t\"waxing_gibbous_moon\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t14\n\t\t]\n\t},\n\tsa: {\n\t\ta: \"Squared Katakana Sa\",\n\t\tb: \"1F202-FE0F\",\n\t\tc: \"1F202\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"blue-square\",\n\t\t\t\"katakana\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-mw\": {\n\t\ta: \"Malawi Flag\",\n\t\tb: \"1F1F2-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t36\n\t\t]\n\t},\n\tlast_quarter_moon: {\n\t\ta: \"Last Quarter Moon Symbol\",\n\t\tb: \"1F317\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t15\n\t\t]\n\t},\n\tu6708: {\n\t\ta: \"Squared Cjk Unified Ideograph-6708\",\n\t\tb: \"1F237-FE0F\",\n\t\tc: \"1F237\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"month\",\n\t\t\t\"moon\",\n\t\t\t\"japanese\",\n\t\t\t\"orange-square\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t38\n\t\t]\n\t},\n\tbearded_person: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D4-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D4-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D4-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D4-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D4-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d4-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Bearded Person\",\n\t\tb: \"1F9D4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-mx\": {\n\t\ta: \"Mexico Flag\",\n\t\tb: \"1F1F2-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t37\n\t\t]\n\t},\n\tu6709: {\n\t\ta: \"Squared Cjk Unified Ideograph-6709\",\n\t\tb: \"1F236\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"orange-square\",\n\t\t\t\"chinese\",\n\t\t\t\"have\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t37\n\t\t]\n\t},\n\tperson_with_blond_hair: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F471-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F471-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F471-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F471-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F471-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f471-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F471-200D-2642-FE0F\",\n\t\ta: \"Person with Blond Hair\",\n\t\tb: \"1F471\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t21,\n\t\t\t20\n\t\t]\n\t},\n\twaning_crescent_moon: {\n\t\ta: \"Waning Crescent Moon Symbol\",\n\t\tb: \"1F318\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t16\n\t\t]\n\t},\n\t\"flag-my\": {\n\t\ta: \"Malaysia Flag\",\n\t\tb: \"1F1F2-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t38\n\t\t]\n\t},\n\tu6307: {\n\t\ta: \"Squared Cjk Unified Ideograph-6307\",\n\t\tb: \"1F22F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"point\",\n\t\t\t\"green-square\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t32\n\t\t],\n\t\to: 5\n\t},\n\t\"blond-haired-man\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F471-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F471-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F471-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F471-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f471-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F471-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f471-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F471\",\n\t\ta: \"Blond Haired Man\",\n\t\tb: \"1F471-200D-2642-FE0F\",\n\t\tc: \"1F471-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t14\n\t\t]\n\t},\n\tcrescent_moon: {\n\t\ta: \"Crescent Moon\",\n\t\tb: \"1F319\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"sleep\",\n\t\t\t\"sky\",\n\t\t\t\"evening\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t17\n\t\t]\n\t},\n\t\"flag-mz\": {\n\t\ta: \"Mozambique Flag\",\n\t\tb: \"1F1F2-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t39\n\t\t]\n\t},\n\tnew_moon_with_face: {\n\t\ta: \"New Moon with Face\",\n\t\tb: \"1F31A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t18\n\t\t]\n\t},\n\t\"flag-na\": {\n\t\ta: \"Namibia Flag\",\n\t\tb: \"1F1F3-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t40\n\t\t]\n\t},\n\t\"blond-haired-woman\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F471-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F471-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F471-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F471-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f471-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F471-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F471-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f471-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Blond Haired Woman\",\n\t\tb: \"1F471-200D-2640-FE0F\",\n\t\tc: \"1F471-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t8\n\t\t]\n\t},\n\tideograph_advantage: {\n\t\ta: \"Circled Ideograph Advantage\",\n\t\tb: \"1F250\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"obtain\",\n\t\t\t\"get\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t42\n\t\t]\n\t},\n\tfirst_quarter_moon_with_face: {\n\t\ta: \"First Quarter Moon with Face\",\n\t\tb: \"1F31B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t19\n\t\t]\n\t},\n\tman_in_tuxedo: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F935-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F935-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F935-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F935-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F935-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f935-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man in Tuxedo\",\n\t\tb: \"1F935\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"couple\",\n\t\t\t\"marriage\",\n\t\t\t\"wedding\",\n\t\t\t\"groom\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t34\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-nc\": {\n\t\ta: \"New Caledonia Flag\",\n\t\tb: \"1F1F3-1F1E8\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t41\n\t\t]\n\t},\n\tu5272: {\n\t\ta: \"Squared Cjk Unified Ideograph-5272\",\n\t\tb: \"1F239\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"cut\",\n\t\t\t\"divide\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"pink-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t40\n\t\t]\n\t},\n\t\"flag-ne\": {\n\t\ta: \"Niger Flag\",\n\t\tb: \"1F1F3-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t42\n\t\t]\n\t},\n\tlast_quarter_moon_with_face: {\n\t\ta: \"Last Quarter Moon with Face\",\n\t\tb: \"1F31C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t20\n\t\t]\n\t},\n\tu7121: {\n\t\ta: \"Squared Cjk Unified Ideograph-7121\",\n\t\tb: \"1F21A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nothing\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t31\n\t\t],\n\t\to: 5\n\t},\n\tbride_with_veil: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F470-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fb.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F470-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fc.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F470-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fd.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F470-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3fe.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F470-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f470-1f3ff.png\",\n\t\t\t\tsheet_x: 21,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Bride with Veil\",\n\t\tb: \"1F470\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"couple\",\n\t\t\t\"marriage\",\n\t\t\t\"wedding\",\n\t\t\t\"woman\",\n\t\t\t\"bride\"\n\t\t],\n\t\tk: [\n\t\t\t21,\n\t\t\t2\n\t\t]\n\t},\n\tu7981: {\n\t\ta: \"Squared Cjk Unified Ideograph-7981\",\n\t\tb: \"1F232\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"chinese\",\n\t\t\t\"forbidden\",\n\t\t\t\"limit\",\n\t\t\t\"restricted\",\n\t\t\t\"red-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t33\n\t\t]\n\t},\n\tpregnant_woman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F930-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F930-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F930-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F930-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F930-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f930-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Pregnant Woman\",\n\t\tb: \"1F930\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"baby\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t4\n\t\t],\n\t\to: 9\n\t},\n\tthermometer: {\n\t\ta: \"Thermometer\",\n\t\tb: \"1F321-FE0F\",\n\t\tc: \"1F321\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"temperature\",\n\t\t\t\"hot\",\n\t\t\t\"cold\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t25\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-nf\": {\n\t\ta: \"Norfolk Island Flag\",\n\t\tb: \"1F1F3-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t43\n\t\t]\n\t},\n\tsunny: {\n\t\ta: \"Black Sun with Rays\",\n\t\tb: \"2600-FE0F\",\n\t\tc: \"2600\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"nature\",\n\t\t\t\"brightness\",\n\t\t\t\"summer\",\n\t\t\t\"beach\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t16\n\t\t],\n\t\to: 1\n\t},\n\taccept: {\n\t\ta: \"Circled Ideograph Accept\",\n\t\tb: \"1F251\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"ok\",\n\t\t\t\"good\",\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"agree\",\n\t\t\t\"yes\",\n\t\t\t\"orange-circle\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t43\n\t\t]\n\t},\n\t\"flag-ng\": {\n\t\ta: \"Nigeria Flag\",\n\t\tb: \"1F1F3-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t44\n\t\t]\n\t},\n\t\"breast-feeding\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F931-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F931-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F931-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F931-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F931-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f931-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Breast-Feeding\",\n\t\tb: \"1F931\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t10\n\t\t],\n\t\to: 10\n\t},\n\tfull_moon_with_face: {\n\t\ta: \"Full Moon with Face\",\n\t\tb: \"1F31D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"twilight\",\n\t\t\t\"planet\",\n\t\t\t\"space\",\n\t\t\t\"night\",\n\t\t\t\"evening\",\n\t\t\t\"sleep\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-ni\": {\n\t\ta: \"Nicaragua Flag\",\n\t\tb: \"1F1F3-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t45\n\t\t]\n\t},\n\tu7533: {\n\t\ta: \"Squared Cjk Unified Ideograph-7533\",\n\t\tb: \"1F238\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"japanese\",\n\t\t\t\"kanji\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t39\n\t\t]\n\t},\n\tangel: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F47C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fb.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F47C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fc.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F47C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fd.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F47C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3fe.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F47C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f47c-1f3ff.png\",\n\t\t\t\tsheet_x: 22,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Baby Angel\",\n\t\tb: \"1F47C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"heaven\",\n\t\t\t\"wings\",\n\t\t\t\"halo\"\n\t\t],\n\t\tk: [\n\t\t\t22,\n\t\t\t43\n\t\t]\n\t},\n\tsun_with_face: {\n\t\ta: \"Sun with Face\",\n\t\tb: \"1F31E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"morning\",\n\t\t\t\"sky\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t22\n\t\t]\n\t},\n\tsanta: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F385-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fb.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F385-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fc.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F385-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fd.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F385-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3fe.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F385-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f385-1f3ff.png\",\n\t\t\t\tsheet_x: 8,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Father Christmas\",\n\t\tb: \"1F385\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"festival\",\n\t\t\t\"man\",\n\t\t\t\"male\",\n\t\t\t\"xmas\",\n\t\t\t\"father christmas\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t19\n\t\t]\n\t},\n\tu5408: {\n\t\ta: \"Squared Cjk Unified Ideograph-5408\",\n\t\tb: \"1F234\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"chinese\",\n\t\t\t\"join\",\n\t\t\t\"kanji\",\n\t\t\t\"red-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t35\n\t\t]\n\t},\n\t\"flag-nl\": {\n\t\ta: \"Netherlands Flag\",\n\t\tb: \"1F1F3-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t46\n\t\t]\n\t},\n\tmrs_claus: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F936-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F936-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F936-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F936-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F936-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f936-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Mother Christmas\",\n\t\tb: \"1F936\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"woman\",\n\t\t\t\"female\",\n\t\t\t\"xmas\",\n\t\t\t\"mother christmas\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t40\n\t\t],\n\t\tn: [\n\t\t\t\"mother_christmas\"\n\t\t],\n\t\to: 9\n\t},\n\tu7a7a: {\n\t\ta: \"Squared Cjk Unified Ideograph-7a7a\",\n\t\tb: \"1F233\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"chinese\",\n\t\t\t\"empty\",\n\t\t\t\"sky\",\n\t\t\t\"blue-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t34\n\t\t]\n\t},\n\tstar: {\n\t\ta: \"White Medium Star\",\n\t\tb: \"2B50\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"yellow\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t22\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-no\": {\n\t\ta: \"Norway Flag\",\n\t\tb: \"1F1F3-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t47\n\t\t]\n\t},\n\tmage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D9-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fb.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D9-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fc.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D9-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fd.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D9-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3fe.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D9-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d9-1f3ff.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D9-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D9-200D-2640-FE0F\",\n\t\ta: \"Mage\",\n\t\tb: \"1F9D9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t42\n\t\t],\n\t\to: 10\n\t},\n\tstar2: {\n\t\ta: \"Glowing Star\",\n\t\tb: \"1F31F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"sparkle\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t23\n\t\t]\n\t},\n\t\"flag-np\": {\n\t\ta: \"Nepal Flag\",\n\t\tb: \"1F1F3-1F1F5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t48\n\t\t]\n\t},\n\tcongratulations: {\n\t\ta: \"Circled Ideograph Congratulation\",\n\t\tb: \"3297-FE0F\",\n\t\tc: \"3297\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"chinese\",\n\t\t\t\"kanji\",\n\t\t\t\"japanese\",\n\t\t\t\"red-circle\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t26\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-nr\": {\n\t\ta: \"Nauru Flag\",\n\t\tb: \"1F1F3-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t49\n\t\t]\n\t},\n\tstars: {\n\t\ta: \"Shooting Star\",\n\t\tb: \"1F320\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"night\",\n\t\t\t\"photo\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t24\n\t\t]\n\t},\n\tfemale_mage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D9-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D9-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D9-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D9-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D9-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d9-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D9-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D9\",\n\t\ta: \"Female Mage\",\n\t\tb: \"1F9D9-200D-2640-FE0F\",\n\t\tc: \"1F9D9-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t30\n\t\t],\n\t\to: 10\n\t},\n\tsecret: {\n\t\ta: \"Circled Ideograph Secret\",\n\t\tb: \"3299-FE0F\",\n\t\tc: \"3299\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"privacy\",\n\t\t\t\"chinese\",\n\t\t\t\"sshh\",\n\t\t\t\"kanji\",\n\t\t\t\"red-circle\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t27\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-nu\": {\n\t\ta: \"Niue Flag\",\n\t\tb: \"1F1F3-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t50\n\t\t]\n\t},\n\tu55b6: {\n\t\ta: \"Squared Cjk Unified Ideograph-55b6\",\n\t\tb: \"1F23A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"japanese\",\n\t\t\t\"opening hours\",\n\t\t\t\"orange-square\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t41\n\t\t]\n\t},\n\tmale_mage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D9-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D9-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D9-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D9-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D9-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D9-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d9-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Mage\",\n\t\tb: \"1F9D9-200D-2642-FE0F\",\n\t\tc: \"1F9D9-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t36\n\t\t],\n\t\to: 10\n\t},\n\tcloud: {\n\t\ta: \"Cloud\",\n\t\tb: \"2601-FE0F\",\n\t\tc: \"2601\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"sky\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t17\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-nz\": {\n\t\ta: \"New Zealand Flag\",\n\t\tb: \"1F1F3-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t3,\n\t\t\t51\n\t\t]\n\t},\n\tpartly_sunny: {\n\t\ta: \"Sun Behind Cloud\",\n\t\tb: \"26C5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"nature\",\n\t\t\t\"cloudy\",\n\t\t\t\"morning\",\n\t\t\t\"fall\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t29\n\t\t],\n\t\to: 5\n\t},\n\tfairy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DA-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fb.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DA-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fc.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DA-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fd.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DA-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3fe.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DA-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9da-1f3ff.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DA-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DA-200D-2640-FE0F\",\n\t\ta: \"Fairy\",\n\t\tb: \"1F9DA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t8\n\t\t],\n\t\to: 10\n\t},\n\tu6e80: {\n\t\ta: \"Squared Cjk Unified Ideograph-6e80\",\n\t\tb: \"1F235\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"full\",\n\t\t\t\"chinese\",\n\t\t\t\"japanese\",\n\t\t\t\"red-square\",\n\t\t\t\"kanji\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t36\n\t\t]\n\t},\n\tblack_small_square: {\n\t\ta: \"Black Small Square\",\n\t\tb: \"25AA-FE0F\",\n\t\tc: \"25AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t8\n\t\t],\n\t\to: 1\n\t},\n\tthunder_cloud_and_rain: {\n\t\ta: \"Thunder Cloud and Rain\",\n\t\tb: \"26C8-FE0F\",\n\t\tc: \"26C8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t30\n\t\t],\n\t\to: 5\n\t},\n\tfemale_fairy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DA-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DA-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DA-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DA-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DA-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9da-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DA-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DA\",\n\t\ta: \"Female Fairy\",\n\t\tb: \"1F9DA-200D-2640-FE0F\",\n\t\tc: \"1F9DA-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t48\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-om\": {\n\t\ta: \"Oman Flag\",\n\t\tb: \"1F1F4-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t0\n\t\t]\n\t},\n\twhite_small_square: {\n\t\ta: \"White Small Square\",\n\t\tb: \"25AB-FE0F\",\n\t\tc: \"25AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t9\n\t\t],\n\t\to: 1\n\t},\n\t\"flag-pa\": {\n\t\ta: \"Panama Flag\",\n\t\tb: \"1F1F5-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t1\n\t\t]\n\t},\n\tmostly_sunny: {\n\t\ta: \"Mostly Sunny\",\n\t\tb: \"1F324-FE0F\",\n\t\tc: \"1F324\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t26\n\t\t],\n\t\tn: [\n\t\t\t\"sun_small_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\tmale_fairy: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DA-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DA-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DA-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DA-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DA-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DA-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9da-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Fairy\",\n\t\tb: \"1F9DA-200D-2642-FE0F\",\n\t\tc: \"1F9DA-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t2\n\t\t],\n\t\to: 10\n\t},\n\tbarely_sunny: {\n\t\ta: \"Barely Sunny\",\n\t\tb: \"1F325-FE0F\",\n\t\tc: \"1F325\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t27\n\t\t],\n\t\tn: [\n\t\t\t\"sun_behind_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\twhite_medium_square: {\n\t\ta: \"White Medium Square\",\n\t\tb: \"25FB-FE0F\",\n\t\tc: \"25FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"stone\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t12\n\t\t],\n\t\to: 3\n\t},\n\t\"flag-pe\": {\n\t\ta: \"Peru Flag\",\n\t\tb: \"1F1F5-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t2\n\t\t]\n\t},\n\tvampire: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DB-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fb.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DB-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fc.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DB-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fd.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DB-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3fe.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DB-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9db-1f3ff.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DB-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DB-200D-2640-FE0F\",\n\t\ta: \"Vampire\",\n\t\tb: \"1F9DB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t26\n\t\t],\n\t\to: 10\n\t},\n\tfemale_vampire: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DB-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DB-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DB-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DB-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DB-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9db-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DB-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DB\",\n\t\ta: \"Female Vampire\",\n\t\tb: \"1F9DB-200D-2640-FE0F\",\n\t\tc: \"1F9DB-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t14\n\t\t],\n\t\to: 10\n\t},\n\tpartly_sunny_rain: {\n\t\ta: \"Partly Sunny Rain\",\n\t\tb: \"1F326-FE0F\",\n\t\tc: \"1F326\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t28\n\t\t],\n\t\tn: [\n\t\t\t\"sun_behind_rain_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-pf\": {\n\t\ta: \"French Polynesia Flag\",\n\t\tb: \"1F1F5-1F1EB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t3\n\t\t]\n\t},\n\tblack_medium_square: {\n\t\ta: \"Black Medium Square\",\n\t\tb: \"25FC-FE0F\",\n\t\tc: \"25FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"button\",\n\t\t\t\"icon\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t13\n\t\t],\n\t\to: 3\n\t},\n\twhite_medium_small_square: {\n\t\ta: \"White Medium Small Square\",\n\t\tb: \"25FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"stone\",\n\t\t\t\"icon\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t14\n\t\t],\n\t\to: 3\n\t},\n\train_cloud: {\n\t\ta: \"Rain Cloud\",\n\t\tb: \"1F327-FE0F\",\n\t\tc: \"1F327\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t29\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-pg\": {\n\t\ta: \"Papua New Guinea Flag\",\n\t\tb: \"1F1F5-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t4\n\t\t]\n\t},\n\tmale_vampire: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DB-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DB-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DB-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DB-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DB-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DB-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9db-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Male Vampire\",\n\t\tb: \"1F9DB-200D-2642-FE0F\",\n\t\tc: \"1F9DB-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t20\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-ph\": {\n\t\ta: \"Philippines Flag\",\n\t\tb: \"1F1F5-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t5\n\t\t]\n\t},\n\tmerperson: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DC-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fb.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FB-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DC-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fc.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FC-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DC-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fd.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FD-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DC-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3fe.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FE-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DC-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dc-1f3ff.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DC-1F3FF-200D-2642-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DC-200D-2642-FE0F\",\n\t\ta: \"Merperson\",\n\t\tb: \"1F9DC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t44\n\t\t],\n\t\to: 10\n\t},\n\tblack_medium_small_square: {\n\t\ta: \"Black Medium Small Square\",\n\t\tb: \"25FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"icon\",\n\t\t\t\"shape\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t15\n\t\t],\n\t\to: 3\n\t},\n\tsnow_cloud: {\n\t\ta: \"Snow Cloud\",\n\t\tb: \"1F328-FE0F\",\n\t\tc: \"1F328\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t30\n\t\t],\n\t\to: 7\n\t},\n\tlightning: {\n\t\ta: \"Lightning\",\n\t\tb: \"1F329-FE0F\",\n\t\tc: \"1F329\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t31\n\t\t],\n\t\tn: [\n\t\t\t\"lightning_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\tblack_large_square: {\n\t\ta: \"Black Large Square\",\n\t\tb: \"2B1B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t20\n\t\t],\n\t\to: 5\n\t},\n\tmermaid: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DC-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DC-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DC-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DC-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DC-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9dc-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Mermaid\",\n\t\tb: \"1F9DC-200D-2640-FE0F\",\n\t\tc: \"1F9DC-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t32\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-pk\": {\n\t\ta: \"Pakistan Flag\",\n\t\tb: \"1F1F5-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t6\n\t\t]\n\t},\n\tmerman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DC-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DC-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DC-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DC-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DC-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DC-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9dc-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DC-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DC\",\n\t\ta: \"Merman\",\n\t\tb: \"1F9DC-200D-2642-FE0F\",\n\t\tc: \"1F9DC-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t38\n\t\t],\n\t\to: 10\n\t},\n\twhite_large_square: {\n\t\ta: \"White Large Square\",\n\t\tb: \"2B1C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\",\n\t\t\t\"stone\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t21\n\t\t],\n\t\to: 5\n\t},\n\ttornado: {\n\t\ta: \"Tornado\",\n\t\tb: \"1F32A-FE0F\",\n\t\tc: \"1F32A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"cyclone\",\n\t\t\t\"twister\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t32\n\t\t],\n\t\tn: [\n\t\t\t\"tornado_cloud\"\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-pl\": {\n\t\ta: \"Poland Flag\",\n\t\tb: \"1F1F5-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t7\n\t\t]\n\t},\n\telf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DD-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fb.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FB-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DD-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fc.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FC-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DD-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fd.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FD-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DD-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3fe.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FE-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DD-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9dd-1f3ff.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9DD-1F3FF-200D-2642-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9DD-200D-2642-FE0F\",\n\t\ta: \"Elf\",\n\t\tb: \"1F9DD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t10\n\t\t],\n\t\to: 10\n\t},\n\tfog: {\n\t\ta: \"Fog\",\n\t\tb: \"1F32B-FE0F\",\n\t\tc: \"1F32B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"weather\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t33\n\t\t],\n\t\to: 7\n\t},\n\tlarge_orange_diamond: {\n\t\ta: \"Large Orange Diamond\",\n\t\tb: \"1F536\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-pm\": {\n\t\ta: \"St. Pierre & Miquelon Flag\",\n\t\tb: \"1F1F5-1F1F2\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t8\n\t\t]\n\t},\n\t\"flag-pn\": {\n\t\ta: \"Pitcairn Islands Flag\",\n\t\tb: \"1F1F5-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t9\n\t\t]\n\t},\n\twind_blowing_face: {\n\t\ta: \"Wind Blowing Face\",\n\t\tb: \"1F32C-FE0F\",\n\t\tc: \"1F32C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t6,\n\t\t\t34\n\t\t],\n\t\to: 7\n\t},\n\tfemale_elf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DD-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 45,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DD-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DD-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DD-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DD-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9dd-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Female Elf\",\n\t\tb: \"1F9DD-200D-2640-FE0F\",\n\t\tc: \"1F9DD-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t45,\n\t\t\t50\n\t\t],\n\t\to: 10\n\t},\n\tlarge_blue_diamond: {\n\t\ta: \"Large Blue Diamond\",\n\t\tb: \"1F537\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t5\n\t\t]\n\t},\n\tmale_elf: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9DD-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9DD-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9DD-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9DD-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9DD-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9DD-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9dd-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 46,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9DD-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9DD\",\n\t\ta: \"Male Elf\",\n\t\tb: \"1F9DD-200D-2642-FE0F\",\n\t\tc: \"1F9DD-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t4\n\t\t],\n\t\to: 10\n\t},\n\tsmall_orange_diamond: {\n\t\ta: \"Small Orange Diamond\",\n\t\tb: \"1F538\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-pr\": {\n\t\ta: \"Puerto Rico Flag\",\n\t\tb: \"1F1F5-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t10\n\t\t]\n\t},\n\tcyclone: {\n\t\ta: \"Cyclone\",\n\t\tb: \"1F300\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"swirl\",\n\t\t\t\"blue\",\n\t\t\t\"cloud\",\n\t\t\t\"vortex\",\n\t\t\t\"spiral\",\n\t\t\t\"whirlpool\",\n\t\t\t\"spin\",\n\t\t\t\"tornado\",\n\t\t\t\"hurricane\",\n\t\t\t\"typhoon\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t44\n\t\t]\n\t},\n\trainbow: {\n\t\ta: \"Rainbow\",\n\t\tb: \"1F308\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"nature\",\n\t\t\t\"happy\",\n\t\t\t\"unicorn_face\",\n\t\t\t\"photo\",\n\t\t\t\"sky\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t0\n\t\t]\n\t},\n\tsmall_blue_diamond: {\n\t\ta: \"Small Blue Diamond\",\n\t\tb: \"1F539\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"jewel\",\n\t\t\t\"gem\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t7\n\t\t]\n\t},\n\tgenie: {\n\t\tobsoleted_by: \"1F9DE-200D-2642-FE0F\",\n\t\ta: \"Genie\",\n\t\tb: \"1F9DE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t18\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-ps\": {\n\t\ta: \"Palestinian Territories Flag\",\n\t\tb: \"1F1F5-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t11\n\t\t]\n\t},\n\tsmall_red_triangle: {\n\t\ta: \"Up-Pointing Red Triangle\",\n\t\tb: \"1F53A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"direction\",\n\t\t\t\"up\",\n\t\t\t\"top\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t8\n\t\t]\n\t},\n\tclosed_umbrella: {\n\t\ta: \"Closed Umbrella\",\n\t\tb: \"1F302\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"weather\",\n\t\t\t\"rain\",\n\t\t\t\"drizzle\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t46\n\t\t]\n\t},\n\tfemale_genie: {\n\t\ta: \"Female Genie\",\n\t\tb: \"1F9DE-200D-2640-FE0F\",\n\t\tc: \"1F9DE-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-pt\": {\n\t\ta: \"Portugal Flag\",\n\t\tb: \"1F1F5-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t12\n\t\t]\n\t},\n\t\"flag-pw\": {\n\t\ta: \"Palau Flag\",\n\t\tb: \"1F1F5-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t13\n\t\t]\n\t},\n\tsmall_red_triangle_down: {\n\t\ta: \"Down-Pointing Red Triangle\",\n\t\tb: \"1F53B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"direction\",\n\t\t\t\"bottom\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t9\n\t\t]\n\t},\n\tumbrella: {\n\t\ta: \"Umbrella\",\n\t\tb: \"2602-FE0F\",\n\t\tc: \"2602\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"rainy\",\n\t\t\t\"weather\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t18\n\t\t],\n\t\to: 1\n\t},\n\tmale_genie: {\n\t\tobsoletes: \"1F9DE\",\n\t\ta: \"Male Genie\",\n\t\tb: \"1F9DE-200D-2642-FE0F\",\n\t\tc: \"1F9DE-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t17\n\t\t],\n\t\to: 10\n\t},\n\tzombie: {\n\t\tobsoleted_by: \"1F9DF-200D-2642-FE0F\",\n\t\ta: \"Zombie\",\n\t\tb: \"1F9DF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t21\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-py\": {\n\t\ta: \"Paraguay Flag\",\n\t\tb: \"1F1F5-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t14\n\t\t]\n\t},\n\tdiamond_shape_with_a_dot_inside: {\n\t\ta: \"Diamond Shape with a Dot Inside\",\n\t\tb: \"1F4A0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"jewel\",\n\t\t\t\"blue\",\n\t\t\t\"gem\",\n\t\t\t\"crystal\",\n\t\t\t\"fancy\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t6\n\t\t]\n\t},\n\tumbrella_with_rain_drops: {\n\t\ta: \"Umbrella with Rain Drops\",\n\t\tb: \"2614\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t47,\n\t\t\t23\n\t\t],\n\t\to: 4\n\t},\n\tradio_button: {\n\t\ta: \"Radio Button\",\n\t\tb: \"1F518\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"input\",\n\t\t\t\"old\",\n\t\t\t\"music\",\n\t\t\t\"circle\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t26\n\t\t]\n\t},\n\tfemale_zombie: {\n\t\ta: \"Female Zombie\",\n\t\tb: \"1F9DF-200D-2640-FE0F\",\n\t\tc: \"1F9DF-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t19\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-qa\": {\n\t\ta: \"Qatar Flag\",\n\t\tb: \"1F1F6-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t15\n\t\t]\n\t},\n\tumbrella_on_ground: {\n\t\ta: \"Umbrella on Ground\",\n\t\tb: \"26F1-FE0F\",\n\t\tc: \"26F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t39\n\t\t],\n\t\to: 5\n\t},\n\tblack_square_button: {\n\t\ta: \"Black Square Button\",\n\t\tb: \"1F532\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"input\",\n\t\t\t\"frame\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t0\n\t\t]\n\t},\n\tzap: {\n\t\ta: \"High Voltage Sign\",\n\t\tb: \"26A1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"thunder\",\n\t\t\t\"weather\",\n\t\t\t\"lightning bolt\",\n\t\t\t\"fast\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t21\n\t\t],\n\t\to: 4\n\t},\n\tmale_zombie: {\n\t\tobsoletes: \"1F9DF\",\n\t\ta: \"Male Zombie\",\n\t\tb: \"1F9DF-200D-2642-FE0F\",\n\t\tc: \"1F9DF-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t20\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-re\": {\n\t\ta: \"Réunion Flag\",\n\t\tb: \"1F1F7-1F1EA\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t16\n\t\t]\n\t},\n\t\"flag-ro\": {\n\t\ta: \"Romania Flag\",\n\t\tb: \"1F1F7-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t17\n\t\t]\n\t},\n\tsnowflake: {\n\t\ta: \"Snowflake\",\n\t\tb: \"2744-FE0F\",\n\t\tc: \"2744\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"winter\",\n\t\t\t\"season\",\n\t\t\t\"cold\",\n\t\t\t\"weather\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t51\n\t\t],\n\t\to: 1\n\t},\n\twhite_square_button: {\n\t\ta: \"White Square Button\",\n\t\tb: \"1F533\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"input\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t1\n\t\t]\n\t},\n\tperson_frowning: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3fe.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64d-1f3ff.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F64D-200D-2640-FE0F\",\n\t\ta: \"Person Frowning\",\n\t\tb: \"1F64D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t33,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-rs\": {\n\t\ta: \"Serbia Flag\",\n\t\tb: \"1F1F7-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t18\n\t\t]\n\t},\n\t\"man-frowning\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64D-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64D-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64D-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64D-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64D-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f64d-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Frowning\",\n\t\tb: \"1F64D-200D-2642-FE0F\",\n\t\tc: \"1F64D-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t24\n\t\t]\n\t},\n\twhite_circle: {\n\t\ta: \"Medium White Circle\",\n\t\tb: \"26AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"round\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t22\n\t\t],\n\t\to: 4\n\t},\n\tsnowman: {\n\t\ta: \"Snowman\",\n\t\tb: \"2603-FE0F\",\n\t\tc: \"2603\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"winter\",\n\t\t\t\"season\",\n\t\t\t\"cold\",\n\t\t\t\"weather\",\n\t\t\t\"christmas\",\n\t\t\t\"xmas\",\n\t\t\t\"frozen\",\n\t\t\t\"without_snow\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t19\n\t\t],\n\t\to: 1\n\t},\n\tsnowman_without_snow: {\n\t\ta: \"Snowman Without Snow\",\n\t\tb: \"26C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t48,\n\t\t\t28\n\t\t],\n\t\to: 5\n\t},\n\tru: {\n\t\ta: \"Russia Flag\",\n\t\tb: \"1F1F7-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"russian\",\n\t\t\t\"federation\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t4,\n\t\t\t19\n\t\t],\n\t\tn: [\n\t\t\t\"flag-ru\"\n\t\t]\n\t},\n\tblack_circle: {\n\t\ta: \"Medium Black Circle\",\n\t\tb: \"26AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"button\",\n\t\t\t\"round\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t23\n\t\t],\n\t\to: 4\n\t},\n\t\"woman-frowning\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64D-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64D-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64D-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64D-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64D-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64D-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f64d-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F64D\",\n\t\ta: \"Woman Frowning\",\n\t\tb: \"1F64D-200D-2640-FE0F\",\n\t\tc: \"1F64D-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t18\n\t\t]\n\t},\n\t\"flag-rw\": {\n\t\ta: \"Rwanda Flag\",\n\t\tb: \"1F1F7-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t20\n\t\t]\n\t},\n\tcomet: {\n\t\ta: \"Comet\",\n\t\tb: \"2604-FE0F\",\n\t\tc: \"2604\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"space\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t20\n\t\t],\n\t\to: 1\n\t},\n\tperson_with_pouting_face: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3fe.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64e-1f3ff.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F64E-200D-2640-FE0F\",\n\t\ta: \"Person with Pouting Face\",\n\t\tb: \"1F64E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t33,\n\t\t\t48\n\t\t]\n\t},\n\tred_circle: {\n\t\ta: \"Large Red Circle\",\n\t\tb: \"1F534\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"error\",\n\t\t\t\"danger\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t2\n\t\t]\n\t},\n\tlarge_blue_circle: {\n\t\ta: \"Large Blue Circle\",\n\t\tb: \"1F535\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shape\",\n\t\t\t\"icon\",\n\t\t\t\"button\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-pouting\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64E-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64E-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64E-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64E-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64E-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f64e-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Pouting\",\n\t\tb: \"1F64E-200D-2642-FE0F\",\n\t\tc: \"1F64E-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t42\n\t\t]\n\t},\n\t\"flag-sa\": {\n\t\ta: \"Saudi Arabia Flag\",\n\t\tb: \"1F1F8-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t21\n\t\t]\n\t},\n\tfire: {\n\t\ta: \"Fire\",\n\t\tb: \"1F525\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hot\",\n\t\t\t\"cook\",\n\t\t\t\"flame\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t39\n\t\t]\n\t},\n\t\"woman-pouting\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64E-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64E-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64E-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64E-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64E-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64E-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f64e-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F64E\",\n\t\ta: \"Woman Pouting\",\n\t\tb: \"1F64E-200D-2640-FE0F\",\n\t\tc: \"1F64E-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t36\n\t\t]\n\t},\n\t\"flag-sb\": {\n\t\ta: \"Solomon Islands Flag\",\n\t\tb: \"1F1F8-1F1E7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t22\n\t\t]\n\t},\n\tdroplet: {\n\t\ta: \"Droplet\",\n\t\tb: \"1F4A7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"water\",\n\t\t\t\"drip\",\n\t\t\t\"faucet\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t13\n\t\t]\n\t},\n\tno_good: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F645-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fb.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F645-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fc.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F645-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fd.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F645-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3fe.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F645-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f645-1f3ff.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F645-200D-2640-FE0F\",\n\t\ta: \"Face with No Good Gesture\",\n\t\tb: \"1F645\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t32,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-sc\": {\n\t\ta: \"Seychelles Flag\",\n\t\tb: \"1F1F8-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t23\n\t\t]\n\t},\n\tocean: {\n\t\ta: \"Water Wave\",\n\t\tb: \"1F30A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sea\",\n\t\t\t\"water\",\n\t\t\t\"wave\",\n\t\t\t\"nature\",\n\t\t\t\"tsunami\",\n\t\t\t\"disaster\"\n\t\t],\n\t\tk: [\n\t\t\t6,\n\t\t\t2\n\t\t]\n\t},\n\t\"man-gesturing-no\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F645-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F645-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F645-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F645-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f645-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F645-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f645-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Gesturing No\",\n\t\tb: \"1F645-200D-2642-FE0F\",\n\t\tc: \"1F645-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t31,\n\t\t\t47\n\t\t]\n\t},\n\t\"flag-sd\": {\n\t\ta: \"Sudan Flag\",\n\t\tb: \"1F1F8-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t24\n\t\t]\n\t},\n\t\"woman-gesturing-no\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F645-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F645-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F645-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F645-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f645-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F645-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F645-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f645-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 31,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F645\",\n\t\ta: \"Woman Gesturing No\",\n\t\tb: \"1F645-200D-2640-FE0F\",\n\t\tc: \"1F645-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t31,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-se\": {\n\t\ta: \"Sweden Flag\",\n\t\tb: \"1F1F8-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-sg\": {\n\t\ta: \"Singapore Flag\",\n\t\tb: \"1F1F8-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t26\n\t\t]\n\t},\n\tok_woman: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F646-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fb.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F646-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fc.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F646-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fd.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F646-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3fe.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F646-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f646-1f3ff.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F646-200D-2640-FE0F\",\n\t\ta: \"Face with Ok Gesture\",\n\t\tb: \"1F646\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"women\",\n\t\t\t\"girl\",\n\t\t\t\"female\",\n\t\t\t\"pink\",\n\t\t\t\"human\",\n\t\t\t\"woman\"\n\t\t],\n\t\tk: [\n\t\t\t32,\n\t\t\t19\n\t\t]\n\t},\n\t\"flag-sh\": {\n\t\ta: \"St. Helena Flag\",\n\t\tb: \"1F1F8-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t27\n\t\t]\n\t},\n\t\"man-gesturing-ok\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F646-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F646-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F646-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F646-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f646-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F646-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f646-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Gesturing Ok\",\n\t\tb: \"1F646-200D-2642-FE0F\",\n\t\tc: \"1F646-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-si\": {\n\t\ta: \"Slovenia Flag\",\n\t\tb: \"1F1F8-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t28\n\t\t]\n\t},\n\t\"woman-gesturing-ok\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F646-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F646-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F646-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F646-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f646-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F646-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F646-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f646-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F646\",\n\t\ta: \"Woman Gesturing Ok\",\n\t\tb: \"1F646-200D-2640-FE0F\",\n\t\tc: \"1F646-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t7\n\t\t]\n\t},\n\tinformation_desk_person: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F481-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F481-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F481-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F481-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F481-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f481-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F481-200D-2640-FE0F\",\n\t\ta: \"Information Desk Person\",\n\t\tb: \"1F481\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t23,\n\t\t\t13\n\t\t]\n\t},\n\t\"flag-sj\": {\n\t\ta: \"Svalbard & Jan Mayen Flag\",\n\t\tb: \"1F1F8-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t29\n\t\t]\n\t},\n\t\"man-tipping-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F481-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F481-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F481-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F481-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f481-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F481-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f481-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Tipping Hand\",\n\t\tb: \"1F481-200D-2642-FE0F\",\n\t\tc: \"1F481-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t7\n\t\t]\n\t},\n\t\"flag-sk\": {\n\t\ta: \"Slovakia Flag\",\n\t\tb: \"1F1F8-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t30\n\t\t]\n\t},\n\t\"flag-sl\": {\n\t\ta: \"Sierra Leone Flag\",\n\t\tb: \"1F1F8-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t31\n\t\t]\n\t},\n\t\"woman-tipping-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F481-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F481-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F481-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F481-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f481-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F481-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F481-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f481-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F481\",\n\t\ta: \"Woman Tipping Hand\",\n\t\tb: \"1F481-200D-2640-FE0F\",\n\t\tc: \"1F481-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-sm\": {\n\t\ta: \"San Marino Flag\",\n\t\tb: \"1F1F8-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t32\n\t\t]\n\t},\n\traising_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3fe.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64b-1f3ff.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F64B-200D-2640-FE0F\",\n\t\ta: \"Happy Person Raising One Hand\",\n\t\tb: \"1F64B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t33,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-sn\": {\n\t\ta: \"Senegal Flag\",\n\t\tb: \"1F1F8-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t33\n\t\t]\n\t},\n\t\"man-raising-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64B-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64B-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64B-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64B-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64B-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f64b-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Raising Hand\",\n\t\tb: \"1F64B-200D-2642-FE0F\",\n\t\tc: \"1F64B-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t33,\n\t\t\t0\n\t\t]\n\t},\n\t\"flag-so\": {\n\t\ta: \"Somalia Flag\",\n\t\tb: \"1F1F8-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t34\n\t\t]\n\t},\n\t\"woman-raising-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64B-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64B-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64B-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64B-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64B-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F64B-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f64b-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F64B\",\n\t\ta: \"Woman Raising Hand\",\n\t\tb: \"1F64B-200D-2640-FE0F\",\n\t\tc: \"1F64B-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t46\n\t\t]\n\t},\n\t\"flag-sr\": {\n\t\ta: \"Suriname Flag\",\n\t\tb: \"1F1F8-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t35\n\t\t]\n\t},\n\tbow: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F647-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fb.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F647-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fc.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F647-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fd.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F647-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3fe.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F647-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f647-1f3ff.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F647-200D-2642-FE0F\",\n\t\ta: \"Person Bowing Deeply\",\n\t\tb: \"1F647\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t32,\n\t\t\t37\n\t\t]\n\t},\n\t\"man-bowing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F647-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F647-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F647-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F647-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f647-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F647-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f647-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F647\",\n\t\ta: \"Man Bowing\",\n\t\tb: \"1F647-200D-2642-FE0F\",\n\t\tc: \"1F647-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t31\n\t\t]\n\t},\n\t\"flag-ss\": {\n\t\ta: \"South Sudan Flag\",\n\t\tb: \"1F1F8-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t36\n\t\t]\n\t},\n\t\"woman-bowing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F647-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F647-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F647-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F647-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f647-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F647-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F647-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f647-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 32,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Bowing\",\n\t\tb: \"1F647-200D-2640-FE0F\",\n\t\tc: \"1F647-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t32,\n\t\t\t25\n\t\t]\n\t},\n\t\"flag-st\": {\n\t\ta: \"São Tomé & Príncipe Flag\",\n\t\tb: \"1F1F8-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t37\n\t\t]\n\t},\n\tface_palm: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F926-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F926-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F926-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F926-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F926-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f926-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Face Palm\",\n\t\tb: \"1F926\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t41\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-sv\": {\n\t\ta: \"El Salvador Flag\",\n\t\tb: \"1F1F8-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t38\n\t\t]\n\t},\n\t\"man-facepalming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F926-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F926-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F926-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F926-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f926-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F926-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f926-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Facepalming\",\n\t\tb: \"1F926-200D-2642-FE0F\",\n\t\tc: \"1F926-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t35\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-sx\": {\n\t\ta: \"Sint Maarten Flag\",\n\t\tb: \"1F1F8-1F1FD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t39\n\t\t]\n\t},\n\t\"flag-sy\": {\n\t\ta: \"Syria Flag\",\n\t\tb: \"1F1F8-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t40\n\t\t]\n\t},\n\t\"woman-facepalming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F926-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F926-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F926-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F926-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f926-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F926-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F926-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f926-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Facepalming\",\n\t\tb: \"1F926-200D-2640-FE0F\",\n\t\tc: \"1F926-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t29\n\t\t],\n\t\to: 9\n\t},\n\tshrug: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F937-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fb.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F937-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fc.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F937-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fd.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F937-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3fe.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F937-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f937-1f3ff.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Shrug\",\n\t\tb: \"1F937\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-sz\": {\n\t\ta: \"Swaziland Flag\",\n\t\tb: \"1F1F8-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-ta\": {\n\t\ta: \"Tristan Da Cunha Flag\",\n\t\tb: \"1F1F9-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t42\n\t\t]\n\t},\n\t\"man-shrugging\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F937-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F937-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F937-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F937-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f937-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F937-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f937-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Shrugging\",\n\t\tb: \"1F937-200D-2642-FE0F\",\n\t\tc: \"1F937-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t0\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-shrugging\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F937-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F937-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F937-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F937-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f937-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F937-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F937-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f937-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Shrugging\",\n\t\tb: \"1F937-200D-2640-FE0F\",\n\t\tc: \"1F937-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t46\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-tc\": {\n\t\ta: \"Turks & Caicos Islands Flag\",\n\t\tb: \"1F1F9-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t43\n\t\t]\n\t},\n\tmassage: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F486-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fb.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F486-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fc.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F486-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fd.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F486-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3fe.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F486-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f486-1f3ff.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F486-200D-2640-FE0F\",\n\t\ta: \"Face Massage\",\n\t\tb: \"1F486\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t10\n\t\t]\n\t},\n\t\"flag-td\": {\n\t\ta: \"Chad Flag\",\n\t\tb: \"1F1F9-1F1E9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t44\n\t\t]\n\t},\n\t\"man-getting-massage\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F486-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F486-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F486-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F486-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f486-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F486-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f486-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Getting Massage\",\n\t\tb: \"1F486-200D-2642-FE0F\",\n\t\tc: \"1F486-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t24,\n\t\t\t4\n\t\t]\n\t},\n\t\"flag-tf\": {\n\t\ta: \"French Southern Territories Flag\",\n\t\tb: \"1F1F9-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t45\n\t\t]\n\t},\n\t\"woman-getting-massage\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F486-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F486-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F486-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F486-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f486-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F486-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F486-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f486-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F486\",\n\t\ta: \"Woman Getting Massage\",\n\t\tb: \"1F486-200D-2640-FE0F\",\n\t\tc: \"1F486-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t23,\n\t\t\t50\n\t\t]\n\t},\n\t\"flag-tg\": {\n\t\ta: \"Togo Flag\",\n\t\tb: \"1F1F9-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t46\n\t\t]\n\t},\n\thaircut: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F487-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fb.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F487-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fc.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F487-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fd.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F487-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3fe.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F487-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f487-1f3ff.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F487-200D-2640-FE0F\",\n\t\ta: \"Haircut\",\n\t\tb: \"1F487\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t28\n\t\t]\n\t},\n\t\"flag-th\": {\n\t\ta: \"Thailand Flag\",\n\t\tb: \"1F1F9-1F1ED\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t47\n\t\t]\n\t},\n\t\"man-getting-haircut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F487-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F487-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F487-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F487-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f487-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F487-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f487-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Getting Haircut\",\n\t\tb: \"1F487-200D-2642-FE0F\",\n\t\tc: \"1F487-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t24,\n\t\t\t22\n\t\t]\n\t},\n\t\"flag-tj\": {\n\t\ta: \"Tajikistan Flag\",\n\t\tb: \"1F1F9-1F1EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t48\n\t\t]\n\t},\n\t\"flag-tk\": {\n\t\ta: \"Tokelau Flag\",\n\t\tb: \"1F1F9-1F1F0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t49\n\t\t]\n\t},\n\t\"woman-getting-haircut\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F487-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F487-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F487-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F487-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f487-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F487-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F487-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f487-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 24,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F487\",\n\t\ta: \"Woman Getting Haircut\",\n\t\tb: \"1F487-200D-2640-FE0F\",\n\t\tc: \"1F487-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t24,\n\t\t\t16\n\t\t]\n\t},\n\twalking: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B6-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B6-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B6-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B6-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3fe.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B6-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b6-1f3ff.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6B6-200D-2642-FE0F\",\n\t\ta: \"Pedestrian\",\n\t\tb: \"1F6B6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t36,\n\t\t\t21\n\t\t]\n\t},\n\t\"flag-tl\": {\n\t\ta: \"Timor-Leste Flag\",\n\t\tb: \"1F1F9-1F1F1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t50\n\t\t]\n\t},\n\t\"man-walking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B6-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B6-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B6-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B6-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B6-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6b6-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6B6\",\n\t\ta: \"Man Walking\",\n\t\tb: \"1F6B6-200D-2642-FE0F\",\n\t\tc: \"1F6B6-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t36,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-tm\": {\n\t\ta: \"Turkmenistan Flag\",\n\t\tb: \"1F1F9-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t4,\n\t\t\t51\n\t\t]\n\t},\n\t\"woman-walking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B6-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B6-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B6-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B6-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B6-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B6-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6b6-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Walking\",\n\t\tb: \"1F6B6-200D-2640-FE0F\",\n\t\tc: \"1F6B6-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t36,\n\t\t\t9\n\t\t]\n\t},\n\t\"flag-tn\": {\n\t\ta: \"Tunisia Flag\",\n\t\tb: \"1F1F9-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t0\n\t\t]\n\t},\n\trunner: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C3-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fb.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C3-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fc.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C3-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fd.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C3-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3fe.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C3-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c3-1f3ff.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3C3-200D-2642-FE0F\",\n\t\ta: \"Runner\",\n\t\tb: \"1F3C3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t9,\n\t\t\t46\n\t\t],\n\t\tn: [\n\t\t\t\"running\"\n\t\t]\n\t},\n\t\"flag-to\": {\n\t\ta: \"Tonga Flag\",\n\t\tb: \"1F1F9-1F1F4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t1\n\t\t]\n\t},\n\t\"man-running\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C3-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C3-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C3-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C3-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C3-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3c3-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3C3\",\n\t\ta: \"Man Running\",\n\t\tb: \"1F3C3-200D-2642-FE0F\",\n\t\tc: \"1F3C3-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t9,\n\t\t\t40\n\t\t]\n\t},\n\t\"flag-tr\": {\n\t\ta: \"Turkey Flag\",\n\t\tb: \"1F1F9-1F1F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t2\n\t\t]\n\t},\n\t\"flag-tt\": {\n\t\ta: \"Trinidad & Tobago Flag\",\n\t\tb: \"1F1F9-1F1F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t3\n\t\t]\n\t},\n\t\"woman-running\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C3-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C3-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C3-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C3-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C3-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C3-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3c3-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Running\",\n\t\tb: \"1F3C3-200D-2640-FE0F\",\n\t\tc: \"1F3C3-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t9,\n\t\t\t34\n\t\t]\n\t},\n\t\"flag-tv\": {\n\t\ta: \"Tuvalu Flag\",\n\t\tb: \"1F1F9-1F1FB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t4\n\t\t]\n\t},\n\tdancer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F483-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F483-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F483-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F483-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F483-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f483-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Dancer\",\n\t\tb: \"1F483\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"girl\",\n\t\t\t\"woman\",\n\t\t\t\"fun\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t37\n\t\t]\n\t},\n\t\"flag-tw\": {\n\t\ta: \"Taiwan Flag\",\n\t\tb: \"1F1F9-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t5\n\t\t]\n\t},\n\tman_dancing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F57A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F57A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F57A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F57A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F57A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f57a-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Dancing\",\n\t\tb: \"1F57A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"male\",\n\t\t\t\"boy\",\n\t\t\t\"fun\",\n\t\t\t\"dancer\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t21\n\t\t],\n\t\to: 9\n\t},\n\tdancers: {\n\t\tobsoleted_by: \"1F46F-200D-2640-FE0F\",\n\t\ta: \"Woman with Bunny Ears\",\n\t\tb: \"1F46F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t21,\n\t\t\t1\n\t\t]\n\t},\n\t\"flag-tz\": {\n\t\ta: \"Tanzania Flag\",\n\t\tb: \"1F1F9-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t6\n\t\t]\n\t},\n\t\"flag-ua\": {\n\t\ta: \"Ukraine Flag\",\n\t\tb: \"1F1FA-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t7\n\t\t]\n\t},\n\t\"man-with-bunny-ears-partying\": {\n\t\ta: \"Man with Bunny Ears Partying\",\n\t\tb: \"1F46F-200D-2642-FE0F\",\n\t\tc: \"1F46F-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t21,\n\t\t\t0\n\t\t]\n\t},\n\t\"woman-with-bunny-ears-partying\": {\n\t\tobsoletes: \"1F46F\",\n\t\ta: \"Woman with Bunny Ears Partying\",\n\t\tb: \"1F46F-200D-2640-FE0F\",\n\t\tc: \"1F46F-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t51\n\t\t]\n\t},\n\t\"flag-ug\": {\n\t\ta: \"Uganda Flag\",\n\t\tb: \"1F1FA-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t8\n\t\t]\n\t},\n\t\"flag-um\": {\n\t\ta: \"U.s. Outlying Islands Flag\",\n\t\tb: \"1F1FA-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t9\n\t\t]\n\t},\n\tperson_in_steamy_room: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D6-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fb.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FB-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D6-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fc.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FC-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D6-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fd.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FD-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D6-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3fe.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FE-200D-2642-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D6-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d6-1f3ff.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D6-1F3FF-200D-2642-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D6-200D-2642-FE0F\",\n\t\ta: \"Person in Steamy Room\",\n\t\tb: \"1F9D6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t40\n\t\t],\n\t\to: 10\n\t},\n\twoman_in_steamy_room: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D6-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D6-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D6-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D6-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D6-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d6-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman in Steamy Room\",\n\t\tb: \"1F9D6-200D-2640-FE0F\",\n\t\tc: \"1F9D6-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t28\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-un\": {\n\t\ta: \"United Nations Flag\",\n\t\tb: \"1F1FA-1F1F3\",\n\t\td: false,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t5,\n\t\t\t10\n\t\t]\n\t},\n\tus: {\n\t\ta: \"United States Flag\",\n\t\tb: \"1F1FA-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"united\",\n\t\t\t\"states\",\n\t\t\t\"america\",\n\t\t\t\"flag\",\n\t\t\t\"nation\",\n\t\t\t\"country\",\n\t\t\t\"banner\"\n\t\t],\n\t\tk: [\n\t\t\t5,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"flag-us\"\n\t\t]\n\t},\n\tman_in_steamy_room: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D6-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D6-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D6-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D6-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D6-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D6-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d6-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D6-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D6\",\n\t\ta: \"Man in Steamy Room\",\n\t\tb: \"1F9D6-200D-2642-FE0F\",\n\t\tc: \"1F9D6-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t34\n\t\t],\n\t\to: 10\n\t},\n\tperson_climbing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D7-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fb.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D7-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fc.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D7-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fd.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D7-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3fe.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D7-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d7-1f3ff.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D7-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D7-200D-2640-FE0F\",\n\t\ta: \"Person Climbing\",\n\t\tb: \"1F9D7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t6\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-uy\": {\n\t\ta: \"Uruguay Flag\",\n\t\tb: \"1F1FA-1F1FE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t12\n\t\t]\n\t},\n\twoman_climbing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D7-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D7-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D7-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D7-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D7-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d7-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 43,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D7-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D7\",\n\t\ta: \"Woman Climbing\",\n\t\tb: \"1F9D7-200D-2640-FE0F\",\n\t\tc: \"1F9D7-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t43,\n\t\t\t46\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-uz\": {\n\t\ta: \"Uzbekistan Flag\",\n\t\tb: \"1F1FA-1F1FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t13\n\t\t]\n\t},\n\tman_climbing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D7-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D7-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D7-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D7-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D7-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D7-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d7-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Climbing\",\n\t\tb: \"1F9D7-200D-2642-FE0F\",\n\t\tc: \"1F9D7-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t0\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-va\": {\n\t\ta: \"Vatican City Flag\",\n\t\tb: \"1F1FB-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t14\n\t\t]\n\t},\n\tperson_in_lotus_position: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D8-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fb.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FB-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D8-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fc.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FC-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D8-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fd.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FD-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D8-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3fe.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FE-200D-2640-FE0F\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D8-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f9d8-1f3ff.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoleted_by: \"1F9D8-1F3FF-200D-2640-FE0F\"\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F9D8-200D-2640-FE0F\",\n\t\ta: \"Person in Lotus Position\",\n\t\tb: \"1F9D8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t24\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-vc\": {\n\t\ta: \"St. Vincent & Grenadines Flag\",\n\t\tb: \"1F1FB-1F1E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t15\n\t\t]\n\t},\n\t\"flag-ve\": {\n\t\ta: \"Venezuela Flag\",\n\t\tb: \"1F1FB-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t16\n\t\t]\n\t},\n\twoman_in_lotus_position: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D8-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FB\"\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D8-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FC\"\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D8-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FD\"\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D8-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FE\"\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D8-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f9d8-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false,\n\t\t\t\tobsoletes: \"1F9D8-1F3FF\"\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F9D8\",\n\t\ta: \"Woman in Lotus Position\",\n\t\tb: \"1F9D8-200D-2640-FE0F\",\n\t\tc: \"1F9D8-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t12\n\t\t],\n\t\to: 10\n\t},\n\tman_in_lotus_position: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F9D8-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F9D8-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F9D8-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F9D8-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F9D8-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F9D8-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f9d8-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 44,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man in Lotus Position\",\n\t\tb: \"1F9D8-200D-2642-FE0F\",\n\t\tc: \"1F9D8-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t44,\n\t\t\t18\n\t\t],\n\t\to: 10\n\t},\n\t\"flag-vg\": {\n\t\ta: \"British Virgin Islands Flag\",\n\t\tb: \"1F1FB-1F1EC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t17\n\t\t]\n\t},\n\t\"flag-vi\": {\n\t\ta: \"U.s. Virgin Islands Flag\",\n\t\tb: \"1F1FB-1F1EE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t18\n\t\t]\n\t},\n\tbath: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6C0-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6C0-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6C0-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6C0-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3fe.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6C0-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6c0-1f3ff.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Bath\",\n\t\tb: \"1F6C0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clean\",\n\t\t\t\"shower\",\n\t\t\t\"bathroom\"\n\t\t],\n\t\tk: [\n\t\t\t36,\n\t\t\t36\n\t\t]\n\t},\n\tsleeping_accommodation: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6CC-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6CC-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6CC-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6CC-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6CC-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6cc-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Sleeping Accommodation\",\n\t\tb: \"1F6CC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t36,\n\t\t\t48\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-vn\": {\n\t\ta: \"Vietnam Flag\",\n\t\tb: \"1F1FB-1F1F3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t19\n\t\t]\n\t},\n\tman_in_business_suit_levitating: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F574-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fb.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F574-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fc.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F574-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fd.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F574-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3fe.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F574-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f574-1f3ff.png\",\n\t\t\t\tsheet_x: 28,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man in Business Suit Levitating\",\n\t\tb: \"1F574-FE0F\",\n\t\tc: \"1F574\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t28,\n\t\t\t45\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-vu\": {\n\t\ta: \"Vanuatu Flag\",\n\t\tb: \"1F1FB-1F1FA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t20\n\t\t]\n\t},\n\t\"flag-wf\": {\n\t\ta: \"Wallis & Futuna Flag\",\n\t\tb: \"1F1FC-1F1EB\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t21\n\t\t]\n\t},\n\tspeaking_head_in_silhouette: {\n\t\ta: \"Speaking Head in Silhouette\",\n\t\tb: \"1F5E3-FE0F\",\n\t\tc: \"1F5E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t30,\n\t\t\t14\n\t\t],\n\t\to: 7\n\t},\n\tbust_in_silhouette: {\n\t\ta: \"Bust in Silhouette\",\n\t\tb: \"1F464\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"user\",\n\t\t\t\"person\",\n\t\t\t\"human\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t40\n\t\t]\n\t},\n\t\"flag-ws\": {\n\t\ta: \"Samoa Flag\",\n\t\tb: \"1F1FC-1F1F8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t22\n\t\t]\n\t},\n\tbusts_in_silhouette: {\n\t\ta: \"Busts in Silhouette\",\n\t\tb: \"1F465\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"user\",\n\t\t\t\"person\",\n\t\t\t\"human\",\n\t\t\t\"group\",\n\t\t\t\"team\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t41\n\t\t]\n\t},\n\t\"flag-xk\": {\n\t\ta: \"Kosovo Flag\",\n\t\tb: \"1F1FD-1F1F0\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t23\n\t\t]\n\t},\n\tfencer: {\n\t\ta: \"Fencer\",\n\t\tb: \"1F93A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t48\n\t\t],\n\t\to: 9\n\t},\n\t\"flag-ye\": {\n\t\ta: \"Yemen Flag\",\n\t\tb: \"1F1FE-1F1EA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t24\n\t\t]\n\t},\n\t\"flag-yt\": {\n\t\ta: \"Mayotte Flag\",\n\t\tb: \"1F1FE-1F1F9\",\n\t\td: true,\n\t\te: false,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t25\n\t\t]\n\t},\n\thorse_racing: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C7-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fb.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C7-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fc.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C7-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fd.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C7-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3fe.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C7-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c7-1f3ff.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Horse Racing\",\n\t\tb: \"1F3C7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"animal\",\n\t\t\t\"betting\",\n\t\t\t\"competition\",\n\t\t\t\"gambling\",\n\t\t\t\"luck\"\n\t\t],\n\t\tk: [\n\t\t\t10,\n\t\t\t20\n\t\t]\n\t},\n\t\"flag-za\": {\n\t\ta: \"South Africa Flag\",\n\t\tb: \"1F1FF-1F1E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t26\n\t\t]\n\t},\n\tskier: {\n\t\ta: \"Skier\",\n\t\tb: \"26F7-FE0F\",\n\t\tc: \"26F7\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"winter\",\n\t\t\t\"snow\"\n\t\t],\n\t\tk: [\n\t\t\t48,\n\t\t\t44\n\t\t],\n\t\to: 5\n\t},\n\t\"flag-zm\": {\n\t\ta: \"Zambia Flag\",\n\t\tb: \"1F1FF-1F1F2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t27\n\t\t]\n\t},\n\tsnowboarder: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C2-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fb.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C2-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fc.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C2-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fd.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C2-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3fe.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C2-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c2-1f3ff.png\",\n\t\t\t\tsheet_x: 9,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Snowboarder\",\n\t\tb: \"1F3C2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"winter\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t28\n\t\t]\n\t},\n\tgolfer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CC-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fb.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CC-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fc.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CC-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fd.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CC-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3fe.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CC-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cc-1f3ff.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3CC-FE0F-200D-2642-FE0F\",\n\t\ta: \"Golfer\",\n\t\tb: \"1F3CC-FE0F\",\n\t\tc: \"1F3CC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t24\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-zw\": {\n\t\ta: \"Zimbabwe Flag\",\n\t\tb: \"1F1FF-1F1FC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t5,\n\t\t\t28\n\t\t]\n\t},\n\t\"man-golfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CC-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CC-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CC-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CC-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CC-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3cc-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3CC-FE0F\",\n\t\ta: \"Man Golfing\",\n\t\tb: \"1F3CC-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-england\": {\n\t\ta: \"England Flag\",\n\t\tb: \"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t16\n\t\t],\n\t\to: 7\n\t},\n\t\"woman-golfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CC-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CC-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CC-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CC-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CC-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CC-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3cc-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Golfing\",\n\t\tb: \"1F3CC-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t12\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-scotland\": {\n\t\ta: \"Scotland Flag\",\n\t\tb: \"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\t\"flag-wales\": {\n\t\ta: \"Wales Flag\",\n\t\tb: \"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t12,\n\t\t\t18\n\t\t],\n\t\to: 7\n\t},\n\tsurfer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C4-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fb.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C4-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fc.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C4-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fd.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C4-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3fe.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C4-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3c4-1f3ff.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3C4-200D-2642-FE0F\",\n\t\ta: \"Surfer\",\n\t\tb: \"1F3C4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t10,\n\t\t\t12\n\t\t]\n\t},\n\t\"man-surfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C4-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C4-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C4-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C4-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C4-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3c4-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3C4\",\n\t\ta: \"Man Surfing\",\n\t\tb: \"1F3C4-200D-2642-FE0F\",\n\t\tc: \"1F3C4-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t6\n\t\t]\n\t},\n\t\"woman-surfing\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3C4-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3C4-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3C4-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3C4-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3C4-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3C4-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3c4-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Surfing\",\n\t\tb: \"1F3C4-200D-2640-FE0F\",\n\t\tc: \"1F3C4-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t0\n\t\t]\n\t},\n\trowboat: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6A3-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fb.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6A3-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fc.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6A3-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fd.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6A3-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3fe.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6A3-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6a3-1f3ff.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6A3-200D-2642-FE0F\",\n\t\ta: \"Rowboat\",\n\t\tb: \"1F6A3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t35,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-rowing-boat\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6A3-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6A3-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6A3-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6A3-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6A3-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6a3-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6A3\",\n\t\ta: \"Man Rowing Boat\",\n\t\tb: \"1F6A3-200D-2642-FE0F\",\n\t\tc: \"1F6A3-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t34,\n\t\t\t49\n\t\t]\n\t},\n\t\"woman-rowing-boat\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6A3-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6A3-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6A3-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6A3-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6A3-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6A3-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6a3-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Rowing Boat\",\n\t\tb: \"1F6A3-200D-2640-FE0F\",\n\t\tc: \"1F6A3-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t34,\n\t\t\t43\n\t\t]\n\t},\n\tswimmer: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CA-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fb.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CA-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fc.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CA-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fd.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CA-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3fe.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CA-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3ca-1f3ff.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3CA-200D-2642-FE0F\",\n\t\ta: \"Swimmer\",\n\t\tb: \"1F3CA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t10,\n\t\t\t40\n\t\t]\n\t},\n\t\"man-swimming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CA-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CA-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CA-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CA-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CA-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3ca-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3CA\",\n\t\ta: \"Man Swimming\",\n\t\tb: \"1F3CA-200D-2642-FE0F\",\n\t\tc: \"1F3CA-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t34\n\t\t]\n\t},\n\t\"woman-swimming\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CA-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CA-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CA-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CA-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CA-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CA-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3ca-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Swimming\",\n\t\tb: \"1F3CA-200D-2640-FE0F\",\n\t\tc: \"1F3CA-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t28\n\t\t]\n\t},\n\tperson_with_ball: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"26F9-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"26F9-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"26F9-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"26F9-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"26F9-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"26f9-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"26F9-FE0F-200D-2642-FE0F\",\n\t\ta: \"Person with Ball\",\n\t\tb: \"26F9-FE0F\",\n\t\tc: \"26F9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t49,\n\t\t\t6\n\t\t],\n\t\to: 5\n\t},\n\t\"man-bouncing-ball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"26F9-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FB-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"26F9-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FC-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"26F9-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FD-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"26F9-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FE-200D-2642\",\n\t\t\t\timage: \"26f9-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"26F9-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FF-200D-2642\",\n\t\t\t\timage: \"26f9-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"26F9-FE0F\",\n\t\ta: \"Man Bouncing Ball\",\n\t\tb: \"26F9-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t49,\n\t\t\t0\n\t\t],\n\t\to: 5\n\t},\n\t\"woman-bouncing-ball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"26F9-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FB-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"26F9-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FC-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"26F9-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FD-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"26F9-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FE-200D-2640\",\n\t\t\t\timage: \"26f9-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"26F9-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"26F9-1F3FF-200D-2640\",\n\t\t\t\timage: \"26f9-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 48,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Bouncing Ball\",\n\t\tb: \"26F9-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t46\n\t\t],\n\t\to: 5\n\t},\n\tweight_lifter: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CB-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fb.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CB-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fc.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CB-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fd.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CB-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3fe.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CB-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f3cb-1f3ff.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F3CB-FE0F-200D-2642-FE0F\",\n\t\ta: \"Weight Lifter\",\n\t\tb: \"1F3CB-FE0F\",\n\t\tc: \"1F3CB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t6\n\t\t],\n\t\to: 7\n\t},\n\t\"man-lifting-weights\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CB-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CB-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CB-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CB-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CB-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f3cb-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 11,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F3CB-FE0F\",\n\t\ta: \"Man Lifting Weights\",\n\t\tb: \"1F3CB-FE0F-200D-2642-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t0\n\t\t],\n\t\to: 7\n\t},\n\t\"woman-lifting-weights\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F3CB-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F3CB-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F3CB-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F3CB-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F3CB-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F3CB-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f3cb-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 10,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Lifting Weights\",\n\t\tb: \"1F3CB-FE0F-200D-2640-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t10,\n\t\t\t46\n\t\t],\n\t\to: 7\n\t},\n\tbicyclist: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B4-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fb.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B4-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fc.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B4-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fd.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B4-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3fe.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B4-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b4-1f3ff.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6B4-200D-2642-FE0F\",\n\t\ta: \"Bicyclist\",\n\t\tb: \"1F6B4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t35,\n\t\t\t37\n\t\t]\n\t},\n\t\"man-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B4-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B4-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B4-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B4-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B4-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6b4-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6B4\",\n\t\ta: \"Man Biking\",\n\t\tb: \"1F6B4-200D-2642-FE0F\",\n\t\tc: \"1F6B4-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t31\n\t\t]\n\t},\n\t\"woman-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B4-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B4-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B4-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B4-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B4-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B4-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6b4-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Biking\",\n\t\tb: \"1F6B4-200D-2640-FE0F\",\n\t\tc: \"1F6B4-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t25\n\t\t]\n\t},\n\tmountain_bicyclist: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B5-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fb.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B5-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fc.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B5-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fd.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B5-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3fe.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B5-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f6b5-1f3ff.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\tobsoleted_by: \"1F6B5-200D-2642-FE0F\",\n\t\ta: \"Mountain Bicyclist\",\n\t\tb: \"1F6B5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t36,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-mountain-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B5-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B5-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B5-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B5-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B5-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f6b5-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 36,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\tobsoletes: \"1F6B5\",\n\t\ta: \"Man Mountain Biking\",\n\t\tb: \"1F6B5-200D-2642-FE0F\",\n\t\tc: \"1F6B5-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t49\n\t\t]\n\t},\n\t\"woman-mountain-biking\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F6B5-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F6B5-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F6B5-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F6B5-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F6B5-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F6B5-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f6b5-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 35,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Mountain Biking\",\n\t\tb: \"1F6B5-200D-2640-FE0F\",\n\t\tc: \"1F6B5-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t35,\n\t\t\t43\n\t\t]\n\t},\n\tracing_car: {\n\t\ta: \"Racing Car\",\n\t\tb: \"1F3CE-FE0F\",\n\t\tc: \"1F3CE\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"sports\",\n\t\t\t\"race\",\n\t\t\t\"fast\",\n\t\t\t\"formula\",\n\t\t\t\"f1\"\n\t\t],\n\t\tk: [\n\t\t\t11,\n\t\t\t31\n\t\t],\n\t\to: 7\n\t},\n\tracing_motorcycle: {\n\t\ta: \"Racing Motorcycle\",\n\t\tb: \"1F3CD-FE0F\",\n\t\tc: \"1F3CD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t11,\n\t\t\t30\n\t\t],\n\t\to: 7\n\t},\n\tperson_doing_cartwheel: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F938-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fb.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F938-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fc.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F938-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fd.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F938-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3fe.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F938-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f938-1f3ff.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Person Doing Cartwheel\",\n\t\tb: \"1F938\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t24\n\t\t],\n\t\to: 9\n\t},\n\t\"man-cartwheeling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F938-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F938-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F938-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F938-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f938-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F938-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f938-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Cartwheeling\",\n\t\tb: \"1F938-200D-2642-FE0F\",\n\t\tc: \"1F938-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t18\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-cartwheeling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F938-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F938-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F938-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F938-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f938-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F938-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F938-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f938-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Cartwheeling\",\n\t\tb: \"1F938-200D-2640-FE0F\",\n\t\tc: \"1F938-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t12\n\t\t],\n\t\to: 9\n\t},\n\twrestlers: {\n\t\ta: \"Wrestlers\",\n\t\tb: \"1F93C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t51\n\t\t],\n\t\to: 9\n\t},\n\t\"man-wrestling\": {\n\t\ta: \"Man Wrestling\",\n\t\tb: \"1F93C-200D-2642-FE0F\",\n\t\tc: \"1F93C-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-wrestling\": {\n\t\ta: \"Woman Wrestling\",\n\t\tb: \"1F93C-200D-2640-FE0F\",\n\t\tc: \"1F93C-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t49\n\t\t],\n\t\to: 9\n\t},\n\twater_polo: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fb.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fc.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fd.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3fe.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93d-1f3ff.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Water Polo\",\n\t\tb: \"1F93D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t12\n\t\t],\n\t\to: 9\n\t},\n\t\"man-playing-water-polo\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93D-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93D-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93D-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93D-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93D-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f93d-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Playing Water Polo\",\n\t\tb: \"1F93D-200D-2642-FE0F\",\n\t\tc: \"1F93D-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t6\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-playing-water-polo\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93D-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93D-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93D-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93D-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93D-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93D-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f93d-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Playing Water Polo\",\n\t\tb: \"1F93D-200D-2640-FE0F\",\n\t\tc: \"1F93D-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t0\n\t\t],\n\t\to: 9\n\t},\n\thandball: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fb.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fc.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fd.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3fe.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f93e-1f3ff.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Handball\",\n\t\tb: \"1F93E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t30\n\t\t],\n\t\to: 9\n\t},\n\t\"man-playing-handball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93E-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93E-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93E-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93E-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93E-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f93e-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Playing Handball\",\n\t\tb: \"1F93E-200D-2642-FE0F\",\n\t\tc: \"1F93E-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t24\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-playing-handball\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F93E-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F93E-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F93E-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F93E-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F93E-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F93E-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f93e-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 41,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Playing Handball\",\n\t\tb: \"1F93E-200D-2640-FE0F\",\n\t\tc: \"1F93E-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t41,\n\t\t\t18\n\t\t],\n\t\to: 9\n\t},\n\tjuggling: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F939-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fb.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F939-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fc.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F939-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fd.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F939-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3fe.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F939-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f939-1f3ff.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Juggling\",\n\t\tb: \"1F939\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t42\n\t\t],\n\t\to: 9\n\t},\n\t\"man-juggling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F939-1F3FB-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FB-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fb-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F939-1F3FC-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FC-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fc-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F939-1F3FD-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FD-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fd-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F939-1F3FE-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FE-200D-2642\",\n\t\t\t\timage: \"1f939-1f3fe-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F939-1F3FF-200D-2642-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FF-200D-2642\",\n\t\t\t\timage: \"1f939-1f3ff-200d-2642-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Man Juggling\",\n\t\tb: \"1F939-200D-2642-FE0F\",\n\t\tc: \"1F939-200D-2642\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t36\n\t\t],\n\t\to: 9\n\t},\n\t\"woman-juggling\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F939-1F3FB-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FB-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fb-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F939-1F3FC-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FC-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fc-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F939-1F3FD-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FD-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fd-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F939-1F3FE-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FE-200D-2640\",\n\t\t\t\timage: \"1f939-1f3fe-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F939-1F3FF-200D-2640-FE0F\",\n\t\t\t\tnon_qualified: \"1F939-1F3FF-200D-2640\",\n\t\t\t\timage: \"1f939-1f3ff-200d-2640-fe0f.png\",\n\t\t\t\tsheet_x: 40,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: false,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Woman Juggling\",\n\t\tb: \"1F939-200D-2640-FE0F\",\n\t\tc: \"1F939-200D-2640\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t40,\n\t\t\t30\n\t\t],\n\t\to: 9\n\t},\n\tcouple: {\n\t\ta: \"Man and Woman Holding Hands\",\n\t\tb: \"1F46B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pair\",\n\t\t\t\"people\",\n\t\t\t\"human\",\n\t\t\t\"love\",\n\t\t\t\"date\",\n\t\t\t\"dating\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"marriage\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t30\n\t\t],\n\t\tn: [\n\t\t\t\"man_and_woman_holding_hands\"\n\t\t]\n\t},\n\ttwo_men_holding_hands: {\n\t\ta: \"Two Men Holding Hands\",\n\t\tb: \"1F46C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pair\",\n\t\t\t\"couple\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"bromance\",\n\t\t\t\"friendship\",\n\t\t\t\"people\",\n\t\t\t\"human\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t31\n\t\t]\n\t},\n\ttwo_women_holding_hands: {\n\t\ta: \"Two Women Holding Hands\",\n\t\tb: \"1F46D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"pair\",\n\t\t\t\"friendship\",\n\t\t\t\"couple\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"female\",\n\t\t\t\"people\",\n\t\t\t\"human\"\n\t\t],\n\t\tk: [\n\t\t\t20,\n\t\t\t32\n\t\t]\n\t},\n\tcouplekiss: {\n\t\tobsoleted_by: \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n\t\ta: \"Kiss\",\n\t\tb: \"1F48F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t41\n\t\t]\n\t},\n\t\"woman-kiss-man\": {\n\t\tobsoletes: \"1F48F\",\n\t\ta: \"Woman Kiss Man\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n\t\tc: \"1F469-200D-2764-200D-1F48B-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t21\n\t\t]\n\t},\n\t\"man-kiss-man\": {\n\t\ta: \"Man Kiss Man\",\n\t\tb: \"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\n\t\tc: \"1F468-200D-2764-200D-1F48B-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t18,\n\t\t\t10\n\t\t]\n\t},\n\t\"woman-kiss-woman\": {\n\t\ta: \"Woman Kiss Woman\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\n\t\tc: \"1F469-200D-2764-200D-1F48B-200D-1F469\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t22\n\t\t]\n\t},\n\tcouple_with_heart: {\n\t\tobsoleted_by: \"1F469-200D-2764-FE0F-200D-1F468\",\n\t\ta: \"Couple with Heart\",\n\t\tb: \"1F491\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t24,\n\t\t\t43\n\t\t]\n\t},\n\t\"woman-heart-man\": {\n\t\tobsoletes: \"1F491\",\n\t\ta: \"Woman Heart Man\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F468\",\n\t\tc: \"1F469-200D-2764-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t20,\n\t\t\t19\n\t\t]\n\t},\n\t\"man-heart-man\": {\n\t\ta: \"Man Heart Man\",\n\t\tb: \"1F468-200D-2764-FE0F-200D-1F468\",\n\t\tc: \"1F468-200D-2764-200D-1F468\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t18,\n\t\t\t9\n\t\t]\n\t},\n\t\"woman-heart-woman\": {\n\t\ta: \"Woman Heart Woman\",\n\t\tb: \"1F469-200D-2764-FE0F-200D-1F469\",\n\t\tc: \"1F469-200D-2764-200D-1F469\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t20\n\t\t]\n\t},\n\tfamily: {\n\t\tobsoleted_by: \"1F468-200D-1F469-200D-1F466\",\n\t\ta: \"Family\",\n\t\tb: \"1F46A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: false,\n\t\ti: true,\n\t\tk: [\n\t\t\t20,\n\t\t\t29\n\t\t],\n\t\tn: [\n\t\t\t\"man-woman-boy\"\n\t\t]\n\t},\n\t\"man-woman-boy\": {\n\t\tobsoletes: \"1F46A\",\n\t\ta: \"Man Woman Boy\",\n\t\tb: \"1F468-200D-1F469-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t2\n\t\t],\n\t\tn: [\n\t\t\t\"family\"\n\t\t]\n\t},\n\t\"man-woman-girl\": {\n\t\ta: \"Man Woman Girl\",\n\t\tb: \"1F468-200D-1F469-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t4\n\t\t]\n\t},\n\t\"man-woman-girl-boy\": {\n\t\ta: \"Man Woman Girl Boy\",\n\t\tb: \"1F468-200D-1F469-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t5\n\t\t]\n\t},\n\t\"man-woman-boy-boy\": {\n\t\ta: \"Man Woman Boy Boy\",\n\t\tb: \"1F468-200D-1F469-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t3\n\t\t]\n\t},\n\t\"man-woman-girl-girl\": {\n\t\ta: \"Man Woman Girl Girl\",\n\t\tb: \"1F468-200D-1F469-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t6\n\t\t]\n\t},\n\t\"man-man-boy\": {\n\t\ta: \"Man Man Boy\",\n\t\tb: \"1F468-200D-1F468-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t16,\n\t\t\t49\n\t\t]\n\t},\n\t\"man-man-girl\": {\n\t\ta: \"Man Man Girl\",\n\t\tb: \"1F468-200D-1F468-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t16,\n\t\t\t51\n\t\t]\n\t},\n\t\"man-man-girl-boy\": {\n\t\ta: \"Man Man Girl Boy\",\n\t\tb: \"1F468-200D-1F468-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t0\n\t\t]\n\t},\n\t\"man-man-boy-boy\": {\n\t\ta: \"Man Man Boy Boy\",\n\t\tb: \"1F468-200D-1F468-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t16,\n\t\t\t50\n\t\t]\n\t},\n\t\"man-man-girl-girl\": {\n\t\ta: \"Man Man Girl Girl\",\n\t\tb: \"1F468-200D-1F468-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t17,\n\t\t\t1\n\t\t]\n\t},\n\t\"woman-woman-boy\": {\n\t\ta: \"Woman Woman Boy\",\n\t\tb: \"1F469-200D-1F469-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t12\n\t\t]\n\t},\n\t\"woman-woman-girl\": {\n\t\ta: \"Woman Woman Girl\",\n\t\tb: \"1F469-200D-1F469-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t14\n\t\t]\n\t},\n\t\"woman-woman-girl-boy\": {\n\t\ta: \"Woman Woman Girl Boy\",\n\t\tb: \"1F469-200D-1F469-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t15\n\t\t]\n\t},\n\t\"woman-woman-boy-boy\": {\n\t\ta: \"Woman Woman Boy Boy\",\n\t\tb: \"1F469-200D-1F469-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t13\n\t\t]\n\t},\n\t\"woman-woman-girl-girl\": {\n\t\ta: \"Woman Woman Girl Girl\",\n\t\tb: \"1F469-200D-1F469-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t19,\n\t\t\t16\n\t\t]\n\t},\n\t\"man-boy\": {\n\t\ta: \"Man Boy\",\n\t\tb: \"1F468-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t45\n\t\t]\n\t},\n\t\"man-boy-boy\": {\n\t\ta: \"Man Boy Boy\",\n\t\tb: \"1F468-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t44\n\t\t]\n\t},\n\t\"man-girl\": {\n\t\ta: \"Man Girl\",\n\t\tb: \"1F468-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t48\n\t\t]\n\t},\n\t\"man-girl-boy\": {\n\t\ta: \"Man Girl Boy\",\n\t\tb: \"1F468-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t46\n\t\t]\n\t},\n\t\"man-girl-girl\": {\n\t\ta: \"Man Girl Girl\",\n\t\tb: \"1F468-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t16,\n\t\t\t47\n\t\t]\n\t},\n\t\"woman-boy\": {\n\t\ta: \"Woman Boy\",\n\t\tb: \"1F469-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t8\n\t\t]\n\t},\n\t\"woman-boy-boy\": {\n\t\ta: \"Woman Boy Boy\",\n\t\tb: \"1F469-200D-1F466-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t7\n\t\t]\n\t},\n\t\"woman-girl\": {\n\t\ta: \"Woman Girl\",\n\t\tb: \"1F469-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t11\n\t\t]\n\t},\n\t\"woman-girl-boy\": {\n\t\ta: \"Woman Girl Boy\",\n\t\tb: \"1F469-200D-1F467-200D-1F466\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t9\n\t\t]\n\t},\n\t\"woman-girl-girl\": {\n\t\ta: \"Woman Girl Girl\",\n\t\tb: \"1F469-200D-1F467-200D-1F467\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t19,\n\t\t\t10\n\t\t]\n\t},\n\tselfie: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F933-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F933-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F933-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F933-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F933-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f933-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Selfie\",\n\t\tb: \"1F933\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"camera\",\n\t\t\t\"phone\"\n\t\t],\n\t\tk: [\n\t\t\t39,\n\t\t\t22\n\t\t],\n\t\to: 9\n\t},\n\tmuscle: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F4AA-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fb.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F4AA-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fc.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F4AA-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fd.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F4AA-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3fe.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F4AA-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f4aa-1f3ff.png\",\n\t\t\t\tsheet_x: 25,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Flexed Biceps\",\n\t\tb: \"1F4AA\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"arm\",\n\t\t\t\"flex\",\n\t\t\t\"hand\",\n\t\t\t\"summer\",\n\t\t\t\"strong\",\n\t\t\t\"biceps\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t16\n\t\t]\n\t},\n\tpoint_left: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F448-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F448-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F448-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F448-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F448-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f448-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 24,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Left Pointing Backhand Index\",\n\t\tb: \"1F448\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"direction\",\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"left\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t19\n\t\t]\n\t},\n\tpoint_right: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F449-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F449-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F449-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F449-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F449-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f449-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Right Pointing Backhand Index\",\n\t\tb: \"1F449\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"direction\",\n\t\t\t\"right\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t25\n\t\t]\n\t},\n\tpoint_up: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"261D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fb.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"261D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fc.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"261D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fd.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"261D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3fe.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 30,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"261D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"261d-1f3ff.png\",\n\t\t\t\tsheet_x: 47,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Up Pointing Index\",\n\t\tb: \"261D-FE0F\",\n\t\tc: \"261D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hand\",\n\t\t\t\"fingers\",\n\t\t\t\"direction\",\n\t\t\t\"up\"\n\t\t],\n\t\tk: [\n\t\t\t47,\n\t\t\t26\n\t\t],\n\t\to: 1\n\t},\n\tpoint_up_2: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F446-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F446-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F446-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F446-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F446-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f446-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Up Pointing Backhand Index\",\n\t\tb: \"1F446\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"direction\",\n\t\t\t\"up\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t7\n\t\t]\n\t},\n\tmiddle_finger: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F595-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F595-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F595-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F595-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F595-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f595-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Reversed Hand with Middle Finger Extended\",\n\t\tb: \"1F595\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t38\n\t\t],\n\t\tn: [\n\t\t\t\"reversed_hand_with_middle_finger_extended\"\n\t\t],\n\t\to: 7\n\t},\n\tpoint_down: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F447-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F447-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F447-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F447-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F447-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f447-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"White Down Pointing Backhand Index\",\n\t\tb: \"1F447\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"direction\",\n\t\t\t\"down\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t13\n\t\t]\n\t},\n\tv: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 31,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270c-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Victory Hand\",\n\t\tb: \"270C-FE0F\",\n\t\tc: \"270C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"ohyeah\",\n\t\t\t\"hand\",\n\t\t\t\"peace\",\n\t\t\t\"victory\",\n\t\t\t\"two\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t30\n\t\t],\n\t\to: 1\n\t},\n\tcrossed_fingers: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91e-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Hand with Index and Middle Fingers Crossed\",\n\t\tb: \"1F91E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"good\",\n\t\t\t\"lucky\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"hand_with_index_and_middle_fingers_crossed\"\n\t\t],\n\t\to: 9\n\t},\n\t\"spock-hand\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F596-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F596-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F596-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F596-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F596-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f596-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Hand with Part Between Middle and Ring Fingers\",\n\t\tb: \"1F596\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t29,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\tthe_horns: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F918-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F918-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fc.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F918-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fd.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F918-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F918-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f918-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Sign of the Horns\",\n\t\tb: \"1F918\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t32\n\t\t],\n\t\tn: [\n\t\t\t\"sign_of_the_horns\"\n\t\t],\n\t\to: 8\n\t},\n\tcall_me_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F919-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F919-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fc.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F919-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fd.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F919-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F919-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f919-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 43,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Call Me Hand\",\n\t\tb: \"1F919\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hands\",\n\t\t\t\"gesture\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t38\n\t\t],\n\t\to: 9\n\t},\n\traised_hand_with_fingers_splayed: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F590-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fb.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F590-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fc.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F590-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fd.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F590-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3fe.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F590-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f590-1f3ff.png\",\n\t\t\t\tsheet_x: 29,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Hand with Fingers Splayed\",\n\t\tb: \"1F590-FE0F\",\n\t\tc: \"1F590\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"hand\",\n\t\t\t\"fingers\",\n\t\t\t\"palm\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t32\n\t\t],\n\t\to: 7\n\t},\n\thand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 25,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 26,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 27,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 28,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270b-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 29,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Hand\",\n\t\tb: \"270B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t49,\n\t\t\t24\n\t\t],\n\t\tn: [\n\t\t\t\"raised_hand\"\n\t\t]\n\t},\n\tok_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 44,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44c-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Ok Hand Sign\",\n\t\tb: \"1F44C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"limbs\",\n\t\t\t\"perfect\",\n\t\t\t\"ok\",\n\t\t\t\"okay\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t43\n\t\t]\n\t},\n\t\"+1\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44d-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Thumbs Up Sign\",\n\t\tb: \"1F44D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"thumbsup\",\n\t\t\t\"yes\",\n\t\t\t\"awesome\",\n\t\t\t\"good\",\n\t\t\t\"agree\",\n\t\t\t\"accept\",\n\t\t\t\"cool\",\n\t\t\t\"hand\",\n\t\t\t\"like\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t49\n\t\t],\n\t\tn: [\n\t\t\t\"thumbsup\"\n\t\t]\n\t},\n\t\"-1\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44E-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44E-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44E-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44E-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44E-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44e-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Thumbs Down Sign\",\n\t\tb: \"1F44E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"thumbsdown\",\n\t\t\t\"no\",\n\t\t\t\"dislike\",\n\t\t\t\"hand\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t3\n\t\t],\n\t\tn: [\n\t\t\t\"thumbsdown\"\n\t\t]\n\t},\n\tfist: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270a-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 23,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Fist\",\n\t\tb: \"270A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"hand\",\n\t\t\t\"grasp\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t18\n\t\t]\n\t},\n\tfacepunch: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 32,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 33,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 34,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 35,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44a-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 36,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Fisted Hand Sign\",\n\t\tb: \"1F44A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"angry\",\n\t\t\t\"violence\",\n\t\t\t\"fist\",\n\t\t\t\"hit\",\n\t\t\t\"attack\",\n\t\t\t\"hand\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t31\n\t\t],\n\t\tn: [\n\t\t\t\"punch\"\n\t\t]\n\t},\n\t\"left-facing_fist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 51,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91b-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Left-Facing Fist\",\n\t\tb: \"1F91B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\t\"right-facing_fist\": {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 8,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91c-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 9,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Right-Facing Fist\",\n\t\tb: \"1F91C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t4\n\t\t],\n\t\to: 9\n\t},\n\traised_back_of_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91A-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fb.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91A-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fc.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91A-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fd.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91A-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3fe.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91A-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91a-1f3ff.png\",\n\t\t\t\tsheet_x: 37,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"9.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Raised Back of Hand\",\n\t\tb: \"1F91A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"raised\",\n\t\t\t\"backhand\"\n\t\t],\n\t\tk: [\n\t\t\t37,\n\t\t\t44\n\t\t],\n\t\to: 9\n\t},\n\twave: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44B-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44B-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44B-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44B-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44B-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44b-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 42,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Waving Hand Sign\",\n\t\tb: \"1F44B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hands\",\n\t\t\t\"gesture\",\n\t\t\t\"goodbye\",\n\t\t\t\"solong\",\n\t\t\t\"farewell\",\n\t\t\t\"hello\",\n\t\t\t\"hi\",\n\t\t\t\"palm\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t37\n\t\t]\n\t},\n\ti_love_you_hand_sign: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F91F-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fb.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F91F-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fc.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F91F-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fd.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F91F-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3fe.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F91F-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f91f-1f3ff.png\",\n\t\t\t\tsheet_x: 38,\n\t\t\t\tsheet_y: 22,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"I Love You Hand Sign\",\n\t\tb: \"1F91F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t38,\n\t\t\t17\n\t\t],\n\t\to: 10\n\t},\n\twriting_hand: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"270D-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fb.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 37,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"270D-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fc.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 38,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"270D-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fd.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 39,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"270D-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3fe.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 40,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"270D-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"270d-1f3ff.png\",\n\t\t\t\tsheet_x: 49,\n\t\t\t\tsheet_y: 41,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Writing Hand\",\n\t\tb: \"270D-FE0F\",\n\t\tc: \"270D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"lower_left_ballpoint_pen\",\n\t\t\t\"stationery\",\n\t\t\t\"write\",\n\t\t\t\"compose\"\n\t\t],\n\t\tk: [\n\t\t\t49,\n\t\t\t36\n\t\t],\n\t\to: 1\n\t},\n\tclap: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F44F-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 10,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F44F-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 11,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F44F-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 12,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F44F-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F44F-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f44f-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Clapping Hands Sign\",\n\t\tb: \"1F44F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"hands\",\n\t\t\t\"praise\",\n\t\t\t\"applause\",\n\t\t\t\"congrats\",\n\t\t\t\"yay\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t9\n\t\t]\n\t},\n\topen_hands: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F450-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fb.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F450-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fc.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F450-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fd.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F450-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3fe.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F450-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f450-1f3ff.png\",\n\t\t\t\tsheet_x: 15,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Open Hands Sign\",\n\t\tb: \"1F450\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fingers\",\n\t\t\t\"butterfly\",\n\t\t\t\"hands\",\n\t\t\t\"open\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t15\n\t\t]\n\t},\n\traised_hands: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64C-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fb.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 13,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64C-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fc.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 14,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64C-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fd.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 15,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64C-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3fe.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 16,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64C-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64c-1f3ff.png\",\n\t\t\t\tsheet_x: 33,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Person Raising Both Hands in Celebration\",\n\t\tb: \"1F64C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"gesture\",\n\t\t\t\"hooray\",\n\t\t\t\"yea\",\n\t\t\t\"celebration\",\n\t\t\t\"hands\"\n\t\t],\n\t\tk: [\n\t\t\t33,\n\t\t\t12\n\t\t]\n\t},\n\tpalms_up_together: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F932-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fb.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 17,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F932-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fc.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 18,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F932-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fd.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 19,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F932-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3fe.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 20,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F932-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f932-1f3ff.png\",\n\t\t\t\tsheet_x: 39,\n\t\t\t\tsheet_y: 21,\n\t\t\t\tadded_in: \"10.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: false\n\t\t\t}\n\t\t},\n\t\ta: \"Palms Up Together\",\n\t\tb: \"1F932\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t39,\n\t\t\t16\n\t\t],\n\t\to: 10\n\t},\n\tpray: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F64F-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fb.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F64F-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fc.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F64F-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fd.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 5,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F64F-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3fe.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 6,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F64F-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f64f-1f3ff.png\",\n\t\t\t\tsheet_x: 34,\n\t\t\t\tsheet_y: 7,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Person with Folded Hands\",\n\t\tb: \"1F64F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"please\",\n\t\t\t\"hope\",\n\t\t\t\"wish\",\n\t\t\t\"namaste\",\n\t\t\t\"highfive\"\n\t\t],\n\t\tk: [\n\t\t\t34,\n\t\t\t2\n\t\t]\n\t},\n\thandshake: {\n\t\ta: \"Handshake\",\n\t\tb: \"1F91D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"agreement\",\n\t\t\t\"shake\"\n\t\t],\n\t\tk: [\n\t\t\t38,\n\t\t\t10\n\t\t],\n\t\to: 9\n\t},\n\tnail_care: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F485-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fb.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 45,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F485-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fc.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F485-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fd.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F485-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3fe.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F485-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f485-1f3ff.png\",\n\t\t\t\tsheet_x: 23,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Nail Polish\",\n\t\tb: \"1F485\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"beauty\",\n\t\t\t\"manicure\",\n\t\t\t\"finger\",\n\t\t\t\"fashion\",\n\t\t\t\"nail\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t44\n\t\t]\n\t},\n\tear: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F442-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fb.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 46,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F442-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fc.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 47,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F442-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fd.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 48,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F442-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3fe.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 49,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F442-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f442-1f3ff.png\",\n\t\t\t\tsheet_x: 13,\n\t\t\t\tsheet_y: 50,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Ear\",\n\t\tb: \"1F442\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"hear\",\n\t\t\t\"sound\",\n\t\t\t\"listen\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t45\n\t\t]\n\t},\n\tnose: {\n\t\tskin_variations: {\n\t\t\t\"1F3FB\": {\n\t\t\t\tunified: \"1F443-1F3FB\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fb.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 0,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FC\": {\n\t\t\t\tunified: \"1F443-1F3FC\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fc.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 1,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FD\": {\n\t\t\t\tunified: \"1F443-1F3FD\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fd.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 2,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FE\": {\n\t\t\t\tunified: \"1F443-1F3FE\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3fe.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 3,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t},\n\t\t\t\"1F3FF\": {\n\t\t\t\tunified: \"1F443-1F3FF\",\n\t\t\t\tnon_qualified: null,\n\t\t\t\timage: \"1f443-1f3ff.png\",\n\t\t\t\tsheet_x: 14,\n\t\t\t\tsheet_y: 4,\n\t\t\t\tadded_in: \"8.0\",\n\t\t\t\thas_img_apple: true,\n\t\t\t\thas_img_google: true,\n\t\t\t\thas_img_twitter: true,\n\t\t\t\thas_img_emojione: true,\n\t\t\t\thas_img_facebook: true,\n\t\t\t\thas_img_messenger: true\n\t\t\t}\n\t\t},\n\t\ta: \"Nose\",\n\t\tb: \"1F443\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"smell\",\n\t\t\t\"sniff\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t51\n\t\t]\n\t},\n\tfootprints: {\n\t\ta: \"Footprints\",\n\t\tb: \"1F463\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"feet\",\n\t\t\t\"tracking\",\n\t\t\t\"walking\",\n\t\t\t\"beach\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t39\n\t\t]\n\t},\n\teyes: {\n\t\ta: \"Eyes\",\n\t\tb: \"1F440\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"look\",\n\t\t\t\"watch\",\n\t\t\t\"stalk\",\n\t\t\t\"peek\",\n\t\t\t\"see\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t42\n\t\t]\n\t},\n\teye: {\n\t\ta: \"Eye\",\n\t\tb: \"1F441-FE0F\",\n\t\tc: \"1F441\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"look\",\n\t\t\t\"see\",\n\t\t\t\"watch\",\n\t\t\t\"stare\"\n\t\t],\n\t\tk: [\n\t\t\t13,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\t\"eye-in-speech-bubble\": {\n\t\ta: \"Eye in Speech Bubble\",\n\t\tb: \"1F441-FE0F-200D-1F5E8-FE0F\",\n\t\td: true,\n\t\te: true,\n\t\tf: false,\n\t\tg: true,\n\t\th: false,\n\t\ti: false,\n\t\tk: [\n\t\t\t13,\n\t\t\t43\n\t\t],\n\t\to: 7\n\t},\n\tbrain: {\n\t\ta: \"Brain\",\n\t\tb: \"1F9E0\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t22\n\t\t],\n\t\to: 10\n\t},\n\ttongue: {\n\t\ta: \"Tongue\",\n\t\tb: \"1F445\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mouth\",\n\t\t\t\"playful\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t6\n\t\t]\n\t},\n\tlips: {\n\t\ta: \"Mouth\",\n\t\tb: \"1F444\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"mouth\",\n\t\t\t\"kiss\"\n\t\t],\n\t\tk: [\n\t\t\t14,\n\t\t\t5\n\t\t]\n\t},\n\tkiss: {\n\t\ta: \"Kiss Mark\",\n\t\tb: \"1F48B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"lips\",\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t37\n\t\t]\n\t},\n\tcupid: {\n\t\ta: \"Heart with Arrow\",\n\t\tb: \"1F498\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"heart\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t50\n\t\t]\n\t},\n\theart: {\n\t\ta: \"Heavy Black Heart\",\n\t\tb: \"2764-FE0F\",\n\t\tc: \"2764\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t50,\n\t\t\t8\n\t\t],\n\t\tl: [\n\t\t\t\"<3\"\n\t\t],\n\t\tm: \"<3\",\n\t\to: 1\n\t},\n\theartbeat: {\n\t\ta: \"Beating Heart\",\n\t\tb: \"1F493\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"pink\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t45\n\t\t]\n\t},\n\tbroken_heart: {\n\t\ta: \"Broken Heart\",\n\t\tb: \"1F494\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sad\",\n\t\t\t\"sorry\",\n\t\t\t\"break\",\n\t\t\t\"heart\",\n\t\t\t\"heartbreak\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t46\n\t\t],\n\t\tl: [\n\t\t\t\"</3\"\n\t\t],\n\t\tm: \"</3\"\n\t},\n\ttwo_hearts: {\n\t\ta: \"Two Hearts\",\n\t\tb: \"1F495\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"heart\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t47\n\t\t]\n\t},\n\tsparkling_heart: {\n\t\ta: \"Sparkling Heart\",\n\t\tb: \"1F496\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t48\n\t\t]\n\t},\n\theartpulse: {\n\t\ta: \"Growing Heart\",\n\t\tb: \"1F497\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"like\",\n\t\t\t\"love\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\",\n\t\t\t\"pink\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t49\n\t\t]\n\t},\n\tblue_heart: {\n\t\ta: \"Blue Heart\",\n\t\tb: \"1F499\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t51\n\t\t],\n\t\tm: \"<3\"\n\t},\n\tgreen_heart: {\n\t\ta: \"Green Heart\",\n\t\tb: \"1F49A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t0\n\t\t],\n\t\tm: \"<3\"\n\t},\n\tyellow_heart: {\n\t\ta: \"Yellow Heart\",\n\t\tb: \"1F49B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t1\n\t\t],\n\t\tm: \"<3\"\n\t},\n\torange_heart: {\n\t\ta: \"Orange Heart\",\n\t\tb: \"1F9E1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t23\n\t\t],\n\t\to: 10\n\t},\n\tpurple_heart: {\n\t\ta: \"Purple Heart\",\n\t\tb: \"1F49C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t2\n\t\t],\n\t\tm: \"<3\"\n\t},\n\tblack_heart: {\n\t\ta: \"Black Heart\",\n\t\tb: \"1F5A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"evil\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t50\n\t\t],\n\t\to: 9\n\t},\n\tgift_heart: {\n\t\ta: \"Heart with Ribbon\",\n\t\tb: \"1F49D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t3\n\t\t]\n\t},\n\trevolving_hearts: {\n\t\ta: \"Revolving Hearts\",\n\t\tb: \"1F49E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"love\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t4\n\t\t]\n\t},\n\theart_decoration: {\n\t\ta: \"Heart Decoration\",\n\t\tb: \"1F49F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"purple-square\",\n\t\t\t\"love\",\n\t\t\t\"like\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t5\n\t\t]\n\t},\n\theavy_heart_exclamation_mark_ornament: {\n\t\ta: \"Heavy Heart Exclamation Mark Ornament\",\n\t\tb: \"2763-FE0F\",\n\t\tc: \"2763\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t50,\n\t\t\t7\n\t\t],\n\t\to: 1\n\t},\n\tlove_letter: {\n\t\ta: \"Love Letter\",\n\t\tb: \"1F48C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"email\",\n\t\t\t\"like\",\n\t\t\t\"affection\",\n\t\t\t\"envelope\",\n\t\t\t\"valentines\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t38\n\t\t]\n\t},\n\tzzz: {\n\t\ta: \"Sleeping Symbol\",\n\t\tb: \"1F4A4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"sleepy\",\n\t\t\t\"tired\",\n\t\t\t\"dream\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t10\n\t\t]\n\t},\n\tanger: {\n\t\ta: \"Anger Symbol\",\n\t\tb: \"1F4A2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"angry\",\n\t\t\t\"mad\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t8\n\t\t]\n\t},\n\tbomb: {\n\t\ta: \"Bomb\",\n\t\tb: \"1F4A3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"boom\",\n\t\t\t\"explode\",\n\t\t\t\"explosion\",\n\t\t\t\"terrorism\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t9\n\t\t]\n\t},\n\tboom: {\n\t\ta: \"Collision Symbol\",\n\t\tb: \"1F4A5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bomb\",\n\t\t\t\"explode\",\n\t\t\t\"explosion\",\n\t\t\t\"collision\",\n\t\t\t\"blown\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t11\n\t\t],\n\t\tn: [\n\t\t\t\"collision\"\n\t\t]\n\t},\n\tsweat_drops: {\n\t\ta: \"Splashing Sweat Symbol\",\n\t\tb: \"1F4A6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"water\",\n\t\t\t\"drip\",\n\t\t\t\"oops\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t12\n\t\t]\n\t},\n\tdash: {\n\t\ta: \"Dash Symbol\",\n\t\tb: \"1F4A8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wind\",\n\t\t\t\"air\",\n\t\t\t\"fast\",\n\t\t\t\"shoo\",\n\t\t\t\"fart\",\n\t\t\t\"smoke\",\n\t\t\t\"puff\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t14\n\t\t]\n\t},\n\tdizzy: {\n\t\ta: \"Dizzy Symbol\",\n\t\tb: \"1F4AB\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"star\",\n\t\t\t\"sparkle\",\n\t\t\t\"shoot\",\n\t\t\t\"magic\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t22\n\t\t]\n\t},\n\tspeech_balloon: {\n\t\ta: \"Speech Balloon\",\n\t\tb: \"1F4AC\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bubble\",\n\t\t\t\"words\",\n\t\t\t\"message\",\n\t\t\t\"talk\",\n\t\t\t\"chatting\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t23\n\t\t]\n\t},\n\tleft_speech_bubble: {\n\t\ta: \"Left Speech Bubble\",\n\t\tb: \"1F5E8-FE0F\",\n\t\tc: \"1F5E8\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"words\",\n\t\t\t\"message\",\n\t\t\t\"talk\",\n\t\t\t\"chatting\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t15\n\t\t],\n\t\to: 7\n\t},\n\tright_anger_bubble: {\n\t\ta: \"Right Anger Bubble\",\n\t\tb: \"1F5EF-FE0F\",\n\t\tc: \"1F5EF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"caption\",\n\t\t\t\"speech\",\n\t\t\t\"thinking\",\n\t\t\t\"mad\"\n\t\t],\n\t\tk: [\n\t\t\t30,\n\t\t\t16\n\t\t],\n\t\to: 7\n\t},\n\tthought_balloon: {\n\t\ta: \"Thought Balloon\",\n\t\tb: \"1F4AD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bubble\",\n\t\t\t\"cloud\",\n\t\t\t\"speech\",\n\t\t\t\"thinking\",\n\t\t\t\"dream\"\n\t\t],\n\t\tk: [\n\t\t\t25,\n\t\t\t24\n\t\t]\n\t},\n\thole: {\n\t\ta: \"Hole\",\n\t\tb: \"1F573-FE0F\",\n\t\tc: \"1F573\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"embarrassing\"\n\t\t],\n\t\tk: [\n\t\t\t28,\n\t\t\t44\n\t\t],\n\t\to: 7\n\t},\n\teyeglasses: {\n\t\ta: \"Eyeglasses\",\n\t\tb: \"1F453\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessories\",\n\t\t\t\"eyesight\",\n\t\t\t\"nerdy\",\n\t\t\t\"dork\",\n\t\t\t\"geek\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t23\n\t\t]\n\t},\n\tdark_sunglasses: {\n\t\ta: \"Dark Sunglasses\",\n\t\tb: \"1F576-FE0F\",\n\t\tc: \"1F576\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"face\",\n\t\t\t\"cool\",\n\t\t\t\"accessories\"\n\t\t],\n\t\tk: [\n\t\t\t29,\n\t\t\t17\n\t\t],\n\t\to: 7\n\t},\n\tnecktie: {\n\t\ta: \"Necktie\",\n\t\tb: \"1F454\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shirt\",\n\t\t\t\"suitup\",\n\t\t\t\"formal\",\n\t\t\t\"fashion\",\n\t\t\t\"cloth\",\n\t\t\t\"business\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t24\n\t\t]\n\t},\n\tshirt: {\n\t\ta: \"T-Shirt\",\n\t\tb: \"1F455\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tk: [\n\t\t\t15,\n\t\t\t25\n\t\t],\n\t\tn: [\n\t\t\t\"tshirt\"\n\t\t]\n\t},\n\tjeans: {\n\t\ta: \"Jeans\",\n\t\tb: \"1F456\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t26\n\t\t]\n\t},\n\tscarf: {\n\t\ta: \"Scarf\",\n\t\tb: \"1F9E3\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t25\n\t\t],\n\t\to: 10\n\t},\n\tgloves: {\n\t\ta: \"Gloves\",\n\t\tb: \"1F9E4\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t26\n\t\t],\n\t\to: 10\n\t},\n\tcoat: {\n\t\ta: \"Coat\",\n\t\tb: \"1F9E5\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t27\n\t\t],\n\t\to: 10\n\t},\n\tsocks: {\n\t\ta: \"Socks\",\n\t\tb: \"1F9E6\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t28\n\t\t],\n\t\to: 10\n\t},\n\tdress: {\n\t\ta: \"Dress\",\n\t\tb: \"1F457\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"clothes\",\n\t\t\t\"fashion\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t27\n\t\t]\n\t},\n\tkimono: {\n\t\ta: \"Kimono\",\n\t\tb: \"1F458\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"dress\",\n\t\t\t\"fashion\",\n\t\t\t\"women\",\n\t\t\t\"female\",\n\t\t\t\"japanese\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t28\n\t\t]\n\t},\n\tbikini: {\n\t\ta: \"Bikini\",\n\t\tb: \"1F459\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"swimming\",\n\t\t\t\"female\",\n\t\t\t\"woman\",\n\t\t\t\"girl\",\n\t\t\t\"fashion\",\n\t\t\t\"beach\",\n\t\t\t\"summer\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t29\n\t\t]\n\t},\n\twomans_clothes: {\n\t\ta: \"Womans Clothes\",\n\t\tb: \"1F45A\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"shopping_bags\",\n\t\t\t\"female\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t30\n\t\t]\n\t},\n\tpurse: {\n\t\ta: \"Purse\",\n\t\tb: \"1F45B\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessories\",\n\t\t\t\"money\",\n\t\t\t\"sales\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t31\n\t\t]\n\t},\n\thandbag: {\n\t\ta: \"Handbag\",\n\t\tb: \"1F45C\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessory\",\n\t\t\t\"accessories\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t32\n\t\t]\n\t},\n\tpouch: {\n\t\ta: \"Pouch\",\n\t\tb: \"1F45D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"bag\",\n\t\t\t\"accessories\",\n\t\t\t\"shopping\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t33\n\t\t]\n\t},\n\tshopping_bags: {\n\t\ta: \"Shopping Bags\",\n\t\tb: \"1F6CD-FE0F\",\n\t\tc: \"1F6CD\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t37,\n\t\t\t2\n\t\t],\n\t\to: 7\n\t},\n\tschool_satchel: {\n\t\ta: \"School Satchel\",\n\t\tb: \"1F392\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"student\",\n\t\t\t\"education\",\n\t\t\t\"bag\",\n\t\t\t\"backpack\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t37\n\t\t]\n\t},\n\tmans_shoe: {\n\t\ta: \"Mans Shoe\",\n\t\tb: \"1F45E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"male\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t34\n\t\t],\n\t\tn: [\n\t\t\t\"shoe\"\n\t\t]\n\t},\n\tathletic_shoe: {\n\t\ta: \"Athletic Shoe\",\n\t\tb: \"1F45F\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shoes\",\n\t\t\t\"sports\",\n\t\t\t\"sneakers\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t35\n\t\t]\n\t},\n\thigh_heel: {\n\t\ta: \"High-Heeled Shoe\",\n\t\tb: \"1F460\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"shoes\",\n\t\t\t\"female\",\n\t\t\t\"pumps\",\n\t\t\t\"stiletto\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t36\n\t\t]\n\t},\n\tsandal: {\n\t\ta: \"Womans Sandal\",\n\t\tb: \"1F461\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shoes\",\n\t\t\t\"fashion\",\n\t\t\t\"flip flops\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t37\n\t\t]\n\t},\n\tboot: {\n\t\ta: \"Womans Boots\",\n\t\tb: \"1F462\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"shoes\",\n\t\t\t\"fashion\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t38\n\t\t]\n\t},\n\tcrown: {\n\t\ta: \"Crown\",\n\t\tb: \"1F451\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"king\",\n\t\t\t\"kod\",\n\t\t\t\"leader\",\n\t\t\t\"royalty\",\n\t\t\t\"lord\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t21\n\t\t]\n\t},\n\twomans_hat: {\n\t\ta: \"Womans Hat\",\n\t\tb: \"1F452\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"fashion\",\n\t\t\t\"accessories\",\n\t\t\t\"female\",\n\t\t\t\"lady\",\n\t\t\t\"spring\"\n\t\t],\n\t\tk: [\n\t\t\t15,\n\t\t\t22\n\t\t]\n\t},\n\ttophat: {\n\t\ta: \"Top Hat\",\n\t\tb: \"1F3A9\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"magic\",\n\t\t\t\"gentleman\",\n\t\t\t\"classy\",\n\t\t\t\"circus\"\n\t\t],\n\t\tk: [\n\t\t\t9,\n\t\t\t3\n\t\t]\n\t},\n\tmortar_board: {\n\t\ta: \"Graduation Cap\",\n\t\tb: \"1F393\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"school\",\n\t\t\t\"college\",\n\t\t\t\"degree\",\n\t\t\t\"university\",\n\t\t\t\"graduation\",\n\t\t\t\"cap\",\n\t\t\t\"hat\",\n\t\t\t\"legal\",\n\t\t\t\"learn\",\n\t\t\t\"education\"\n\t\t],\n\t\tk: [\n\t\t\t8,\n\t\t\t38\n\t\t]\n\t},\n\tbilled_cap: {\n\t\ta: \"Billed Cap\",\n\t\tb: \"1F9E2\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t46,\n\t\t\t24\n\t\t],\n\t\to: 10\n\t},\n\thelmet_with_white_cross: {\n\t\ta: \"Helmet with White Cross\",\n\t\tb: \"26D1-FE0F\",\n\t\tc: \"26D1\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tk: [\n\t\t\t48,\n\t\t\t33\n\t\t],\n\t\to: 5\n\t},\n\tprayer_beads: {\n\t\ta: \"Prayer Beads\",\n\t\tb: \"1F4FF\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: false,\n\t\tj: [\n\t\t\t\"dhikr\",\n\t\t\t\"religious\"\n\t\t],\n\t\tk: [\n\t\t\t27,\n\t\t\t1\n\t\t],\n\t\to: 8\n\t},\n\tlipstick: {\n\t\ta: \"Lipstick\",\n\t\tb: \"1F484\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"female\",\n\t\t\t\"girl\",\n\t\t\t\"fashion\",\n\t\t\t\"woman\"\n\t\t],\n\t\tk: [\n\t\t\t23,\n\t\t\t43\n\t\t]\n\t},\n\tring: {\n\t\ta: \"Ring\",\n\t\tb: \"1F48D\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"wedding\",\n\t\t\t\"propose\",\n\t\t\t\"marriage\",\n\t\t\t\"valentines\",\n\t\t\t\"diamond\",\n\t\t\t\"fashion\",\n\t\t\t\"jewelry\",\n\t\t\t\"gem\",\n\t\t\t\"engagement\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t39\n\t\t]\n\t},\n\tgem: {\n\t\ta: \"Gem Stone\",\n\t\tb: \"1F48E\",\n\t\td: true,\n\t\te: true,\n\t\tf: true,\n\t\tg: true,\n\t\th: true,\n\t\ti: true,\n\t\tj: [\n\t\t\t\"blue\",\n\t\t\t\"ruby\",\n\t\t\t\"diamond\",\n\t\t\t\"jewelry\"\n\t\t],\n\t\tk: [\n\t\t\t24,\n\t\t\t40\n\t\t]\n\t}\n};\nvar aliases = {\n\tsatisfied: \"laughing\",\n\tgrinning_face_with_star_eyes: \"star-struck\",\n\tface_with_one_eyebrow_raised: \"face_with_raised_eyebrow\",\n\ttelephone: \"phone\",\n\tcooking: \"fried_egg\",\n\tpaw_prints: \"feet\",\n\t\"flag-cn\": \"cn\",\n\tlantern: \"izakaya_lantern\",\n\tshocked_face_with_exploding_head: \"exploding_head\",\n\topen_book: \"book\",\n\t\"flag-de\": \"de\",\n\tgrinning_face_with_one_large_and_one_small_eye: \"zany_face\",\n\tserious_face_with_symbols_covering_mouth: \"face_with_symbols_on_mouth\",\n\tflipper: \"dolphin\",\n\tface_with_open_mouth_vomiting: \"face_vomiting\",\n\t\"flag-es\": \"es\",\n\tface_with_finger_covering_closed_lips: \"shushing_face\",\n\tsmiling_face_with_smiling_eyes_and_hand_covering_mouth: \"face_with_hand_over_mouth\",\n\t\"flag-fr\": \"fr\",\n\thoneybee: \"bee\",\n\tred_car: \"car\",\n\tenvelope: \"email\",\n\tuk: \"gb\",\n\t\"flag-gb\": \"gb\",\n\tpoop: \"hankey\",\n\tshit: \"hankey\",\n\tstaff_of_aesculapius: \"medical_symbol\",\n\tknife: \"hocho\",\n\tsailboat: \"boat\",\n\tpencil: \"memo\",\n\t\"flag-it\": \"it\",\n\t\"flag-jp\": \"jp\",\n\theavy_exclamation_mark: \"exclamation\",\n\t\"flag-kr\": \"kr\",\n\twaxing_gibbous_moon: \"moon\",\n\tmother_christmas: \"mrs_claus\",\n\tsun_small_cloud: \"mostly_sunny\",\n\tsun_behind_cloud: \"barely_sunny\",\n\tsun_behind_rain_cloud: \"partly_sunny_rain\",\n\tlightning_cloud: \"lightning\",\n\ttornado_cloud: \"tornado\",\n\t\"flag-ru\": \"ru\",\n\trunning: \"runner\",\n\t\"flag-us\": \"us\",\n\tman_and_woman_holding_hands: \"couple\",\n\t\"man-woman-boy\": \"family\",\n\tfamily: \"man-woman-boy\",\n\treversed_hand_with_middle_finger_extended: \"middle_finger\",\n\thand_with_index_and_middle_fingers_crossed: \"crossed_fingers\",\n\tsign_of_the_horns: \"the_horns\",\n\traised_hand: \"hand\",\n\tthumbsup: \"+1\",\n\tthumbsdown: \"-1\",\n\tpunch: \"facepunch\",\n\tcollision: \"boom\",\n\ttshirt: \"shirt\",\n\tshoe: \"mans_shoe\"\n};\nvar data = {\n\tcompressed: compressed,\n\tcategories: categories,\n\temojis: emojis,\n\taliases: aliases\n};\n\nfunction _classCallCheck (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError('Cannot call a class as a function');\n  }\n}\n\nvar _Object = Object;\n\nvar _createClass = (function createClass() {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if ('value' in descriptor) descriptor.writable = true;\n      _Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n})();\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\nvar hasOwnProperty = Object.prototype.hasOwnProperty,\n    hasDontEnumBug = !{ toString: null }.propertyIsEnumerable('toString'),\n    dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],\n    dontEnumsLength = dontEnums.length;\n\nfunction _Object$keys (obj) {\n  if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {\n    throw new TypeError('Object.keys called on non-object');\n  }\n\n  var result = [],\n      prop,\n      i;\n\n  for (prop in obj) {\n    if (hasOwnProperty.call(obj, prop)) {\n      result.push(prop);\n    }\n  }\n\n  if (hasDontEnumBug) {\n    for (i = 0; i < dontEnumsLength; i++) {\n      if (hasOwnProperty.call(obj, dontEnums[i])) {\n        result.push(dontEnums[i]);\n      }\n    }\n  }\n  return result;\n}\n\nvar mapping = {\n  name: 'a',\n  unified: 'b',\n  non_qualified: 'c',\n  has_img_apple: 'd',\n  has_img_google: 'e',\n  has_img_twitter: 'f',\n  has_img_emojione: 'g',\n  has_img_facebook: 'h',\n  has_img_messenger: 'i',\n  keywords: 'j',\n  sheet: 'k',\n  emoticons: 'l',\n  text: 'm',\n  short_names: 'n',\n  added_in: 'o'\n};\n\nvar buildSearch = function buildSearch(emoji) {\n  var search = [];\n\n  var addToSearch = function addToSearch(strings, split) {\n    if (!strings) {\n      return;\n    }\n(Array.isArray(strings) ? strings : [strings]).forEach(function (string) {\n(split ? string.split(/[-|_|\\s]+/) : [string]).forEach(function (s) {\n        s = s.toLowerCase();\n\n        if (search.indexOf(s) == -1) {\n          search.push(s);\n        }\n      });\n    });\n  };\n\n  addToSearch(emoji.short_names, true);\n  addToSearch(emoji.name, true);\n  addToSearch(emoji.keywords, false);\n  addToSearch(emoji.emoticons, false);\n\n  return search.join(',');\n};\n\nvar uncompress = function uncompress(data) {\n  data.compressed = false;\n\n  for (var id in data.emojis) {\n    var emoji = data.emojis[id];\n\n    for (var key in mapping) {\n      emoji[key] = emoji[mapping[key]];\n      delete emoji[mapping[key]];\n    }\n\n    if (!emoji.short_names) emoji.short_names = [];\n    emoji.short_names.unshift(id);\n\n    emoji.sheet_x = emoji.sheet[0];\n    emoji.sheet_y = emoji.sheet[1];\n    delete emoji.sheet;\n\n    if (!emoji.text) emoji.text = '';\n\n    if (!emoji.added_in) emoji.added_in = 6;\n    emoji.added_in = emoji.added_in.toFixed(1);\n\n    emoji.search = buildSearch(emoji);\n  }\n};\n\nvar _String = String;\n\nvar stringFromCodePoint = _String.fromCodePoint || function stringFromCodePoint() {\n  var MAX_SIZE = 0x4000;\n  var codeUnits = [];\n  var highSurrogate;\n  var lowSurrogate;\n  var index = -1;\n  var length = arguments.length;\n  if (!length) {\n    return '';\n  }\n  var result = '';\n  while (++index < length) {\n    var codePoint = Number(arguments[index]);\n    if (!isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n    codePoint < 0 || // not a valid Unicode code point\n    codePoint > 0x10ffff || // not a valid Unicode code point\n    Math.floor(codePoint) != codePoint // not an integer\n    ) {\n        throw RangeError('Invalid code point: ' + codePoint);\n      }\n    if (codePoint <= 0xffff) {\n      // BMP code point\n      codeUnits.push(codePoint);\n    } else {\n      // Astral code point; split in surrogate halves\n      // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n      codePoint -= 0x10000;\n      highSurrogate = (codePoint >> 10) + 0xd800;\n      lowSurrogate = codePoint % 0x400 + 0xdc00;\n      codeUnits.push(highSurrogate, lowSurrogate);\n    }\n    if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n      result += String.fromCharCode.apply(null, codeUnits);\n      codeUnits.length = 0;\n    }\n  }\n  return result;\n};\n\nvar _JSON = JSON;\n\nvar COLONS_REGEX = /^(?:\\:([^\\:]+)\\:)(?:\\:skin-tone-(\\d)\\:)?$/;\nvar SKINS = ['1F3FA', '1F3FB', '1F3FC', '1F3FD', '1F3FE', '1F3FF'];\n\nfunction unifiedToNative(unified) {\n  var unicodes = unified.split('-'),\n      codePoints = unicodes.map(function (u) {\n    return '0x' + u;\n  });\n\n  return stringFromCodePoint.apply(null, codePoints);\n}\n\nfunction sanitize(emoji) {\n  var name = emoji.name;\n  var short_names = emoji.short_names;\n  var skin_tone = emoji.skin_tone;\n  var skin_variations = emoji.skin_variations;\n  var emoticons = emoji.emoticons;\n  var unified = emoji.unified;\n  var custom = emoji.custom;\n  var imageUrl = emoji.imageUrl;\n  var id = emoji.id || short_names[0];\n  var colons = ':' + id + ':';\n\n  if (custom) {\n    return {\n      id: id,\n      name: name,\n      short_names: short_names,\n      colons: colons,\n      emoticons: emoticons,\n      custom: custom,\n      imageUrl: imageUrl\n    };\n  }\n\n  if (skin_tone) {\n    colons += ':skin-tone-' + skin_tone + ':';\n  }\n\n  return {\n    id: id,\n    name: name,\n    short_names: short_names,\n    colons: colons,\n    emoticons: emoticons,\n    unified: unified.toLowerCase(),\n    skin: skin_tone || (skin_variations ? 1 : null),\n    native: unifiedToNative(unified)\n  };\n}\n\nfunction getSanitizedData() {\n  return sanitize(getData.apply(undefined, arguments));\n}\n\nfunction getData(emoji, skin, set, data) {\n  var emojiData = {};\n\n  if (typeof emoji == 'string') {\n    var matches = emoji.match(COLONS_REGEX);\n\n    if (matches) {\n      emoji = matches[1];\n\n      if (matches[2]) {\n        skin = parseInt(matches[2], 10);\n      }\n    }\n\n    if (data.aliases.hasOwnProperty(emoji)) {\n      emoji = data.aliases[emoji];\n    }\n\n    if (data.emojis.hasOwnProperty(emoji)) {\n      emojiData = data.emojis[emoji];\n    } else {\n      return null;\n    }\n  } else if (emoji.id) {\n    if (data.aliases.hasOwnProperty(emoji.id)) {\n      emoji.id = data.aliases[emoji.id];\n    }\n\n    if (data.emojis.hasOwnProperty(emoji.id)) {\n      emojiData = data.emojis[emoji.id];\n      skin || (skin = emoji.skin);\n    }\n  }\n\n  if (!_Object$keys(emojiData).length) {\n    emojiData = emoji;\n    emojiData.custom = true;\n\n    if (!emojiData.search) {\n      emojiData.search = buildSearch(emoji);\n    }\n  }\n\n  emojiData.emoticons || (emojiData.emoticons = []);\n  emojiData.variations || (emojiData.variations = []);\n\n  if (emojiData.skin_variations && skin > 1) {\n    emojiData = JSON.parse(_JSON.stringify(emojiData));\n\n    var skinKey = SKINS[skin - 1],\n        variationData = emojiData.skin_variations[skinKey];\n\n    if (!variationData.variations && emojiData.variations) {\n      delete emojiData.variations;\n    }\n\n    if (set && (variationData['has_img_' + set] == undefined || variationData['has_img_' + set]) || !set) {\n      emojiData.skin_tone = skin;\n\n      for (var k in variationData) {\n        var v = variationData[k];\n        emojiData[k] = v;\n      }\n    }\n  }\n\n  if (emojiData.variations && emojiData.variations.length) {\n    emojiData = JSON.parse(_JSON.stringify(emojiData));\n    emojiData.unified = emojiData.variations.shift();\n  }\n\n  return emojiData;\n}\n\nfunction uniq(arr) {\n  return arr.reduce(function (acc, item) {\n    if (acc.indexOf(item) === -1) {\n      acc.push(item);\n    }\n    return acc;\n  }, []);\n}\n\nfunction intersect(a, b) {\n  var uniqA = uniq(a);\n  var uniqB = uniq(b);\n\n  return uniqA.filter(function (item) {\n    return uniqB.indexOf(item) >= 0;\n  });\n}\n\nfunction deepMerge(a, b) {\n  var o = {};\n\n  for (var key in a) {\n    var originalValue = a[key],\n        value = originalValue;\n\n    if (b.hasOwnProperty(key)) {\n      value = b[key];\n    }\n\n    if (typeof value === 'object') {\n      value = deepMerge(originalValue, value);\n    }\n\n    o[key] = value;\n  }\n\n  return o;\n}\n\n// https://github.com/sonicdoe/measure-scrollbar\nfunction measureScrollbar() {\n  if (typeof document == 'undefined') return 0;\n  var div = document.createElement('div');\n\n  div.style.width = '100px';\n  div.style.height = '100px';\n  div.style.overflow = 'scroll';\n  div.style.position = 'absolute';\n  div.style.top = '-9999px';\n\n  document.body.appendChild(div);\n  var scrollbarWidth = div.offsetWidth - div.clientWidth;\n  document.body.removeChild(div);\n\n  return scrollbarWidth;\n}\n\n// Use requestIdleCallback() if available, else fall back to setTimeout().\n// Throttle so as not to run too frequently.\nfunction throttleIdleTask(func) {\n  var doIdleTask = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout;\n\n  var running = false;\n\n  return function throttled() {\n    if (running) {\n      return;\n    }\n    running = true;\n    doIdleTask(function () {\n      running = false;\n      func();\n    });\n  };\n}\n\nvar NAMESPACE = 'emoji-mart';\n\nvar _JSON$1 = JSON;\n\nvar isLocalStorageSupported = typeof window !== 'undefined' && 'localStorage' in window;\n\nvar getter = void 0;\nvar setter = void 0;\n\nfunction setHandlers(handlers) {\n  handlers || (handlers = {});\n\n  getter = handlers.getter;\n  setter = handlers.setter;\n}\n\nfunction setNamespace(namespace) {\n  NAMESPACE = namespace;\n}\n\nfunction update(state) {\n  for (var key in state) {\n    var value = state[key];\n    set(key, value);\n  }\n}\n\nfunction set(key, value) {\n  if (setter) {\n    setter(key, value);\n  } else {\n    if (!isLocalStorageSupported) return;\n    try {\n      window.localStorage[NAMESPACE + '.' + key] = _JSON$1.stringify(value);\n    } catch (e) {}\n  }\n}\n\nfunction get(key) {\n  if (getter) {\n    return getter(key);\n  } else {\n    if (!isLocalStorageSupported) return;\n    try {\n      var value = window.localStorage[NAMESPACE + '.' + key];\n    } catch (e) {\n      return;\n    }\n\n    if (value) {\n      return JSON.parse(value);\n    }\n  }\n}\n\nvar store = { update: update, set: set, get: get, setNamespace: setNamespace, setHandlers: setHandlers };\n\nvar NimbleEmojiIndex = function () {\n  function NimbleEmojiIndex(data, set) {\n    _classCallCheck(this, NimbleEmojiIndex);\n\n    if (data.compressed) {\n      uncompress(data);\n    }\n\n    this.data = data || {};\n    this.set = set || null;\n    this.originalPool = {};\n    this.index = {};\n    this.emojis = {};\n    this.emoticons = {};\n    this.customEmojisList = [];\n\n    this.buildIndex();\n  }\n\n  _createClass(NimbleEmojiIndex, [{\n    key: 'buildIndex',\n    value: function buildIndex() {\n      var _this = this;\n\n      var _loop = function _loop(emoji) {\n        var emojiData = _this.data.emojis[emoji];\n        var short_names = emojiData.short_names;\n        var emoticons = emojiData.emoticons;\n        var skin_variations = emojiData.skin_variations;\n        var id = short_names[0];\n\n        if (emoticons) {\n          emoticons.forEach(function (emoticon) {\n            if (_this.emoticons[emoticon]) {\n              return;\n            }\n\n            _this.emoticons[emoticon] = id;\n          });\n        }\n\n        // If skin variations include them\n        if (skin_variations) {\n          _this.emojis[id] = {};\n          for (var skinTone = 1; skinTone <= 6; skinTone++) {\n            _this.emojis[id][skinTone] = getSanitizedData({ id: id, skin: skinTone }, skinTone, _this.set, _this.data);\n          }\n        } else {\n          _this.emojis[id] = getSanitizedData(id, null, _this.set, _this.data);\n        }\n\n        _this.originalPool[id] = emojiData;\n      };\n\n      for (var emoji in this.data.emojis) {\n        _loop(emoji);\n      }\n    }\n  }, {\n    key: 'clearCustomEmojis',\n    value: function clearCustomEmojis(pool) {\n      var _this2 = this;\n\n      this.customEmojisList.forEach(function (emoji) {\n        var emojiId = emoji.id || emoji.short_names[0];\n\n        delete pool[emojiId];\n        delete _this2.emojis[emojiId];\n      });\n    }\n  }, {\n    key: 'addCustomToPool',\n    value: function addCustomToPool(custom, pool) {\n      var _this3 = this;\n\n      if (this.customEmojisList.length) this.clearCustomEmojis(pool);\n\n      custom.forEach(function (emoji) {\n        var emojiId = emoji.id || emoji.short_names[0];\n\n        if (emojiId && !pool[emojiId]) {\n          pool[emojiId] = getData(emoji, null, null, _this3.data);\n          _this3.emojis[emojiId] = getSanitizedData(emoji, null, null, _this3.data);\n        }\n      });\n\n      this.customEmojisList = custom;\n      this.index = {};\n    }\n  }, {\n    key: 'search',\n    value: function search(value) {\n      var _this4 = this;\n\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var emojisToShowFilter = _ref.emojisToShowFilter;\n      var maxResults = _ref.maxResults;\n      var include = _ref.include;\n      var exclude = _ref.exclude;\n      var _ref$custom = _ref.custom;\n      var custom = _ref$custom === undefined ? [] : _ref$custom;\n\n      if (this.customEmojisList != custom) this.addCustomToPool(custom, this.originalPool);\n\n      var skinTone = store.get('skin') || 1;\n\n      maxResults || (maxResults = 75);\n      include || (include = []);\n      exclude || (exclude = []);\n\n      var results = null,\n          pool = this.originalPool;\n\n      if (value.length) {\n        if (value == '-' || value == '-1') {\n          return [this.emojis['-1'][skinTone]];\n        }\n\n        var values = value.toLowerCase().split(/[\\s|,|\\-|_]+/),\n            allResults = [];\n\n        if (values.length > 2) {\n          values = [values[0], values[1]];\n        }\n\n        if (include.length || exclude.length) {\n          pool = {};\n\n          this.data.categories.forEach(function (category) {\n            var isIncluded = include && include.length ? include.indexOf(category.id) > -1 : true;\n            var isExcluded = exclude && exclude.length ? exclude.indexOf(category.id) > -1 : false;\n            if (!isIncluded || isExcluded) {\n              return;\n            }\n\n            category.emojis.forEach(function (emojiId) {\n              return pool[emojiId] = _this4.data.emojis[emojiId];\n            });\n          });\n\n          if (custom.length) {\n            var customIsIncluded = include && include.length ? include.indexOf('custom') > -1 : true;\n            var customIsExcluded = exclude && exclude.length ? exclude.indexOf('custom') > -1 : false;\n            if (customIsIncluded && !customIsExcluded) {\n              this.addCustomToPool(custom, pool);\n            }\n          }\n        }\n\n        allResults = values.map(function (value) {\n          var aPool = pool,\n              aIndex = _this4.index,\n              length = 0;\n\n          for (var charIndex = 0; charIndex < value.length; charIndex++) {\n            var char = value[charIndex];\n            length++;\n\n            aIndex[char] || (aIndex[char] = {});\n            aIndex = aIndex[char];\n\n            if (!aIndex.results) {\n              (function () {\n                var scores = {};\n\n                aIndex.results = [];\n                aIndex.pool = {};\n\n                for (var _id in aPool) {\n                  var emoji = aPool[_id];\n                  var search = emoji.search;\n                  var sub = value.substr(0, length);\n                  var subIndex = search.indexOf(sub);\n\n                  if (subIndex != -1) {\n                    var score = subIndex + 1;\n                    if (sub == _id) score = 0;\n\n                    if (_this4.emojis[_id] && _this4.emojis[_id][skinTone]) {\n                      aIndex.results.push(_this4.emojis[_id][skinTone]);\n                    } else {\n                      aIndex.results.push(_this4.emojis[_id]);\n                    }\n                    aIndex.pool[_id] = emoji;\n\n                    scores[_id] = score;\n                  }\n                }\n\n                aIndex.results.sort(function (a, b) {\n                  var aScore = scores[a.id],\n                      bScore = scores[b.id];\n\n                  return aScore - bScore;\n                });\n              })();\n            }\n\n            aPool = aIndex.pool;\n          }\n\n          return aIndex.results;\n        }).filter(function (a) {\n          return a;\n        });\n\n        if (allResults.length > 1) {\n          results = intersect.apply(null, allResults);\n        } else if (allResults.length) {\n          results = allResults[0];\n        } else {\n          results = [];\n        }\n      }\n\n      if (results) {\n        if (emojisToShowFilter) {\n          results = results.filter(function (result) {\n            return emojisToShowFilter(pool[result.id]);\n          });\n        }\n\n        if (results && results.length > maxResults) {\n          results = results.slice(0, maxResults);\n        }\n      }\n\n      return results;\n    }\n  }]);\n\n  return NimbleEmojiIndex;\n}();\n\nvar emojiIndex = new NimbleEmojiIndex(data);\n\nvar DEFAULTS = ['+1', 'grinning', 'kissing_heart', 'heart_eyes', 'laughing', 'stuck_out_tongue_winking_eye', 'sweat_smile', 'joy', 'scream', 'disappointed', 'unamused', 'weary', 'sob', 'sunglasses', 'heart', 'poop'];\n\nvar frequently = void 0,\n    initialized = void 0;\nvar defaults = {};\n\nfunction init() {\n  initialized = true;\n  frequently = store.get('frequently');\n}\n\nfunction add(emoji) {\n  if (!initialized) init();\n  var id = emoji.id;\n\n\n  frequently || (frequently = defaults);\n  frequently[id] || (frequently[id] = 0);\n  frequently[id] += 1;\n\n  store.set('last', id);\n  store.set('frequently', frequently);\n}\n\nfunction get$1(perLine) {\n  if (!initialized) init();\n  if (!frequently) {\n    defaults = {};\n\n    var result = [];\n\n    for (var i = 0; i < perLine; i++) {\n      defaults[DEFAULTS[i]] = perLine - i;\n      result.push(DEFAULTS[i]);\n    }\n\n    return result;\n  }\n\n  var quantity = perLine * 4;\n  var frequentlyKeys = [];\n\n  for (var key in frequently) {\n    if (frequently.hasOwnProperty(key)) {\n      frequentlyKeys.push(key);\n    }\n  }\n\n  var sorted = frequentlyKeys.sort(function (a, b) {\n    return frequently[a] - frequently[b];\n  }).reverse();\n  var sliced = sorted.slice(0, quantity);\n\n  var last = store.get('last');\n\n  if (last && sliced.indexOf(last) == -1) {\n    sliced.pop();\n    sliced.push(last);\n  }\n\n  return sliced;\n}\n\nvar frequently$1 = { add: add, get: get$1 };\n\nvar _Object$1 = Object;\n\nvar _extends = _Object$1.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\nvar _Object$2 = Object;\n\nvar _Object$getPrototypeOf = _Object$2.getPrototypeOf || function (O) {\n  O = Object(O);\n\n  if (typeof O.constructor === 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  }\n\n  return O instanceof Object ? Object.prototype : null;\n};\n\nfunction possibleConstructorReturn(self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === 'object' || typeof call === 'function') ? call : self;\n}\n\nvar _Object$3 = Object;\n\nfunction inherits(subClass, superClass) {\n  if (typeof superClass !== 'function' && superClass !== null) {\n    throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n  }\n\n  subClass.prototype = _Object$3.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) {\n    _Object$3.setPrototypeOf ? _Object$3.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n  }\n}\n\n// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\n// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel\n\n// MIT license\n\nvar isWindowAvailable = typeof window !== 'undefined';\n\nisWindowAvailable && function () {\n  var lastTime = 0;\n  var vendors = ['ms', 'moz', 'webkit', 'o'];\n\n  for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n    window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n  }\n\n  if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback, element) {\n    var currTime = new Date().getTime();\n    var timeToCall = Math.max(0, 16 - (currTime - lastTime));\n    var id = window.setTimeout(function () {\n      callback(currTime + timeToCall);\n    }, timeToCall);\n\n    lastTime = currTime + timeToCall;\n    return id;\n  };\n\n  if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) {\n    clearTimeout(id);\n  };\n}();\n\nvar categories$1 = {\n  activity: function activity() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0C5.373 0 0 5.372 0 12c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.628-5.372-12-12-12m9.949 11H17.05c.224-2.527 1.232-4.773 1.968-6.113A9.966 9.966 0 0 1 21.949 11M13 11V2.051a9.945 9.945 0 0 1 4.432 1.564c-.858 1.491-2.156 4.22-2.392 7.385H13zm-2 0H8.961c-.238-3.165-1.536-5.894-2.393-7.385A9.95 9.95 0 0 1 11 2.051V11zm0 2v8.949a9.937 9.937 0 0 1-4.432-1.564c.857-1.492 2.155-4.221 2.393-7.385H11zm4.04 0c.236 3.164 1.534 5.893 2.392 7.385A9.92 9.92 0 0 1 13 21.949V13h2.04zM4.982 4.887C5.718 6.227 6.726 8.473 6.951 11h-4.9a9.977 9.977 0 0 1 2.931-6.113M2.051 13h4.9c-.226 2.527-1.233 4.771-1.969 6.113A9.972 9.972 0 0 1 2.051 13m16.967 6.113c-.735-1.342-1.744-3.586-1.968-6.113h4.899a9.961 9.961 0 0 1-2.931 6.113\" })\n    );\n  },\n\n  custom: function custom() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        \"g\",\n        { transform: \"translate(2.000000, 1.000000)\" },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"rect\", { id: \"Rectangle\", x: \"8\", y: \"0\", width: \"3\", height: \"21\", rx: \"1.5\" }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"rect\", {\n          id: \"Rectangle\",\n          transform: \"translate(9.843, 10.549) rotate(60) translate(-9.843, -10.549) \",\n          x: \"8.343\",\n          y: \"0.049\",\n          width: \"3\",\n          height: \"21\",\n          rx: \"1.5\"\n        }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"rect\", {\n          id: \"Rectangle\",\n          transform: \"translate(9.843, 10.549) rotate(-60) translate(-9.843, -10.549) \",\n          x: \"8.343\",\n          y: \"0.049\",\n          width: \"3\",\n          height: \"21\",\n          rx: \"1.5\"\n        })\n      )\n    );\n  },\n\n  flags: function flags() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M0 0l6.084 24H8L1.916 0zM21 5h-4l-1-4H4l3 12h3l1 4h13L21 5zM6.563 3h7.875l2 8H8.563l-2-8zm8.832 10l-2.856 1.904L12.063 13h3.332zM19 13l-1.5-6h1.938l2 8H16l3-2z\" })\n    );\n  },\n\n  foods: function foods() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M17 4.978c-1.838 0-2.876.396-3.68.934.513-1.172 1.768-2.934 4.68-2.934a1 1 0 0 0 0-2c-2.921 0-4.629 1.365-5.547 2.512-.064.078-.119.162-.18.244C11.73 1.838 10.798.023 9.207.023 8.579.022 7.85.306 7 .978 5.027 2.54 5.329 3.902 6.492 4.999 3.609 5.222 0 7.352 0 12.969c0 4.582 4.961 11.009 9 11.009 1.975 0 2.371-.486 3-1 .629.514 1.025 1 3 1 4.039 0 9-6.418 9-11 0-5.953-4.055-8-7-8M8.242 2.546c.641-.508.943-.523.965-.523.426.169.975 1.405 1.357 3.055-1.527-.629-2.741-1.352-2.98-1.846.059-.112.241-.356.658-.686M15 21.978c-1.08 0-1.21-.109-1.559-.402l-.176-.146c-.367-.302-.816-.452-1.266-.452s-.898.15-1.266.452l-.176.146c-.347.292-.477.402-1.557.402-2.813 0-7-5.389-7-9.009 0-5.823 4.488-5.991 5-5.991 1.939 0 2.484.471 3.387 1.251l.323.276a1.995 1.995 0 0 0 2.58 0l.323-.276c.902-.78 1.447-1.251 3.387-1.251.512 0 5 .168 5 6 0 3.617-4.187 9-7 9\" })\n    );\n  },\n\n  nature: function nature() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M15.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 15.5 8M8.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 8.5 8\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M18.933 0h-.027c-.97 0-2.138.787-3.018 1.497-1.274-.374-2.612-.51-3.887-.51-1.285 0-2.616.133-3.874.517C7.245.79 6.069 0 5.093 0h-.027C3.352 0 .07 2.67.002 7.026c-.039 2.479.276 4.238 1.04 5.013.254.258.882.677 1.295.882.191 3.177.922 5.238 2.536 6.38.897.637 2.187.949 3.2 1.102C8.04 20.6 8 20.795 8 21c0 1.773 2.35 3 4 3 1.648 0 4-1.227 4-3 0-.201-.038-.393-.072-.586 2.573-.385 5.435-1.877 5.925-7.587.396-.22.887-.568 1.104-.788.763-.774 1.079-2.534 1.04-5.013C23.929 2.67 20.646 0 18.933 0M3.223 9.135c-.237.281-.837 1.155-.884 1.238-.15-.41-.368-1.349-.337-3.291.051-3.281 2.478-4.972 3.091-5.031.256.015.731.27 1.265.646-1.11 1.171-2.275 2.915-2.352 5.125-.133.546-.398.858-.783 1.313M12 22c-.901 0-1.954-.693-2-1 0-.654.475-1.236 1-1.602V20a1 1 0 1 0 2 0v-.602c.524.365 1 .947 1 1.602-.046.307-1.099 1-2 1m3-3.48v.02a4.752 4.752 0 0 0-1.262-1.02c1.092-.516 2.239-1.334 2.239-2.217 0-1.842-1.781-2.195-3.977-2.195-2.196 0-3.978.354-3.978 2.195 0 .883 1.148 1.701 2.238 2.217A4.8 4.8 0 0 0 9 18.539v-.025c-1-.076-2.182-.281-2.973-.842-1.301-.92-1.838-3.045-1.853-6.478l.023-.041c.496-.826 1.49-1.45 1.804-3.102 0-2.047 1.357-3.631 2.362-4.522C9.37 3.178 10.555 3 11.948 3c1.447 0 2.685.192 3.733.57 1 .9 2.316 2.465 2.316 4.48.313 1.651 1.307 2.275 1.803 3.102.035.058.068.117.102.178-.059 5.967-1.949 7.01-4.902 7.19m6.628-8.202c-.037-.065-.074-.13-.113-.195a7.587 7.587 0 0 0-.739-.987c-.385-.455-.648-.768-.782-1.313-.076-2.209-1.241-3.954-2.353-5.124.531-.376 1.004-.63 1.261-.647.636.071 3.044 1.764 3.096 5.031.027 1.81-.347 3.218-.37 3.235\" })\n    );\n  },\n\n  objects: function objects() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0a9 9 0 0 0-5 16.482V21s2.035 3 5 3 5-3 5-3v-4.518A9 9 0 0 0 12 0zm0 2c3.86 0 7 3.141 7 7s-3.14 7-7 7-7-3.141-7-7 3.14-7 7-7zM9 17.477c.94.332 1.946.523 3 .523s2.06-.19 3-.523v.834c-.91.436-1.925.689-3 .689a6.924 6.924 0 0 1-3-.69v-.833zm.236 3.07A8.854 8.854 0 0 0 12 21c.965 0 1.888-.167 2.758-.451C14.155 21.173 13.153 22 12 22c-1.102 0-2.117-.789-2.764-1.453z\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M14.745 12.449h-.004c-.852-.024-1.188-.858-1.577-1.824-.421-1.061-.703-1.561-1.182-1.566h-.009c-.481 0-.783.497-1.235 1.537-.436.982-.801 1.811-1.636 1.791l-.276-.043c-.565-.171-.853-.691-1.284-1.794-.125-.313-.202-.632-.27-.913-.051-.213-.127-.53-.195-.634C7.067 9.004 7.039 9 6.99 9A1 1 0 0 1 7 7h.01c1.662.017 2.015 1.373 2.198 2.134.486-.981 1.304-2.058 2.797-2.075 1.531.018 2.28 1.153 2.731 2.141l.002-.008C14.944 8.424 15.327 7 16.979 7h.032A1 1 0 1 1 17 9h-.011c-.149.076-.256.474-.319.709a6.484 6.484 0 0 1-.311.951c-.429.973-.79 1.789-1.614 1.789\" })\n    );\n  },\n\n  people: function people() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0\" })\n    );\n  },\n\n  places: function places() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M6.5 12C5.122 12 4 13.121 4 14.5S5.122 17 6.5 17 9 15.879 9 14.5 7.878 12 6.5 12m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5M17.5 12c-1.378 0-2.5 1.121-2.5 2.5s1.122 2.5 2.5 2.5 2.5-1.121 2.5-2.5-1.122-2.5-2.5-2.5m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M22.482 9.494l-1.039-.346L21.4 9h.6c.552 0 1-.439 1-.992 0-.006-.003-.008-.003-.008H23c0-1-.889-2-1.984-2h-.642l-.731-1.717C19.262 3.012 18.091 2 16.764 2H7.236C5.909 2 4.738 3.012 4.357 4.283L3.626 6h-.642C1.889 6 1 7 1 8h.003S1 8.002 1 8.008C1 8.561 1.448 9 2 9h.6l-.043.148-1.039.346a2.001 2.001 0 0 0-1.359 2.097l.751 7.508a1 1 0 0 0 .994.901H3v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h6v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h1.096a.999.999 0 0 0 .994-.901l.751-7.508a2.001 2.001 0 0 0-1.359-2.097M6.273 4.857C6.402 4.43 6.788 4 7.236 4h9.527c.448 0 .834.43.963.857L19.313 9H4.688l1.585-4.143zM7 21H5v-1h2v1zm12 0h-2v-1h2v1zm2.189-3H2.811l-.662-6.607L3 11h18l.852.393L21.189 18z\" })\n    );\n  },\n\n  recent: function recent() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M13 4h-2l-.001 7H9v2h2v2h2v-2h4v-2h-4z\" }),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10\" })\n    );\n  },\n\n  symbols: function symbols() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 24 24\",\n        width: \"24\",\n        height: \"24\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M0 0h11v2H0zM4 11h3V6h4V4H0v2h4zM15.5 17c1.381 0 2.5-1.116 2.5-2.493s-1.119-2.493-2.5-2.493S13 13.13 13 14.507 14.119 17 15.5 17m0-2.986c.276 0 .5.222.5.493 0 .272-.224.493-.5.493s-.5-.221-.5-.493.224-.493.5-.493M21.5 19.014c-1.381 0-2.5 1.116-2.5 2.493S20.119 24 21.5 24s2.5-1.116 2.5-2.493-1.119-2.493-2.5-2.493m0 2.986a.497.497 0 0 1-.5-.493c0-.271.224-.493.5-.493s.5.222.5.493a.497.497 0 0 1-.5.493M22 13l-9 9 1.513 1.5 8.99-9.009zM17 11c2.209 0 4-1.119 4-2.5V2s.985-.161 1.498.949C23.01 4.055 23 6 23 6s1-1.119 1-3.135C24-.02 21 0 21 0h-2v6.347A5.853 5.853 0 0 0 17 6c-2.209 0-4 1.119-4 2.5s1.791 2.5 4 2.5M10.297 20.482l-1.475-1.585a47.54 47.54 0 0 1-1.442 1.129c-.307-.288-.989-1.016-2.045-2.183.902-.836 1.479-1.466 1.729-1.892s.376-.871.376-1.336c0-.592-.273-1.178-.818-1.759-.546-.581-1.329-.871-2.349-.871-1.008 0-1.79.293-2.344.879-.556.587-.832 1.181-.832 1.784 0 .813.419 1.748 1.256 2.805-.847.614-1.444 1.208-1.794 1.784a3.465 3.465 0 0 0-.523 1.833c0 .857.308 1.56.924 2.107.616.549 1.423.823 2.42.823 1.173 0 2.444-.379 3.813-1.137L8.235 24h2.819l-2.09-2.383 1.333-1.135zm-6.736-6.389a1.02 1.02 0 0 1 .73-.286c.31 0 .559.085.747.254a.849.849 0 0 1 .283.659c0 .518-.419 1.112-1.257 1.784-.536-.651-.805-1.231-.805-1.742a.901.901 0 0 1 .302-.669M3.74 22c-.427 0-.778-.116-1.057-.349-.279-.232-.418-.487-.418-.766 0-.594.509-1.288 1.527-2.083.968 1.134 1.717 1.946 2.248 2.438-.921.507-1.686.76-2.3.76\" })\n    );\n  }\n};\n\nvar search$1 = {\n  search: function search() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        width: \"13\",\n        height: \"13\",\n        viewBox: \"0 0 20 20\",\n        opacity: \"0.5\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" })\n    );\n  },\n\n  delete: function _delete() {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      \"svg\",\n      {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        width: \"13\",\n        height: \"13\",\n        viewBox: \"0 0 20 20\",\n        opacity: \"0.5\"\n      },\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"path\", { d: \"M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z\" })\n    );\n  }\n};\n\nvar icons = /*#__PURE__*/Object.freeze({\n  categories: categories$1,\n  search: search$1\n});\n\nvar EmojiPropTypes = {\n  data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  onOver: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onLeave: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  fallback: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  backgroundImageFn: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  native: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  forceSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  tooltip: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([1, 2, 3, 4, 5, 6]),\n  sheetSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf([16, 20, 32, 64]),\n  sheetColumns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  sheetRows: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  set: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['apple', 'google', 'twitter', 'emojione', 'messenger', 'facebook']),\n  size: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  emoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object]).isRequired\n};\n\nvar PickerPropTypes = {\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onSelect: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onSkinChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  perLine: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  emojiSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  i18n: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n  style: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,\n  title: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  emoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  color: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  set: EmojiPropTypes.set,\n  skin: EmojiPropTypes.skin,\n  native: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  backgroundImageFn: EmojiPropTypes.backgroundImageFn,\n  sheetSize: EmojiPropTypes.sheetSize,\n  emojisToShowFilter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  showPreview: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  showSkinTones: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  emojiTooltip: EmojiPropTypes.tooltip,\n  include: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  exclude: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  recent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  custom: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({\n    name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n    short_names: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string).isRequired,\n    emoticons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n    keywords: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n    imageUrl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n    spriteUrl: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n    sheet_x: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    sheet_y: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    size: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    sheetColumns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n    sheetRows: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number\n  })),\n  skinEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  notFound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  notFoundEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  icons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nvar Anchors = function (_React$PureComponent) {\n  inherits(Anchors, _React$PureComponent);\n\n  function Anchors(props) {\n    _classCallCheck(this, Anchors);\n\n    var _this = possibleConstructorReturn(this, (Anchors.__proto__ || _Object$getPrototypeOf(Anchors)).call(this, props));\n\n    var defaultCategory = props.categories.filter(function (category) {\n      return category.first;\n    })[0];\n\n    _this.state = {\n      selected: defaultCategory.name\n    };\n\n    _this.handleClick = _this.handleClick.bind(_this);\n    return _this;\n  }\n\n  _createClass(Anchors, [{\n    key: 'handleClick',\n    value: function handleClick(e) {\n      var index = e.currentTarget.getAttribute('data-index');\n      var _props = this.props;\n      var categories = _props.categories;\n      var onAnchorClick = _props.onAnchorClick;\n\n\n      onAnchorClick(categories[index], index);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var _props2 = this.props;\n      var categories = _props2.categories;\n      var color = _props2.color;\n      var i18n = _props2.i18n;\n      var icons = _props2.icons;\n      var selected = this.state.selected;\n\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'nav',\n        { className: 'emoji-mart-anchors', 'aria-label': i18n.categorieslabel },\n        categories.map(function (category, i) {\n          var id = category.id;\n          var name = category.name;\n          var anchor = category.anchor;\n          var isSelected = name == selected;\n\n          if (anchor === false) {\n            return null;\n          }\n\n          return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'button',\n            {\n              key: id,\n              'aria-label': i18n.categories[id],\n              title: i18n.categories[id],\n              'data-index': i,\n              type: 'button',\n              onClick: _this2.handleClick,\n              className: 'emoji-mart-anchor ' + (isSelected ? 'emoji-mart-anchor-selected' : ''),\n              style: { color: isSelected ? color : null }\n            },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-anchor-icon' },\n              icons.categories[id]()\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('span', {\n              className: 'emoji-mart-anchor-bar',\n              style: { backgroundColor: color }\n            })\n          );\n        })\n      );\n    }\n  }]);\n\n  return Anchors;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nAnchors.propTypes /* remove-proptypes */ = {\n  categories: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n  onAnchorClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  icons: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nAnchors.defaultProps = {\n  categories: [],\n  onAnchorClick: function onAnchorClick() {},\n  icons: {}\n};\n\nvar EmojiDefaultProps = {\n  skin: 1,\n  set: 'apple',\n  sheetSize: 64,\n  sheetColumns: 52,\n  sheetRows: 52,\n  native: false,\n  forceSize: false,\n  tooltip: false,\n  backgroundImageFn: function backgroundImageFn(set, sheetSize) {\n    return 'https://unpkg.com/emoji-datasource-' + set + '@' + '4.0.4' + '/img/' + set + '/sheets-256/' + sheetSize + '.png';\n  }\n};\n\nvar PickerDefaultProps = {\n  onClick: function onClick() {},\n  onSelect: function onSelect() {},\n  onSkinChange: function onSkinChange() {},\n  emojiSize: 24,\n  perLine: 9,\n  i18n: {},\n  style: {},\n  title: 'Emoji Mart™',\n  emoji: 'department_store',\n  color: '#ae65c5',\n  set: EmojiDefaultProps.set,\n  skin: null,\n  defaultSkin: EmojiDefaultProps.skin,\n  native: EmojiDefaultProps.native,\n  sheetSize: EmojiDefaultProps.sheetSize,\n  backgroundImageFn: EmojiDefaultProps.backgroundImageFn,\n  emojisToShowFilter: null,\n  showPreview: true,\n  showSkinTones: true,\n  emojiTooltip: EmojiDefaultProps.tooltip,\n  autoFocus: false,\n  custom: [],\n  skinEmoji: '',\n  notFound: function notFound() {},\n  notFoundEmoji: 'sleuth_or_spy',\n  icons: {}\n};\n\nvar _getData = function _getData(props) {\n  var emoji = props.emoji;\n  var skin = props.skin;\n  var set = props.set;\n  var data = props.data;\n\n  return getData(emoji, skin, set, data);\n};\n\nvar _getPosition = function _getPosition(props) {\n  var _getData2 = _getData(props);\n\n  var sheet_x = _getData2.sheet_x;\n  var sheet_y = _getData2.sheet_y;\n  var multiplyX = 100 / (props.sheetColumns - 1);\n  var multiplyY = 100 / (props.sheetRows - 1);\n\n  return multiplyX * sheet_x + '% ' + multiplyY * sheet_y + '%';\n};\n\nvar _getSanitizedData = function _getSanitizedData(props) {\n  var emoji = props.emoji;\n  var skin = props.skin;\n  var set = props.set;\n  var data = props.data;\n\n  return getSanitizedData(emoji, skin, set, data);\n};\n\nvar _handleClick = function _handleClick(e, props) {\n  if (!props.onClick) {\n    return;\n  }\n  var onClick = props.onClick;\n  var emoji = _getSanitizedData(props);\n\n  onClick(emoji, e);\n};\n\nvar _handleOver = function _handleOver(e, props) {\n  if (!props.onOver) {\n    return;\n  }\n  var onOver = props.onOver;\n  var emoji = _getSanitizedData(props);\n\n  onOver(emoji, e);\n};\n\nvar _handleLeave = function _handleLeave(e, props) {\n  if (!props.onLeave) {\n    return;\n  }\n  var onLeave = props.onLeave;\n  var emoji = _getSanitizedData(props);\n\n  onLeave(emoji, e);\n};\n\nvar _isNumeric = function _isNumeric(value) {\n  return !isNaN(value - parseFloat(value));\n};\n\nvar _convertStyleToCSS = function _convertStyleToCSS(style) {\n  var div = document.createElement('div');\n\n  for (var key in style) {\n    var value = style[key];\n\n    if (_isNumeric(value)) {\n      value += 'px';\n    }\n\n    div.style[key] = value;\n  }\n\n  return div.getAttribute('style');\n};\n\nvar NimbleEmoji = function NimbleEmoji(props) {\n  if (props.data.compressed) {\n    uncompress(props.data);\n  }\n\n  for (var k in NimbleEmoji.defaultProps) {\n    if (props[k] == undefined && NimbleEmoji.defaultProps[k] != undefined) {\n      props[k] = NimbleEmoji.defaultProps[k];\n    }\n  }\n\n  var data = _getData(props);\n  if (!data) {\n    if (props.fallback) {\n      return props.fallback(null, props);\n    } else {\n      return null;\n    }\n  }\n\n  var unified = data.unified;\n  var custom = data.custom;\n  var short_names = data.short_names;\n  var imageUrl = data.imageUrl;\n  var style = {};\n  var children = props.children;\n  var className = 'emoji-mart-emoji';\n  var nativeEmoji = unified && unifiedToNative(unified);\n  // combine the emoji itself and all shortcodes into an accessible label\n  var label = [nativeEmoji].concat(short_names).filter(Boolean).join(', ');\n  var title = null;\n\n  if (!unified && !custom) {\n    if (props.fallback) {\n      return props.fallback(data, props);\n    } else {\n      return null;\n    }\n  }\n\n  if (props.tooltip) {\n    title = short_names[0];\n  }\n\n  if (props.native && unified) {\n    className += ' emoji-mart-emoji-native';\n    style = { fontSize: props.size };\n    children = nativeEmoji;\n\n    if (props.forceSize) {\n      style.display = 'inline-block';\n      style.width = props.size;\n      style.height = props.size;\n      style.wordBreak = 'keep-all';\n    }\n  } else if (custom) {\n    className += ' emoji-mart-emoji-custom';\n    style = {\n      width: props.size,\n      height: props.size,\n      display: 'inline-block'\n    };\n    if (data.spriteUrl) {\n      style = _extends({}, style, {\n        backgroundImage: 'url(' + data.spriteUrl + ')',\n        backgroundSize: 100 * props.sheetColumns + '% ' + 100 * props.sheetRows + '%',\n        backgroundPosition: _getPosition(props)\n      });\n    } else {\n      style = _extends({}, style, {\n        backgroundImage: 'url(' + imageUrl + ')',\n        backgroundSize: 'contain'\n      });\n    }\n  } else {\n    var setHasEmoji = data['has_img_' + props.set] == undefined || data['has_img_' + props.set];\n\n    if (!setHasEmoji) {\n      if (props.fallback) {\n        return props.fallback(data, props);\n      } else {\n        return null;\n      }\n    } else {\n      style = {\n        width: props.size,\n        height: props.size,\n        display: 'inline-block',\n        backgroundImage: 'url(' + props.backgroundImageFn(props.set, props.sheetSize) + ')',\n        backgroundSize: 100 * props.sheetColumns + '% ' + 100 * props.sheetRows + '%',\n        backgroundPosition: _getPosition(props)\n      };\n    }\n  }\n\n  var Tag = {\n    name: 'span',\n    props: {}\n  };\n\n  if (props.onClick) {\n    Tag.name = 'button';\n    Tag.props = {\n      type: 'button'\n    };\n  }\n\n  if (props.html) {\n    style = _convertStyleToCSS(style);\n    return '<' + Tag.name + ' style=\\'' + style + '\\' aria-label=\\'' + label + '\\' ' + (title ? 'title=\\'' + title + '\\'' : '') + ' class=\\'' + className + '\\'>' + (children || '') + '</' + Tag.name + '>';\n  } else {\n    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n      Tag.name,\n      _extends({\n        onClick: function onClick(e) {\n          return _handleClick(e, props);\n        },\n        onMouseEnter: function onMouseEnter(e) {\n          return _handleOver(e, props);\n        },\n        onMouseLeave: function onMouseLeave(e) {\n          return _handleLeave(e, props);\n        },\n        'aria-label': label,\n        title: title,\n        className: className\n      }, Tag.props),\n      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'span',\n        { style: style },\n        children\n      )\n    );\n  }\n};\n\nNimbleEmoji.propTypes /* remove-proptypes */ = _extends({}, EmojiPropTypes, {\n  data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n});\nNimbleEmoji.defaultProps = EmojiDefaultProps;\n\nvar NotFound = function (_React$PureComponent) {\n  inherits(NotFound, _React$PureComponent);\n\n  function NotFound() {\n    _classCallCheck(this, NotFound);\n\n    return possibleConstructorReturn(this, (NotFound.__proto__ || _Object$getPrototypeOf(NotFound)).apply(this, arguments));\n  }\n\n  _createClass(NotFound, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var data = _props.data;\n      var emojiProps = _props.emojiProps;\n      var i18n = _props.i18n;\n      var notFound = _props.notFound;\n      var notFoundEmoji = _props.notFoundEmoji;\n\n\n      var component = notFound && notFound() || react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'div',\n        { className: 'emoji-mart-no-results' },\n        NimbleEmoji(_extends({\n          data: data\n        }, emojiProps, {\n          size: 38,\n          emoji: notFoundEmoji,\n          onOver: null,\n          onLeave: null,\n          onClick: null\n        })),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-no-results-label' },\n          i18n.notfound\n        )\n      );\n\n      return component;\n    }\n  }]);\n\n  return NotFound;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nNotFound.propTypes /* remove-proptypes */ = {\n  notFound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n};\n\nvar Category = function (_React$Component) {\n  inherits(Category, _React$Component);\n\n  function Category(props) {\n    _classCallCheck(this, Category);\n\n    var _this = possibleConstructorReturn(this, (Category.__proto__ || _Object$getPrototypeOf(Category)).call(this, props));\n\n    _this.data = props.data;\n    _this.setContainerRef = _this.setContainerRef.bind(_this);\n    _this.setLabelRef = _this.setLabelRef.bind(_this);\n    return _this;\n  }\n\n  _createClass(Category, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.margin = 0;\n      this.minMargin = 0;\n\n      this.memoizeSize();\n    }\n  }, {\n    key: 'shouldComponentUpdate',\n    value: function shouldComponentUpdate(nextProps, nextState) {\n      var _props = this.props;\n      var name = _props.name;\n      var perLine = _props.perLine;\n      var native = _props.native;\n      var hasStickyPosition = _props.hasStickyPosition;\n      var emojis = _props.emojis;\n      var emojiProps = _props.emojiProps;\n      var skin = emojiProps.skin;\n      var size = emojiProps.size;\n      var set = emojiProps.set;\n      var nextPerLine = nextProps.perLine;\n      var nextNative = nextProps.native;\n      var nextHasStickyPosition = nextProps.hasStickyPosition;\n      var nextEmojis = nextProps.emojis;\n      var nextEmojiProps = nextProps.emojiProps;\n      var nextSkin = nextEmojiProps.skin;\n      var nextSize = nextEmojiProps.size;\n      var nextSet = nextEmojiProps.set;\n      var shouldUpdate = false;\n\n      if (name == 'Recent' && perLine != nextPerLine) {\n        shouldUpdate = true;\n      }\n\n      if (name == 'Search') {\n        shouldUpdate = !(emojis == nextEmojis);\n      }\n\n      if (skin != nextSkin || size != nextSize || native != nextNative || set != nextSet || hasStickyPosition != nextHasStickyPosition) {\n        shouldUpdate = true;\n      }\n\n      return shouldUpdate;\n    }\n  }, {\n    key: 'memoizeSize',\n    value: function memoizeSize() {\n      if (!this.container) {\n        // probably this is a test environment, e.g. jest\n        this.top = 0;\n        this.maxMargin = 0;\n        return;\n      }\n      var parent = this.container.parentElement;\n\n      var _container$getBoundin = this.container.getBoundingClientRect();\n\n      var top = _container$getBoundin.top;\n      var height = _container$getBoundin.height;\n\n      var _parent$getBoundingCl = parent.getBoundingClientRect();\n\n      var parentTop = _parent$getBoundingCl.top;\n\n      var _label$getBoundingCli = this.label.getBoundingClientRect();\n\n      var labelHeight = _label$getBoundingCli.height;\n\n\n      this.top = top - parentTop + parent.scrollTop;\n\n      if (height == 0) {\n        this.maxMargin = 0;\n      } else {\n        this.maxMargin = height - labelHeight;\n      }\n    }\n  }, {\n    key: 'handleScroll',\n    value: function handleScroll(scrollTop) {\n      var margin = scrollTop - this.top;\n      margin = margin < this.minMargin ? this.minMargin : margin;\n      margin = margin > this.maxMargin ? this.maxMargin : margin;\n\n      if (margin == this.margin) return;\n\n      if (!this.props.hasStickyPosition) {\n        this.label.style.top = margin + 'px';\n      }\n\n      this.margin = margin;\n      return true;\n    }\n  }, {\n    key: 'getEmojis',\n    value: function getEmojis() {\n      var _this2 = this;\n\n      var _props2 = this.props;\n      var name = _props2.name;\n      var emojis = _props2.emojis;\n      var recent = _props2.recent;\n      var perLine = _props2.perLine;\n\n\n      if (name == 'Recent') {\n        var custom = this.props.custom;\n\n        var frequentlyUsed = recent || frequently$1.get(perLine);\n\n        if (frequentlyUsed.length) {\n          emojis = frequentlyUsed.map(function (id) {\n            var emoji = custom.filter(function (e) {\n              return e.id === id;\n            })[0];\n            if (emoji) {\n              return emoji;\n            }\n\n            return id;\n          }).filter(function (id) {\n            return !!getData(id, null, null, _this2.data);\n          });\n        }\n\n        if (emojis.length === 0 && frequentlyUsed.length > 0) {\n          return null;\n        }\n      }\n\n      if (emojis) {\n        emojis = emojis.slice(0);\n      }\n\n      return emojis;\n    }\n  }, {\n    key: 'updateDisplay',\n    value: function updateDisplay(display) {\n      var emojis = this.getEmojis();\n\n      if (!emojis || !this.container) {\n        return;\n      }\n\n      this.container.style.display = display;\n    }\n  }, {\n    key: 'setContainerRef',\n    value: function setContainerRef(c) {\n      this.container = c;\n    }\n  }, {\n    key: 'setLabelRef',\n    value: function setLabelRef(c) {\n      this.label = c;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this3 = this;\n\n      var _props3 = this.props;\n      var id = _props3.id;\n      var name = _props3.name;\n      var hasStickyPosition = _props3.hasStickyPosition;\n      var emojiProps = _props3.emojiProps;\n      var i18n = _props3.i18n;\n      var notFound = _props3.notFound;\n      var notFoundEmoji = _props3.notFoundEmoji;\n      var emojis = this.getEmojis();\n      var labelStyles = {};\n      var labelSpanStyles = {};\n      var containerStyles = {};\n\n      if (!emojis) {\n        containerStyles = {\n          display: 'none'\n        };\n      }\n\n      if (!hasStickyPosition) {\n        labelStyles = {\n          height: 28\n        };\n\n        labelSpanStyles = {\n          position: 'absolute'\n        };\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        {\n          ref: this.setContainerRef,\n          className: 'emoji-mart-category',\n          'aria-label': i18n.categories[id],\n          style: containerStyles\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            style: labelStyles,\n            'data-name': name,\n            className: 'emoji-mart-category-label'\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'span',\n            {\n              style: labelSpanStyles,\n              ref: this.setLabelRef,\n              'aria-hidden': true /* already labeled by the section aria-label */\n            },\n            i18n.categories[id]\n          )\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'ul',\n          { className: 'emoji-mart-category-list' },\n          emojis && emojis.map(function (emoji) {\n            return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'li',\n              { key: emoji.id || emoji },\n              NimbleEmoji(_extends({ emoji: emoji, data: _this3.data }, emojiProps))\n            );\n          })\n        ),\n        emojis && !emojis.length && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(NotFound, {\n          i18n: i18n,\n          notFound: notFound,\n          notFoundEmoji: notFoundEmoji,\n          data: this.data,\n          emojiProps: emojiProps\n        })\n      );\n    }\n  }]);\n\n  return Category;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);\n\n\nCategory.propTypes /* remove-proptypes */ = {\n  emojis: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,\n  hasStickyPosition: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  native: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool.isRequired,\n  perLine: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  recent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string),\n  notFound: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  notFoundEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired\n};\n\nCategory.defaultProps = {\n  emojis: [],\n  hasStickyPosition: true\n};\n\nvar Skins = function (_React$PureComponent) {\n  inherits(Skins, _React$PureComponent);\n\n  function Skins(props) {\n    _classCallCheck(this, Skins);\n\n    var _this = possibleConstructorReturn(this, (Skins.__proto__ || _Object$getPrototypeOf(Skins)).call(this, props));\n\n    _this.state = {\n      opened: false\n    };\n    return _this;\n  }\n\n  _createClass(Skins, [{\n    key: 'handleClick',\n    value: function handleClick(e) {\n      var skin = parseInt(e.currentTarget.getAttribute('data-skin'));\n      var onChange = this.props.onChange;\n\n\n      if (!this.state.opened) {\n        this.setState({ opened: true });\n      } else {\n        this.setState({ opened: false });\n        if (skin != this.props.skin) {\n          onChange(skin);\n        }\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return null;\n    }\n  }]);\n\n  return Skins;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nSkins.propTypes /* remove-proptypes */ = {\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired\n};\n\nSkins.defaultProps = {\n  onChange: function onChange() {}\n};\n\nvar SkinsEmoji = function (_Skins) {\n  inherits(SkinsEmoji, _Skins);\n\n  function SkinsEmoji(props) {\n    _classCallCheck(this, SkinsEmoji);\n\n    var _this = possibleConstructorReturn(this, (SkinsEmoji.__proto__ || _Object$getPrototypeOf(SkinsEmoji)).call(this, props));\n\n    _this.handleClick = _this.handleClick.bind(_this);\n    return _this;\n  }\n\n  _createClass(SkinsEmoji, [{\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var skin = _props.skin;\n      var emojiProps = _props.emojiProps;\n      var data = _props.data;\n      var skinEmoji = _props.skinEmoji;\n      var i18n = _props.i18n;\n      var opened = this.state.opened;\n\n      var skinToneNodes = [];\n\n      for (var skinTone = 1; skinTone <= 6; skinTone++) {\n        var selected = skinTone === skin;\n        skinToneNodes.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'span',\n          {\n            key: 'skin-tone-' + skinTone,\n            className: 'emoji-mart-skin-swatch custom' + (selected ? ' selected' : '')\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'span',\n            {\n              onClick: this.handleClick,\n              'data-skin': skinTone,\n              className: 'emoji-mart-skin-tone-' + skinTone\n            },\n            NimbleEmoji({\n              emoji: skinEmoji,\n              data: data,\n              skin: skinTone,\n              backgroundImageFn: emojiProps.backgroundImageFn,\n              native: emojiProps.native,\n              set: emojiProps.set,\n              sheetSize: emojiProps.sheetSize,\n              size: 23\n            })\n          )\n        ));\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'div',\n        {\n          className: 'emoji-mart-skin-swatches custom' + (opened ? ' opened' : '')\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-skin-text' + (opened ? ' opened' : '') },\n          i18n.skintext\n        ),\n        skinToneNodes\n      );\n    }\n  }]);\n\n  return SkinsEmoji;\n}(Skins);\n\n\nSkinsEmoji.propTypes /* remove-proptypes */ = {\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  skinTone: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  skinEmoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  i18n: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nSkinsEmoji.defaultProps = {\n  onChange: function onChange() {},\n  skinTone: null\n};\n\nvar SkinsDot = function (_Skins) {\n  inherits(SkinsDot, _Skins);\n\n  function SkinsDot(props) {\n    _classCallCheck(this, SkinsDot);\n\n    var _this = possibleConstructorReturn(this, (SkinsDot.__proto__ || _Object$getPrototypeOf(SkinsDot)).call(this, props));\n\n    _this.handleClick = _this.handleClick.bind(_this);\n    _this.handleKeyDown = _this.handleKeyDown.bind(_this);\n    return _this;\n  }\n\n  _createClass(SkinsDot, [{\n    key: 'handleKeyDown',\n    value: function handleKeyDown(event) {\n      // if either enter or space is pressed, then execute\n      if (event.keyCode === 13 || event.keyCode === 32) {\n        this.handleClick(event);\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var skin = _props.skin;\n      var i18n = _props.i18n;\n      var opened = this.state.opened;\n\n      var skinToneNodes = [];\n\n      for (var skinTone = 1; skinTone <= 6; skinTone++) {\n        var selected = skinTone === skin;\n        var visible = opened || selected;\n        skinToneNodes.push(react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'span',\n          _extends({\n            key: 'skin-tone-' + skinTone,\n            className: 'emoji-mart-skin-swatch' + (selected ? ' selected' : ''),\n            'aria-label': i18n.skintones[skinTone],\n            'aria-hidden': !visible\n          }, opened ? { role: 'menuitem' } : {}),\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('span', _extends({\n            onClick: this.handleClick,\n            onKeyDown: this.handleKeyDown,\n            role: 'button'\n          }, selected ? {\n            'aria-haspopup': true,\n            'aria-expanded': !!opened\n          } : {}, opened ? { 'aria-pressed': !!selected } : {}, {\n            tabIndex: visible ? '0' : '',\n            'aria-label': i18n.skintones[skinTone],\n            title: i18n.skintones[skinTone],\n            'data-skin': skinTone,\n            className: 'emoji-mart-skin emoji-mart-skin-tone-' + skinTone\n          }))\n        ));\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        {\n          className: 'emoji-mart-skin-swatches' + (opened ? ' opened' : ''),\n          'aria-label': i18n.skintext\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          opened ? { role: 'menubar' } : {},\n          skinToneNodes\n        )\n      );\n    }\n  }]);\n\n  return SkinsDot;\n}(Skins);\n\n\nSkinsDot.propTypes /* remove-proptypes */ = {\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  skin: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number.isRequired,\n  i18n: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object\n};\n\nSkinsDot.defaultProps = {\n  onChange: function onChange() {}\n};\n\nvar Preview = function (_React$PureComponent) {\n  inherits(Preview, _React$PureComponent);\n\n  function Preview(props) {\n    _classCallCheck(this, Preview);\n\n    var _this = possibleConstructorReturn(this, (Preview.__proto__ || _Object$getPrototypeOf(Preview)).call(this, props));\n\n    _this.data = props.data;\n    _this.state = { emoji: null };\n    return _this;\n  }\n\n  _createClass(Preview, [{\n    key: 'render',\n    value: function render() {\n      var emoji = this.state.emoji;\n      var _props = this.props;\n      var emojiProps = _props.emojiProps;\n      var skinsProps = _props.skinsProps;\n      var showSkinTones = _props.showSkinTones;\n      var title = _props.title;\n      var idleEmoji = _props.emoji;\n      var i18n = _props.i18n;\n      var showPreview = _props.showPreview;\n\n\n      if (emoji && showPreview) {\n        var emojiData = getData(emoji, null, null, this.data);\n        var _emojiData$emoticons = emojiData.emoticons;\n        var emoticons = _emojiData$emoticons === undefined ? [] : _emojiData$emoticons;\n        var knownEmoticons = [];\n        var listedEmoticons = [];\n\n        emoticons.forEach(function (emoticon) {\n          if (knownEmoticons.indexOf(emoticon.toLowerCase()) >= 0) {\n            return;\n          }\n\n          knownEmoticons.push(emoticon.toLowerCase());\n          listedEmoticons.push(emoticon);\n        });\n\n        return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-preview' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-emoji', 'aria-hidden': 'true' },\n            NimbleEmoji(_extends({\n              key: emoji.id,\n              emoji: emoji,\n              data: this.data\n            }, emojiProps))\n          ),\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-data', 'aria-hidden': 'true' },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-preview-name' },\n              emoji.name\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-preview-shortnames' },\n              emojiData.short_names.map(function (short_name) {\n                return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n                  'span',\n                  { key: short_name, className: 'emoji-mart-preview-shortname' },\n                  ':',\n                  short_name,\n                  ':'\n                );\n              })\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              { className: 'emoji-mart-preview-emoticons' },\n              listedEmoticons.map(function (emoticon) {\n                return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n                  'span',\n                  { key: emoticon, className: 'emoji-mart-preview-emoticon' },\n                  emoticon\n                );\n              })\n            )\n          )\n        );\n      } else {\n        return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-preview' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-emoji', 'aria-hidden': 'true' },\n            idleEmoji && idleEmoji.length && NimbleEmoji(_extends({ emoji: idleEmoji, data: this.data }, emojiProps))\n          ),\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'emoji-mart-preview-data', 'aria-hidden': 'true' },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'span',\n              { className: 'emoji-mart-title-label' },\n              title\n            )\n          ),\n          showSkinTones && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            {\n              className: 'emoji-mart-preview-skins' + (skinsProps.skinEmoji ? ' custom' : '')\n            },\n            skinsProps.skinEmoji ? react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(SkinsEmoji, {\n              skin: skinsProps.skin,\n              emojiProps: emojiProps,\n              data: this.data,\n              skinEmoji: skinsProps.skinEmoji,\n              i18n: i18n,\n              onChange: skinsProps.onChange\n            }) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(SkinsDot, {\n              skin: skinsProps.skin,\n              i18n: i18n,\n              onChange: skinsProps.onChange\n            })\n          )\n        );\n      }\n    }\n  }]);\n\n  return Preview;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nPreview.propTypes /* remove-proptypes */ = {\n  showSkinTones: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  title: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  emoji: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string.isRequired,\n  emojiProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired,\n  skinsProps: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n};\n\nPreview.defaultProps = {\n  showSkinTones: true,\n  onChange: function onChange() {}\n};\n\nvar id = 0;\n\nvar Search = function (_React$PureComponent) {\n  inherits(Search, _React$PureComponent);\n\n  function Search(props) {\n    _classCallCheck(this, Search);\n\n    var _this = possibleConstructorReturn(this, (Search.__proto__ || _Object$getPrototypeOf(Search)).call(this, props));\n\n    _this.state = {\n      icon: search$1.search,\n      isSearching: false,\n      id: ++id\n    };\n\n    _this.data = props.data;\n    _this.emojiIndex = new NimbleEmojiIndex(_this.data);\n    _this.setRef = _this.setRef.bind(_this);\n    _this.clear = _this.clear.bind(_this);\n    _this.handleKeyUp = _this.handleKeyUp.bind(_this);\n\n    // throttle keyboard input so that typing isn't delayed\n    _this.handleChange = throttleIdleTask(_this.handleChange.bind(_this));\n    return _this;\n  }\n\n  _createClass(Search, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      // in some cases (e.g. preact) the input may already be pre-populated\n      // this.input is undefined in Jest tests\n      if (this.input && this.input.value) {\n        this.search(this.input.value);\n      }\n    }\n  }, {\n    key: 'search',\n    value: function search$$1(value) {\n      if (value == '') this.setState({\n        icon: search$1.search,\n        isSearching: false\n      });else this.setState({\n        icon: search$1.delete,\n        isSearching: true\n      });\n\n      this.props.onSearch(this.emojiIndex.search(value, {\n        emojisToShowFilter: this.props.emojisToShowFilter,\n        maxResults: this.props.maxResults,\n        include: this.props.include,\n        exclude: this.props.exclude,\n        custom: this.props.custom\n      }));\n    }\n  }, {\n    key: 'clear',\n    value: function clear() {\n      if (this.input.value == '') return;\n      this.input.value = '';\n      this.input.focus();\n      this.search('');\n    }\n  }, {\n    key: 'handleChange',\n    value: function handleChange() {\n      this.search(this.input.value);\n    }\n  }, {\n    key: 'handleKeyUp',\n    value: function handleKeyUp(e) {\n      if (e.keyCode === 13) {\n        this.clear();\n      }\n    }\n  }, {\n    key: 'setRef',\n    value: function setRef(c) {\n      this.input = c;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props;\n      var i18n = _props.i18n;\n      var autoFocus = _props.autoFocus;\n      var _state = this.state;\n      var icon = _state.icon;\n      var isSearching = _state.isSearching;\n      var id = _state.id;\n\n      var inputId = 'emoji-mart-search-' + id;\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        { className: 'emoji-mart-search', 'aria-label': i18n.search },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('input', {\n          id: inputId,\n          ref: this.setRef,\n          type: 'search',\n          onChange: this.handleChange,\n          placeholder: i18n.search,\n          autoFocus: autoFocus\n        }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'label',\n          { className: 'emoji-mart-sr-only', htmlFor: inputId },\n          i18n.search\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'button',\n          {\n            className: 'emoji-mart-search-icon',\n            onClick: this.clear,\n            onKeyUp: this.handleKeyUp,\n            'aria-label': i18n.clear,\n            disabled: !isSearching\n          },\n          icon()\n        )\n      );\n    }\n  }]);\n\n  return Search;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nSearch.propTypes /* remove-proptypes */ = {\n  onSearch: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  maxResults: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  emojisToShowFilter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  autoFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool\n};\n\nSearch.defaultProps = {\n  onSearch: function onSearch() {},\n  maxResults: 75,\n  emojisToShowFilter: null,\n  autoFocus: false\n};\n\nvar I18N = {\n  search: 'Search',\n  clear: 'Clear', // Accessible label on \"clear\" button\n  notfound: 'No Emoji Found',\n  skintext: 'Choose your default skin tone',\n  categories: {\n    search: 'Search Results',\n    recent: 'Frequently Used',\n    people: 'Smileys & People',\n    nature: 'Animals & Nature',\n    foods: 'Food & Drink',\n    activity: 'Activity',\n    places: 'Travel & Places',\n    objects: 'Objects',\n    symbols: 'Symbols',\n    flags: 'Flags',\n    custom: 'Custom'\n  },\n  categorieslabel: 'Emoji categories', // Accessible title for the list of categories\n  skintones: {\n    1: 'Default Skin Tone',\n    2: 'Light Skin Tone',\n    3: 'Medium-Light Skin Tone',\n    4: 'Medium Skin Tone',\n    5: 'Medium-Dark Skin Tone',\n    6: 'Dark Skin Tone'\n  }\n};\n\nvar NimblePicker = function (_React$PureComponent) {\n  inherits(NimblePicker, _React$PureComponent);\n\n  function NimblePicker(props) {\n    _classCallCheck(this, NimblePicker);\n\n    var _this = possibleConstructorReturn(this, (NimblePicker.__proto__ || _Object$getPrototypeOf(NimblePicker)).call(this, props));\n\n    _this.RECENT_CATEGORY = { id: 'recent', name: 'Recent', emojis: null };\n    _this.CUSTOM_CATEGORY = { id: 'custom', name: 'Custom', emojis: [] };\n    _this.SEARCH_CATEGORY = {\n      id: 'search',\n      name: 'Search',\n      emojis: null,\n      anchor: false\n    };\n\n    if (props.data.compressed) {\n      uncompress(props.data);\n    }\n\n    _this.data = props.data;\n    _this.i18n = deepMerge(I18N, props.i18n);\n    _this.icons = deepMerge(icons, props.icons);\n    _this.state = {\n      skin: props.skin || store.get('skin') || props.defaultSkin,\n      firstRender: true\n    };\n\n    _this.categories = [];\n    var allCategories = [].concat(_this.data.categories);\n\n    if (props.custom.length > 0) {\n      _this.CUSTOM_CATEGORY.emojis = props.custom.map(function (emoji) {\n        return _extends({}, emoji, {\n          // `<Category />` expects emoji to have an `id`.\n          id: emoji.short_names[0],\n          custom: true\n        });\n      });\n\n      allCategories.push(_this.CUSTOM_CATEGORY);\n    }\n\n    _this.hideRecent = true;\n\n    if (props.include != undefined) {\n      allCategories.sort(function (a, b) {\n        if (props.include.indexOf(a.id) > props.include.indexOf(b.id)) {\n          return 1;\n        }\n\n        return -1;\n      });\n    }\n\n    for (var categoryIndex = 0; categoryIndex < allCategories.length; categoryIndex++) {\n      var category = allCategories[categoryIndex];\n      var isIncluded = props.include && props.include.length ? props.include.indexOf(category.id) > -1 : true;\n      var isExcluded = props.exclude && props.exclude.length ? props.exclude.indexOf(category.id) > -1 : false;\n      if (!isIncluded || isExcluded) {\n        continue;\n      }\n\n      if (props.emojisToShowFilter) {\n        var newEmojis = [];\n\n        var emojis = category.emojis;\n\n        for (var emojiIndex = 0; emojiIndex < emojis.length; emojiIndex++) {\n          var emoji = emojis[emojiIndex];\n          if (props.emojisToShowFilter(_this.data.emojis[emoji] || emoji)) {\n            newEmojis.push(emoji);\n          }\n        }\n\n        if (newEmojis.length) {\n          var newCategory = {\n            emojis: newEmojis,\n            name: category.name,\n            id: category.id\n          };\n\n          _this.categories.push(newCategory);\n        }\n      } else {\n        _this.categories.push(category);\n      }\n    }\n\n    var includeRecent = props.include && props.include.length ? props.include.indexOf(_this.RECENT_CATEGORY.id) > -1 : true;\n    var excludeRecent = props.exclude && props.exclude.length ? props.exclude.indexOf(_this.RECENT_CATEGORY.id) > -1 : false;\n    if (includeRecent && !excludeRecent) {\n      _this.hideRecent = false;\n      _this.categories.unshift(_this.RECENT_CATEGORY);\n    }\n\n    if (_this.categories[0]) {\n      _this.categories[0].first = true;\n    }\n\n    _this.categories.unshift(_this.SEARCH_CATEGORY);\n\n    _this.setAnchorsRef = _this.setAnchorsRef.bind(_this);\n    _this.handleAnchorClick = _this.handleAnchorClick.bind(_this);\n    _this.setSearchRef = _this.setSearchRef.bind(_this);\n    _this.handleSearch = _this.handleSearch.bind(_this);\n    _this.setScrollRef = _this.setScrollRef.bind(_this);\n    _this.handleScroll = _this.handleScroll.bind(_this);\n    _this.handleScrollPaint = _this.handleScrollPaint.bind(_this);\n    _this.handleEmojiOver = _this.handleEmojiOver.bind(_this);\n    _this.handleEmojiLeave = _this.handleEmojiLeave.bind(_this);\n    _this.handleEmojiClick = _this.handleEmojiClick.bind(_this);\n    _this.handleEmojiSelect = _this.handleEmojiSelect.bind(_this);\n    _this.setPreviewRef = _this.setPreviewRef.bind(_this);\n    _this.handleSkinChange = _this.handleSkinChange.bind(_this);\n    _this.handleKeyDown = _this.handleKeyDown.bind(_this);\n    return _this;\n  }\n\n  _createClass(NimblePicker, [{\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(props) {\n      if (props.skin) {\n        this.setState({ skin: props.skin });\n      } else if (props.defaultSkin && !store.get('skin')) {\n        this.setState({ skin: props.defaultSkin });\n      }\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      if (this.state.firstRender) {\n        this.testStickyPosition();\n        this.firstRenderTimeout = setTimeout(function () {\n          _this2.setState({ firstRender: false });\n        }, 60);\n      }\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      this.updateCategoriesSize();\n      this.handleScroll();\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this.SEARCH_CATEGORY.emojis = null;\n\n      clearTimeout(this.leaveTimeout);\n      clearTimeout(this.firstRenderTimeout);\n    }\n  }, {\n    key: 'testStickyPosition',\n    value: function testStickyPosition() {\n      var stickyTestElement = document.createElement('div');\n\n      var prefixes = ['', '-webkit-', '-ms-', '-moz-', '-o-'];\n\n      prefixes.forEach(function (prefix) {\n        return stickyTestElement.style.position = prefix + 'sticky';\n      });\n\n      this.hasStickyPosition = !!stickyTestElement.style.position.length;\n    }\n  }, {\n    key: 'handleEmojiOver',\n    value: function handleEmojiOver(emoji) {\n      var preview = this.preview;\n\n      if (!preview) {\n        return;\n      }\n\n      // Use Array.prototype.find() when it is more widely supported.\n      var emojiData = this.CUSTOM_CATEGORY.emojis.filter(function (customEmoji) {\n        return customEmoji.id === emoji.id;\n      })[0];\n      for (var key in emojiData) {\n        if (emojiData.hasOwnProperty(key)) {\n          emoji[key] = emojiData[key];\n        }\n      }\n\n      preview.setState({ emoji: emoji });\n      clearTimeout(this.leaveTimeout);\n    }\n  }, {\n    key: 'handleEmojiLeave',\n    value: function handleEmojiLeave(emoji) {\n      var preview = this.preview;\n\n      if (!preview) {\n        return;\n      }\n\n      this.leaveTimeout = setTimeout(function () {\n        preview.setState({ emoji: null });\n      }, 16);\n    }\n  }, {\n    key: 'handleEmojiClick',\n    value: function handleEmojiClick(emoji, e) {\n      this.props.onClick(emoji, e);\n      this.handleEmojiSelect(emoji);\n    }\n  }, {\n    key: 'handleEmojiSelect',\n    value: function handleEmojiSelect(emoji) {\n      var _this3 = this;\n\n      this.props.onSelect(emoji);\n      if (!this.hideRecent && !this.props.recent) frequently$1.add(emoji);\n\n      var component = this.categoryRefs['category-1'];\n      if (component) {\n        var maxMargin = component.maxMargin;\n        component.forceUpdate();\n\n        window.requestAnimationFrame(function () {\n          if (!_this3.scroll) return;\n          component.memoizeSize();\n          if (maxMargin == component.maxMargin) return;\n\n          _this3.updateCategoriesSize();\n          _this3.handleScrollPaint();\n\n          if (_this3.SEARCH_CATEGORY.emojis) {\n            component.updateDisplay('none');\n          }\n        });\n      }\n    }\n  }, {\n    key: 'handleScroll',\n    value: function handleScroll() {\n      if (!this.waitingForPaint) {\n        this.waitingForPaint = true;\n        window.requestAnimationFrame(this.handleScrollPaint);\n      }\n    }\n  }, {\n    key: 'handleScrollPaint',\n    value: function handleScrollPaint() {\n      this.waitingForPaint = false;\n\n      if (!this.scroll) {\n        return;\n      }\n\n      var activeCategory = null;\n\n      if (this.SEARCH_CATEGORY.emojis) {\n        activeCategory = this.SEARCH_CATEGORY;\n      } else {\n        var target = this.scroll,\n            scrollTop = target.scrollTop,\n            scrollingDown = scrollTop > (this.scrollTop || 0),\n            minTop = 0;\n\n        for (var i = 0, l = this.categories.length; i < l; i++) {\n          var ii = scrollingDown ? this.categories.length - 1 - i : i,\n              category = this.categories[ii],\n              component = this.categoryRefs['category-' + ii];\n\n          if (component) {\n            var active = component.handleScroll(scrollTop);\n\n            if (!minTop || component.top < minTop) {\n              if (component.top > 0) {\n                minTop = component.top;\n              }\n            }\n\n            if (active && !activeCategory) {\n              activeCategory = category;\n            }\n          }\n        }\n\n        if (scrollTop < minTop) {\n          activeCategory = this.categories.filter(function (category) {\n            return !(category.anchor === false);\n          })[0];\n        } else if (scrollTop + this.clientHeight >= this.scrollHeight) {\n          activeCategory = this.categories[this.categories.length - 1];\n        }\n      }\n\n      if (activeCategory) {\n        var anchors = this.anchors;\n        var _activeCategory = activeCategory;\n        var categoryName = _activeCategory.name;\n\n\n        if (anchors.state.selected != categoryName) {\n          anchors.setState({ selected: categoryName });\n        }\n      }\n\n      this.scrollTop = scrollTop;\n    }\n  }, {\n    key: 'handleSearch',\n    value: function handleSearch(emojis) {\n      this.SEARCH_CATEGORY.emojis = emojis;\n\n      for (var i = 0, l = this.categories.length; i < l; i++) {\n        var component = this.categoryRefs['category-' + i];\n\n        if (component && component.props.name != 'Search') {\n          var display = emojis ? 'none' : 'inherit';\n          component.updateDisplay(display);\n        }\n      }\n\n      this.forceUpdate();\n      if (this.scroll) {\n        this.scroll.scrollTop = 0;\n      }\n      this.handleScroll();\n    }\n  }, {\n    key: 'handleAnchorClick',\n    value: function handleAnchorClick(category, i) {\n      var component = this.categoryRefs['category-' + i];\n      var scroll = this.scroll;\n      var anchors = this.anchors;\n      var scrollToComponent = null;\n\n      scrollToComponent = function scrollToComponent() {\n        if (component) {\n          var top = component.top;\n\n\n          if (category.first) {\n            top = 0;\n          } else {\n            top += 1;\n          }\n\n          scroll.scrollTop = top;\n        }\n      };\n\n      if (this.SEARCH_CATEGORY.emojis) {\n        this.handleSearch(null);\n        this.search.clear();\n\n        window.requestAnimationFrame(scrollToComponent);\n      } else {\n        scrollToComponent();\n      }\n    }\n  }, {\n    key: 'handleSkinChange',\n    value: function handleSkinChange(skin) {\n      var newState = { skin: skin };\n      var onSkinChange = this.props.onSkinChange;\n\n\n      this.setState(newState);\n      store.update(newState);\n\n      onSkinChange(skin);\n    }\n  }, {\n    key: 'handleKeyDown',\n    value: function handleKeyDown(e) {\n      var handled = false;\n\n      switch (e.keyCode) {\n        case 13:\n          var emoji = void 0;\n\n          if (this.SEARCH_CATEGORY.emojis && this.SEARCH_CATEGORY.emojis.length && (emoji = getSanitizedData(this.SEARCH_CATEGORY.emojis[0], this.state.skin, this.props.set, this.props.data))) {\n            this.handleEmojiSelect(emoji);\n          }\n\n          handled = true;\n          break;\n      }\n\n      if (handled) {\n        e.preventDefault();\n      }\n    }\n  }, {\n    key: 'updateCategoriesSize',\n    value: function updateCategoriesSize() {\n      for (var i = 0, l = this.categories.length; i < l; i++) {\n        var component = this.categoryRefs['category-' + i];\n        if (component) component.memoizeSize();\n      }\n\n      if (this.scroll) {\n        var target = this.scroll;\n        this.scrollHeight = target.scrollHeight;\n        this.clientHeight = target.clientHeight;\n      }\n    }\n  }, {\n    key: 'getCategories',\n    value: function getCategories() {\n      return this.state.firstRender ? this.categories.slice(0, 3) : this.categories;\n    }\n  }, {\n    key: 'setAnchorsRef',\n    value: function setAnchorsRef(c) {\n      this.anchors = c;\n    }\n  }, {\n    key: 'setSearchRef',\n    value: function setSearchRef(c) {\n      this.search = c;\n    }\n  }, {\n    key: 'setPreviewRef',\n    value: function setPreviewRef(c) {\n      this.preview = c;\n    }\n  }, {\n    key: 'setScrollRef',\n    value: function setScrollRef(c) {\n      this.scroll = c;\n    }\n  }, {\n    key: 'setCategoryRef',\n    value: function setCategoryRef(name, c) {\n      if (!this.categoryRefs) {\n        this.categoryRefs = {};\n      }\n\n      this.categoryRefs[name] = c;\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this4 = this;\n\n      var _props = this.props;\n      var perLine = _props.perLine;\n      var emojiSize = _props.emojiSize;\n      var set = _props.set;\n      var sheetSize = _props.sheetSize;\n      var sheetColumns = _props.sheetColumns;\n      var sheetRows = _props.sheetRows;\n      var style = _props.style;\n      var title = _props.title;\n      var emoji = _props.emoji;\n      var color = _props.color;\n      var native = _props.native;\n      var backgroundImageFn = _props.backgroundImageFn;\n      var emojisToShowFilter = _props.emojisToShowFilter;\n      var showPreview = _props.showPreview;\n      var showSkinTones = _props.showSkinTones;\n      var emojiTooltip = _props.emojiTooltip;\n      var include = _props.include;\n      var exclude = _props.exclude;\n      var recent = _props.recent;\n      var autoFocus = _props.autoFocus;\n      var skinEmoji = _props.skinEmoji;\n      var notFound = _props.notFound;\n      var notFoundEmoji = _props.notFoundEmoji;\n      var skin = this.state.skin;\n      var width = perLine * (emojiSize + 12) + 12 + 2 + measureScrollbar();\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'section',\n        {\n          style: _extends({ width: width }, style),\n          className: 'emoji-mart',\n          'aria-label': title,\n          onKeyDown: this.handleKeyDown\n        },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-bar' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Anchors, {\n            ref: this.setAnchorsRef,\n            data: this.data,\n            i18n: this.i18n,\n            color: color,\n            categories: this.categories,\n            onAnchorClick: this.handleAnchorClick,\n            icons: this.icons\n          })\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Search, {\n          ref: this.setSearchRef,\n          onSearch: this.handleSearch,\n          data: this.data,\n          i18n: this.i18n,\n          emojisToShowFilter: emojisToShowFilter,\n          include: include,\n          exclude: exclude,\n          custom: this.CUSTOM_CATEGORY.emojis,\n          autoFocus: autoFocus\n        }),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            ref: this.setScrollRef,\n            className: 'emoji-mart-scroll',\n            onScroll: this.handleScroll\n          },\n          this.getCategories().map(function (category, i) {\n            return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Category, {\n              ref: _this4.setCategoryRef.bind(_this4, 'category-' + i),\n              key: category.name,\n              id: category.id,\n              name: category.name,\n              emojis: category.emojis,\n              perLine: perLine,\n              native: native,\n              hasStickyPosition: _this4.hasStickyPosition,\n              data: _this4.data,\n              i18n: _this4.i18n,\n              recent: category.id == _this4.RECENT_CATEGORY.id ? recent : undefined,\n              custom: category.id == _this4.RECENT_CATEGORY.id ? _this4.CUSTOM_CATEGORY.emojis : undefined,\n              emojiProps: {\n                native: native,\n                skin: skin,\n                size: emojiSize,\n                set: set,\n                sheetSize: sheetSize,\n                sheetColumns: sheetColumns,\n                sheetRows: sheetRows,\n                forceSize: native,\n                tooltip: emojiTooltip,\n                backgroundImageFn: backgroundImageFn,\n                onOver: _this4.handleEmojiOver,\n                onLeave: _this4.handleEmojiLeave,\n                onClick: _this4.handleEmojiClick\n              },\n              notFound: notFound,\n              notFoundEmoji: notFoundEmoji\n            });\n          })\n        ),\n        (showPreview || showSkinTones) && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          { className: 'emoji-mart-bar' },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Preview, {\n            ref: this.setPreviewRef,\n            data: this.data,\n            title: title,\n            emoji: emoji,\n            showSkinTones: showSkinTones,\n            showPreview: showPreview,\n            emojiProps: {\n              native: native,\n              size: 38,\n              skin: skin,\n              set: set,\n              sheetSize: sheetSize,\n              sheetColumns: sheetColumns,\n              sheetRows: sheetRows,\n              backgroundImageFn: backgroundImageFn\n            },\n            skinsProps: {\n              skin: skin,\n              onChange: this.handleSkinChange,\n              skinEmoji: skinEmoji\n            },\n            i18n: this.i18n\n          })\n        )\n      );\n    }\n  }]);\n\n  return NimblePicker;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nNimblePicker.propTypes /* remove-proptypes */ = _extends({}, PickerPropTypes, {\n  data: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object.isRequired\n});\nNimblePicker.defaultProps = _extends({}, PickerDefaultProps);\n\nvar Picker = function (_React$PureComponent) {\n  inherits(Picker, _React$PureComponent);\n\n  function Picker() {\n    _classCallCheck(this, Picker);\n\n    return possibleConstructorReturn(this, (Picker.__proto__ || _Object$getPrototypeOf(Picker)).apply(this, arguments));\n  }\n\n  _createClass(Picker, [{\n    key: 'render',\n    value: function render() {\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(NimblePicker, _extends({}, this.props, this.state));\n    }\n  }]);\n\n  return Picker;\n}(react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent);\n\n\nPicker.propTypes /* remove-proptypes */ = PickerPropTypes;\nPicker.defaultProps = _extends({}, PickerDefaultProps, { data: data });\n\nvar Emoji = function Emoji(props) {\n  for (var k in Emoji.defaultProps) {\n    if (props[k] == undefined && Emoji.defaultProps[k] != undefined) {\n      props[k] = Emoji.defaultProps[k];\n    }\n  }\n\n  return NimbleEmoji(_extends({}, props));\n};\n\nEmoji.propTypes /* remove-proptypes */ = EmojiPropTypes;\nEmoji.defaultProps = _extends({}, EmojiDefaultProps, { data: data });\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nvar isObject_1 = isObject;\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\nvar _freeGlobal = freeGlobal;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = _freeGlobal || freeSelf || Function('return this')();\n\nvar _root = root;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return _root.Date.now();\n};\n\nvar now_1 = now;\n\n/** Built-in value references. */\nvar Symbol$1 = _root.Symbol;\n\nvar _Symbol = Symbol$1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty$1 = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = _Symbol ? _Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty$1.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nvar _getRawTag = getRawTag;\n\n/** Used for built-in method references. */\nvar objectProto$1 = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString$1 = objectProto$1.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString$1.call(value);\n}\n\nvar _objectToString = objectToString;\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag$1 && symToStringTag$1 in Object(value))\n    ? _getRawTag(value)\n    : _objectToString(value);\n}\n\nvar _baseGetTag = baseGetTag;\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nvar isObjectLike_1 = isObjectLike;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike_1(value) && _baseGetTag(value) == symbolTag);\n}\n\nvar isSymbol_1 = isSymbol;\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol_1(value)) {\n    return NAN;\n  }\n  if (isObject_1(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject_1(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nvar toNumber_1 = toNumber;\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber_1(wait) || 0;\n  if (isObject_1(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber_1(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        timeWaiting = wait - timeSinceLastCall;\n\n    return maxing\n      ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n      : timeWaiting;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now_1();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now_1());\n  }\n\n  function debounced() {\n    var time = now_1(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        clearTimeout(timerId);\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\nvar debounce_1 = debounce;\n\nvar css$1 = \".react-input-emoji--container {\\n  color: #4b4b4b;\\n  text-rendering: optimizeLegibility;\\n  background-color: #fff;\\n  border: 1px solid #fff;\\n  border-radius: 21px;\\n  margin: 5px 10px;\\n  box-sizing: border-box;\\n  flex: 1 1 auto;\\n  font-size: 15px;\\n  font-family: sans-serif;\\n  font-weight: 400;\\n  line-height: 20px;\\n  min-height: 20px;\\n  min-width: 0;\\n  outline: none;\\n  width: inherit;\\n  will-change: width;\\n  vertical-align: baseline;\\n  border: 1px solid #eaeaea;\\n  margin-right: 0;\\n}\\n\\n.react-input-emoji--wrapper {\\n  display: flex;\\n  overflow: hidden;\\n  flex: 1;\\n  position: relative;\\n  padding-right: 0;\\n  vertical-align: baseline;\\n  outline: none;\\n  margin: 0;\\n  padding: 0;\\n  border: 0;\\n}\\n\\n.react-input-emoji--input {\\n  font-weight: 400;\\n  max-height: 100px;\\n  min-height: 20px;\\n  outline: none;\\n  overflow-x: hidden;\\n  overflow-y: auto;\\n  position: relative;\\n  white-space: pre-wrap;\\n  word-wrap: break-word;\\n  z-index: 1;\\n  width: 100%;\\n  user-select: text;\\n  padding: 9px 12px 11px;\\n  text-align: left;\\n}\\n\\n.react-input-emoji--input img {\\n  vertical-align: middle;\\n  width: 18px !important;\\n  height: 18px !important;\\n  display: inline !important;\\n  margin-left: 1px;\\n  margin-right: 1px;\\n}\\n\\n.react-input-emoji--overlay {\\n  position: fixed;\\n  width: 100%;\\n  height: 100%;\\n  top: 0;\\n  left: 0;\\n  z-index: 9;\\n}\\n\\n.react-input-emoji--placeholder {\\n  color: #a0a0a0;\\n  pointer-events: none;\\n  position: absolute;\\n  transition: opacity 0.08s linear;\\n  user-select: none;\\n  z-index: 2;\\n  left: 12px;\\n  top: 0;\\n  bottom: 0;\\n  display: flex;\\n  align-items: center;\\n  width: calc(100% - 22px);\\n}\\n\\n.react-input-emoji--button {\\n  position: relative;\\n  display: block;\\n  text-align: center;\\n  padding: 0 10px;\\n  overflow: hidden;\\n  transition: color 0.1s ease-out;\\n  margin: 0;\\n  box-shadow: none;\\n  background: none;\\n  border: none;\\n  outline: none;\\n  cursor: pointer;\\n  flex-shrink: 0;\\n  margin-bottom: 12px;\\n}\\n\\n.react-input-emoji--button svg {\\n  fill: #858585;\\n}\\n\\n.react-input-emoji--button__show svg {\\n  fill: #128b7e;\\n}\\n\\n.react-emoji {\\n  display: flex;\\n  align-items: flex-end;\\n  position: relative;\\n  width: 100%;\\n}\\n\\n.react-emoji-picker--container {\\n  position: absolute;\\n  top: 0;\\n  width: 100%;\\n}\\n\\n.react-emoji-picker--wrapper.react-emoji-picker--wrapper__show {\\n  height: 357px;\\n}\\n\\n.react-emoji-picker--wrapper {\\n  position: absolute;\\n  bottom: 0;\\n  right: 0;\\n  height: 0;\\n  width: 338px;\\n  overflow: hidden;\\n  z-index: 10;\\n}\\n\\n.react-emoji-picker {\\n  position: absolute;\\n  top: 357px;\\n  left: 0;\\n  transition: top 0.1s ease-in-out;\\n}\\n\\n.react-emoji-picker__show {\\n  top: 0;\\n}\\n\";\nstyleInject(css$1);\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar inherits$1 = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar possibleConstructorReturn$1 = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar slicedToArray = function () {\n  function sliceIterator(arr, i) {\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _e = undefined;\n\n    try {\n      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"]) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n\n    return _arr;\n  }\n\n  return function (arr, i) {\n    if (Array.isArray(arr)) {\n      return arr;\n    } else if (Symbol.iterator in Object(arr)) {\n      return sliceIterator(arr, i);\n    } else {\n      throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n    }\n  };\n}();\n\nvar toConsumableArray = function (arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n    return arr2;\n  } else {\n    return Array.from(arr);\n  }\n};\n\n// vendors\n\nvar InputEmoji = function (_Component) {\n  inherits$1(InputEmoji, _Component);\n\n  function InputEmoji(props) {\n    classCallCheck(this, InputEmoji);\n\n    var _this = possibleConstructorReturn$1(this, (InputEmoji.__proto__ || Object.getPrototypeOf(InputEmoji)).call(this, props));\n\n    _this.state = {\n      html: '',\n      showPicker: false,\n      allEmojiStyle: {},\n      currentSize: null\n    };\n\n    _this.setCurrentSize = function () {\n      if (!_this.textInput.current) {\n        return;\n      }\n\n      _this.setState({\n        currentSize: {\n          width: _this.textInput.current.offsetWidth,\n          height: _this.textInput.current.offsetHeight\n        }\n      });\n    };\n\n    _this.checkAndEmitResize = function () {\n      var onResize = _this.props.onResize;\n      var currentSize = _this.state.currentSize;\n\n\n      var nextSize = {\n        width: _this.textInput.current.offsetWidth,\n        height: _this.textInput.current.offsetHeight\n      };\n\n      if (!_this.state.currentSize || currentSize.width !== nextSize.width || currentSize.height !== nextSize.height) {\n        onResize(nextSize);\n        _this.setState({ currentSize: nextSize });\n      }\n    };\n\n    _this.listenKeydown = function () {\n      var _this$props = _this.props,\n          cleanOnEnter = _this$props.cleanOnEnter,\n          onChange = _this$props.onChange,\n          onEnter = _this$props.onEnter;\n\n\n      if (cleanOnEnter) {\n        _this.textInput.current.addEventListener('keydown', function (event) {\n          if (event.keyCode === 13) {\n            event.preventDefault();\n            return false;\n          }\n        });\n        _this.textInput.current.addEventListener('keyup', function (event) {\n          if (event.keyCode === 13) {\n            var cleanedText = _this.replaceAllTextEmojiToString();\n            if (typeof onEnter === 'function') {\n              onEnter(cleanedText);\n            }\n\n            if (typeof onChange === 'function') {\n              onChange(cleanedText);\n            }\n\n            _this.updateHTML('');\n          }\n        });\n      }\n    };\n\n    _this.setValue = function (value) {\n      _this.updateHTML(value);\n      _this.textInput.current.blur();\n    };\n\n    _this.updateHTML = function () {\n      var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.props.value;\n\n      _this.setState({ html: value });\n      _this.textInput.current.innerHTML = _this.replaceAllTextEmojis(value || '');\n    };\n\n    _this.emitOnChange = function () {\n      _this.props.onChange(_this.replaceAllTextEmojiToString());\n    };\n\n    _this.getAllEmojiStyle = function () {\n      var allEmojiButton = document.querySelectorAll('.emoji-mart-category-list > li > button');\n\n      var allEmojiStyle = {};\n\n      allEmojiButton.forEach(function (emojiButton) {\n        var label = emojiButton.getAttribute('aria-label');\n\n        var _label$split = label.split(','),\n            _label$split2 = slicedToArray(_label$split, 1),\n            emoji = _label$split2[0];\n\n        var emojiSpanEl = emojiButton.querySelector('span');\n\n        var style = _this.replaceAll(emojiSpanEl.style.cssText, '\"', \"'\");\n\n        allEmojiStyle[emoji] = style;\n      });\n\n      _this.setState({ allEmojiStyle: allEmojiStyle });\n    };\n\n    _this.toggleShowPicker = function () {\n      _this.setState({ showPicker: !_this.state.showPicker });\n    };\n\n    _this.emitChange = function () {\n      var _this$props2 = _this.props,\n          onChange = _this$props2.onChange,\n          onResize = _this$props2.onResize,\n          maxLength = _this$props2.maxLength;\n\n\n      if (typeof maxLength !== 'undefined' && Number.isInteger(maxLength)) {\n        var totalCharacters = [].concat(toConsumableArray(_this.replaceAllTextEmojiToString())).length;\n\n        if (totalCharacters > maxLength) {\n          _this.textInput.current.innerHTML = '';\n          _this.pasteHtmlAtCaret(_this.state.html);\n          return;\n        }\n      }\n\n      var html = _this.textInput.current.innerHTML;\n\n      _this.setState({ html: html });\n\n      if (typeof onChange === 'function') {\n        _this.onChangeDebounced(html);\n      }\n\n      if (typeof onResize === 'function') {\n        _this.checkAndEmitResize();\n      }\n    };\n\n    _this.replaceAllTextEmojiToString = function () {\n      if (!_this.textInput.current) {\n        return '';\n      }\n\n      var container = document.createElement('div');\n      container.innerHTML = _this.textInput.current.innerHTML;\n\n      var images = container.querySelectorAll('img');\n\n      images.forEach(function (image) {\n        image.outerHTML = image.dataset.emoji;\n      });\n\n      var text = container.innerText;\n\n      // remove all ↵ for safari\n      text = text.replace(/\\n/ig, '');\n\n      return text;\n    };\n\n    _this.pasteHtmlAtCaret = function (html) {\n      var sel = void 0,\n          range = void 0;\n      if (window.getSelection) {\n        // IE9 and non-IE\n        sel = window.getSelection();\n        if (sel.getRangeAt && sel.rangeCount) {\n          range = sel.getRangeAt(0);\n          range.deleteContents();\n\n          // Range.createContextualFragment() would be useful here but is\n          // non-standard and not supported in all browsers (IE9, for one)\n          var el = document.createElement('div');\n          el.innerHTML = html;\n          var frag = document.createDocumentFragment();var node;var lastNode;\n          while (node = el.firstChild) {\n            lastNode = frag.appendChild(node);\n          }\n          range.insertNode(frag);\n\n          // Preserve the selection\n          if (lastNode) {\n            range = range.cloneRange();\n            range.setStartAfter(lastNode);\n            range.collapse(true);\n            sel.removeAllRanges();\n            sel.addRange(range);\n          }\n        }\n      } else if (document.selection && document.selection.type !== 'Control') {\n        // IE < 9\n        document.selection.createRange().pasteHTML(html);\n      }\n    };\n\n    _this.replaceAll = function (str, find, replace) {\n      return str.replace(new RegExp(find, 'g'), replace);\n    };\n\n    _this.getImage = function (emoji) {\n      var shortNames = '' + emoji.short_names;\n\n      shortNames = _this.replaceAll(shortNames, ',', ', ');\n\n      var emojiSpanEl = document.querySelector('[aria-label=\"' + emoji.native + ', ' + shortNames + '\"] > span');\n\n      if (!emojiSpanEl) return '';\n\n      var style = _this.replaceAll(emojiSpanEl.style.cssText, '\"', \"'\");\n\n      return '<img style=\"' + style + '\" data-emoji=\"' + emoji.native + '\" src=\"https://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif\" />';\n    };\n\n    _this.replaceAllTextEmojis = function (text) {\n      var allEmojis = _this.getAllEmojisFromText(text);\n\n      if (allEmojis) {\n        allEmojis = [].concat(toConsumableArray(new Set(allEmojis))); // remove duplicates\n        var allEmojiStyle = _this.state.allEmojiStyle;\n\n        allEmojis.forEach(function (emoji) {\n          var style = allEmojiStyle[emoji];\n\n          if (!style) return;\n\n          text = _this.replaceAll(text, emoji, '<img style=\"' + style + '\" data-emoji=\"' + emoji + '\" src=\"https://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif\" />');\n        });\n      }\n\n      return text;\n    };\n\n    _this.handleSelectEmoji = function (emoji) {\n      var keepOpenend = _this.props.keepOpenend;\n\n\n      _this.textInput.current.focus();\n\n      _this.pasteHtmlAtCaret(_this.getImage(emoji));\n\n      _this.textInput.current.focus();\n\n      _this.emitChange();\n\n      if (!keepOpenend) {\n        _this.toggleShowPicker();\n      }\n    };\n\n    _this.getAllEmojisFromText = function (text) {\n      return text.match(/(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe23\\u20d0-\\u20f0]|\\ud83c[\\udffb-\\udfff])?)*/g);\n    };\n\n    _this.handleContentEditableInputCopyAndPaste = function () {\n      var self = _this;\n      _this.textInput.current.addEventListener('copy', function (e) {\n        var selectedText = window.getSelection();\n\n        var container = document.createElement('div');\n\n        for (var i = 0, len = selectedText.rangeCount; i < len; ++i) {\n          container.appendChild(selectedText.getRangeAt(i).cloneContents());\n        }\n\n        container = replaceEmojiToString(container);\n\n        e.clipboardData.setData('text', container.innerText);\n        e.preventDefault();\n\n        function replaceEmojiToString(container) {\n          var images = container.querySelectorAll('img');\n\n          images.forEach(function (image) {\n            image.outerHTML = image.dataset.emoji;\n          });\n\n          return container;\n        }\n      });\n\n      // Paste fix for contenteditable\n      _this.textInput.current.addEventListener('paste', function (e) {\n        e.preventDefault();\n        var content = void 0;\n        if (window.clipboardData) {\n          content = window.clipboardData.getData('Text');\n          content = self.replaceAllTextEmojis(content);\n          if (window.getSelection) {\n            var selObj = window.getSelection();\n            var selRange = selObj.getRangeAt(0);\n            selRange.deleteContents();\n            selRange.insertNode(document.createTextNode(content));\n          }\n        } else if (e.clipboardData) {\n          content = e.clipboardData.getData('text/plain');\n          content = self.replaceAllTextEmojis(content);\n          document.execCommand('insertHTML', false, content);\n        }\n      });\n    };\n\n    _this.checkIsEmpty = function () {\n      var text = _this.replaceAllTextEmojiToString();\n\n      return text === '';\n    };\n\n    _this.handleClick = function () {\n      var onClick = _this.props.onClick;\n\n\n      if (typeof onClick === 'function') {\n        onClick();\n      }\n    };\n\n    _this.listenFocus = function () {\n      _this.textInput.current.addEventListener('focus', function () {\n        var onFocus = _this.props.onFocus;\n\n\n        if (typeof onFocus === 'function') {\n          onFocus();\n        }\n      });\n    };\n\n    _this.handleKeyDown = function (event) {\n      var onKeyDown = _this.props.onKeyDown;\n\n\n      if (typeof onKeyDown === 'function') {\n        onKeyDown(event);\n      }\n    };\n\n    _this.getExcludePicker = function () {\n      var disableRecent = _this.props.disableRecent;\n\n\n      var exclude = [];\n\n      if (disableRecent) {\n        exclude.push('recent');\n      }\n\n      return exclude;\n    };\n\n    _this.textInput = react__WEBPACK_IMPORTED_MODULE_0___default.a.createRef();\n\n    if (typeof props.onChange === 'function') {\n      _this.onChangeDebounced = debounce_1(_this.emitOnChange, 100);\n    }\n    return _this;\n  }\n\n  createClass(InputEmoji, [{\n    key: 'focus',\n    value: function focus() {\n      this.textInput.current.focus();\n    }\n  }, {\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      this.handleContentEditableInputCopyAndPaste();\n\n      this.getAllEmojiStyle();\n\n      this.updateHTML();\n\n      this.listenKeydown();\n\n      this.listenFocus();\n\n      this.setCurrentSize();\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          _props$height = _props.height,\n          height = _props$height === undefined ? 40 : _props$height,\n          _props$placeholder = _props.placeholder,\n          placeholder = _props$placeholder === undefined ? 'Type a message' : _props$placeholder,\n          _props$borderRadius = _props.borderRadius,\n          borderRadius = _props$borderRadius === undefined ? 21 : _props$borderRadius,\n          _props$borderColor = _props.borderColor,\n          borderColor = _props$borderColor === undefined ? '#EAEAEA' : _props$borderColor,\n          _props$fontSize = _props.fontSize,\n          fontSize = _props$fontSize === undefined ? 15 : _props$fontSize,\n          _props$fontFamily = _props.fontFamily,\n          fontFamily = _props$fontFamily === undefined ? 'sans-serif' : _props$fontFamily,\n          inputClass = _props.inputClass,\n          _props$tabIndex = _props.tabIndex,\n          tabIndex = _props$tabIndex === undefined ? 0 : _props$tabIndex;\n      var showPicker = this.state.showPicker;\n\n\n      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n        'div',\n        { className: 'react-emoji' },\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            className: 'react-emoji-picker--container',\n            onClick: this.handleContainerClick\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'react-emoji-picker--wrapper' + (showPicker ? ' react-emoji-picker--wrapper__show' : '') },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              {\n                className: 'react-emoji-picker' + (showPicker ? ' react-emoji-picker__show' : '')\n              },\n              react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Picker, {\n                showPreview: false,\n                showSkinTones: false,\n                set: 'apple',\n                onSelect: this.handleSelectEmoji,\n                exclude: this.getExcludePicker()\n              })\n            )\n          )\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'div',\n          {\n            className: 'react-input-emoji--container',\n            style: {\n              borderRadius: borderRadius,\n              borderColor: borderColor,\n              fontSize: fontSize,\n              fontFamily: fontFamily\n            }\n          },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'div',\n            { className: 'react-input-emoji--wrapper', onClick: this.handleClick },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n              'div',\n              {\n                className: 'react-input-emoji--placeholder',\n                style: {\n                  visibility: !this.checkIsEmpty() ? 'hidden' : 'visible'\n                }\n              },\n              placeholder\n            ),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('div', {\n              ref: this.textInput,\n              tabIndex: tabIndex,\n              contentEditable: true,\n              className: 'react-input-emoji--input' + (inputClass ? ' ' + inputClass : ''),\n              onInput: this.emitChange,\n              onBlur: this.emitChange,\n              onKeyDown: this.handleKeyDown,\n              style: {\n                paddingTop: (height - 20) / 2 + 'px',\n                paddingBottom: (height - 20) / 2 + 'px',\n                minHeight: height + 'px'\n              }\n            })\n          )\n        ),\n        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n          'button',\n          {\n            className: 'react-input-emoji--button' + (showPicker ? ' react-input-emoji--button__show' : ''),\n            onClick: this.toggleShowPicker },\n          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\n            'svg',\n            { xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 24 24', width: '24', height: '24' },\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('path', { d: 'M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10' }),\n            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('path', { d: 'M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0' })\n          )\n        ),\n        showPicker && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement('div', {\n          className: 'react-input-emoji--overlay',\n          onClick: this.toggleShowPicker\n        })\n      );\n    }\n  }, {\n    key: 'value',\n    get: function get() {\n      return this.replaceAllTextEmojiToString();\n    },\n    set: function set(value) {\n      this.setValue(value);\n    }\n  }]);\n  return InputEmoji;\n}(react__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\n\nInputEmoji.propTypes = {\n  value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  onChange: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  cleanOnEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  placeholder: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  onResize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  onFocus: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  maxLength: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  keepOpenend: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n  inputClass: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n  disableRecent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n  tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  // style\n  height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  borderRadius: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  borderColor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  fontSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n  fontFamily: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (InputEmoji);\n//# sourceMappingURL=index.es.js.map\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-input-emoji/dist/index.es.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-is/cjs/react-is.development.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/react-is/cjs/react-is.development.js ***!
+  \***********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n  return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n  type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n  if (typeof object === 'object' && object !== null) {\n    var $$typeof = object.$$typeof;\n\n    switch ($$typeof) {\n      case REACT_ELEMENT_TYPE:\n        var type = object.type;\n\n        switch (type) {\n          case REACT_ASYNC_MODE_TYPE:\n          case REACT_CONCURRENT_MODE_TYPE:\n          case REACT_FRAGMENT_TYPE:\n          case REACT_PROFILER_TYPE:\n          case REACT_STRICT_MODE_TYPE:\n          case REACT_SUSPENSE_TYPE:\n            return type;\n\n          default:\n            var $$typeofType = type && type.$$typeof;\n\n            switch ($$typeofType) {\n              case REACT_CONTEXT_TYPE:\n              case REACT_FORWARD_REF_TYPE:\n              case REACT_LAZY_TYPE:\n              case REACT_MEMO_TYPE:\n              case REACT_PROVIDER_TYPE:\n                return $$typeofType;\n\n              default:\n                return $$typeof;\n            }\n\n        }\n\n      case REACT_PORTAL_TYPE:\n        return $$typeof;\n    }\n  }\n\n  return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n  {\n    if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n      hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n      console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n    }\n  }\n\n  return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n  return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n  return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n  return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n  return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n  return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n  return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n  return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n  return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n  return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n  return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n  return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-is/cjs/react-is.development.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-is/index.js":
+/*!****************************************************!*\
+  !*** ./jaas-client/node_modules/react-is/index.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ \"./jaas-client/node_modules/react-is/cjs/react-is.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-is/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js ***!
+  \***************************************************************************/
+/*! exports provided: MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter, BrowserRouter, HashRouter, Link, NavLink */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BrowserRouter\", function() { return BrowserRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"HashRouter\", function() { return HashRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Link\", function() { return Link; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NavLink\", function() { return NavLink; });\n/* harmony import */ var react_router__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-router */ \"./jaas-client/node_modules/react-router/esm/react-router.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MemoryRouter\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"MemoryRouter\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Prompt\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Prompt\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Redirect\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Redirect\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Route\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Route\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Router\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Router\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StaticRouter\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"StaticRouter\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Switch\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"Switch\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"generatePath\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"generatePath\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matchPath\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"matchPath\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useHistory\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useHistory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useLocation\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useLocation\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useParams\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useParams\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"useRouteMatch\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"useRouteMatch\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"withRouter\", function() { return react_router__WEBPACK_IMPORTED_MODULE_0__[\"withRouter\"]; });\n\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var history__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! history */ \"./jaas-client/node_modules/history/esm/history.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! tiny-invariant */ \"./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The public API for a <Router> that uses HTML5 history.\n */\n\nvar BrowserRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(BrowserRouter, _React$Component);\n\n  function BrowserRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createBrowserHistory\"])(_this.props);\n    return _this;\n  }\n\n  var _proto = BrowserRouter.prototype;\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"Router\"], {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return BrowserRouter;\n}(react__WEBPACK_IMPORTED_MODULE_2___default.a.Component);\n\nif (true) {\n  BrowserRouter.propTypes = {\n    basename: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n    forceRefresh: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    getUserConfirmation: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    keyLength: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.number\n  };\n\n  BrowserRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(!this.props.history, \"<BrowserRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { BrowserRouter as Router }`.\") : undefined;\n  };\n}\n\n/**\n * The public API for a <Router> that uses window.location.hash.\n */\n\nvar HashRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(HashRouter, _React$Component);\n\n  function HashRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createHashHistory\"])(_this.props);\n    return _this;\n  }\n\n  var _proto = HashRouter.prototype;\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"Router\"], {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return HashRouter;\n}(react__WEBPACK_IMPORTED_MODULE_2___default.a.Component);\n\nif (true) {\n  HashRouter.propTypes = {\n    basename: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n    getUserConfirmation: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    hashType: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf([\"hashbang\", \"noslash\", \"slash\"])\n  };\n\n  HashRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(!this.props.history, \"<HashRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { HashRouter as Router }`.\") : undefined;\n  };\n}\n\nvar resolveToLocation = function resolveToLocation(to, currentLocation) {\n  return typeof to === \"function\" ? to(currentLocation) : to;\n};\nvar normalizeToLocation = function normalizeToLocation(to, currentLocation) {\n  return typeof to === \"string\" ? Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(to, null, null, currentLocation) : to;\n};\n\nvar forwardRefShim = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n  forwardRef = forwardRefShim;\n}\n\nfunction isModifiedEvent(event) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nvar LinkAnchor = forwardRef(function (_ref, forwardedRef) {\n  var innerRef = _ref.innerRef,\n      navigate = _ref.navigate,\n      _onClick = _ref.onClick,\n      rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ref, [\"innerRef\", \"navigate\", \"onClick\"]);\n\n  var target = rest.target;\n\n  var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, rest, {\n    onClick: function onClick(event) {\n      try {\n        if (_onClick) _onClick(event);\n      } catch (ex) {\n        event.preventDefault();\n        throw ex;\n      }\n\n      if (!event.defaultPrevented && // onClick prevented default\n      event.button === 0 && ( // ignore everything but left clicks\n      !target || target === \"_self\") && // let browser handle \"target=_blank\" etc.\n      !isModifiedEvent(event) // ignore clicks with modifier keys\n      ) {\n          event.preventDefault();\n          navigate();\n        }\n    }\n  }); // React 15 compat\n\n\n  if (forwardRefShim !== forwardRef) {\n    props.ref = forwardedRef || innerRef;\n  } else {\n    props.ref = innerRef;\n  }\n  /* eslint-disable-next-line jsx-a11y/anchor-has-content */\n\n\n  return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"a\", props);\n});\n\nif (true) {\n  LinkAnchor.displayName = \"LinkAnchor\";\n}\n/**\n * The public API for rendering a history-aware <a>.\n */\n\n\nvar Link = forwardRef(function (_ref2, forwardedRef) {\n  var _ref2$component = _ref2.component,\n      component = _ref2$component === void 0 ? LinkAnchor : _ref2$component,\n      replace = _ref2.replace,\n      to = _ref2.to,\n      innerRef = _ref2.innerRef,\n      rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ref2, [\"component\", \"replace\", \"to\", \"innerRef\"]);\n\n  return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"__RouterContext\"].Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(false, \"You should not use <Link> outside a <Router>\") : undefined : void 0;\n    var history = context.history;\n    var location = normalizeToLocation(resolveToLocation(to, context.location), context.location);\n    var href = location ? history.createHref(location) : \"\";\n\n    var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, rest, {\n      href: href,\n      navigate: function navigate() {\n        var location = resolveToLocation(to, context.location);\n        var method = replace ? history.replace : history.push;\n        method(location);\n      }\n    }); // React 15 compat\n\n\n    if (forwardRefShim !== forwardRef) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(component, props);\n  });\n});\n\nif (true) {\n  var toType = prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]);\n  var refType = prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.shape({\n    current: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any\n  })]);\n  Link.displayName = \"Link\";\n  Link.propTypes = {\n    innerRef: refType,\n    onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    replace: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    target: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    to: toType.isRequired\n  };\n}\n\nvar forwardRefShim$1 = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef$1 = react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef;\n\nif (typeof forwardRef$1 === \"undefined\") {\n  forwardRef$1 = forwardRefShim$1;\n}\n\nfunction joinClassnames() {\n  for (var _len = arguments.length, classnames = new Array(_len), _key = 0; _key < _len; _key++) {\n    classnames[_key] = arguments[_key];\n  }\n\n  return classnames.filter(function (i) {\n    return i;\n  }).join(\" \");\n}\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\n\n\nvar NavLink = forwardRef$1(function (_ref, forwardedRef) {\n  var _ref$ariaCurrent = _ref[\"aria-current\"],\n      ariaCurrent = _ref$ariaCurrent === void 0 ? \"page\" : _ref$ariaCurrent,\n      _ref$activeClassName = _ref.activeClassName,\n      activeClassName = _ref$activeClassName === void 0 ? \"active\" : _ref$activeClassName,\n      activeStyle = _ref.activeStyle,\n      classNameProp = _ref.className,\n      exact = _ref.exact,\n      isActiveProp = _ref.isActive,\n      locationProp = _ref.location,\n      sensitive = _ref.sensitive,\n      strict = _ref.strict,\n      styleProp = _ref.style,\n      to = _ref.to,\n      innerRef = _ref.innerRef,\n      rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_7__[\"default\"])(_ref, [\"aria-current\", \"activeClassName\", \"activeStyle\", \"className\", \"exact\", \"isActive\", \"location\", \"sensitive\", \"strict\", \"style\", \"to\", \"innerRef\"]);\n\n  return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_router__WEBPACK_IMPORTED_MODULE_0__[\"__RouterContext\"].Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(false, \"You should not use <NavLink> outside a <Router>\") : undefined : void 0;\n    var currentLocation = locationProp || context.location;\n    var toLocation = normalizeToLocation(resolveToLocation(to, currentLocation), currentLocation);\n    var path = toLocation.pathname; // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202\n\n    var escapedPath = path && path.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n    var match = escapedPath ? Object(react_router__WEBPACK_IMPORTED_MODULE_0__[\"matchPath\"])(currentLocation.pathname, {\n      path: escapedPath,\n      exact: exact,\n      sensitive: sensitive,\n      strict: strict\n    }) : null;\n    var isActive = !!(isActiveProp ? isActiveProp(match, currentLocation) : match);\n    var className = isActive ? joinClassnames(classNameProp, activeClassName) : classNameProp;\n    var style = isActive ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, styleProp, {}, activeStyle) : styleProp;\n\n    var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({\n      \"aria-current\": isActive && ariaCurrent || null,\n      className: className,\n      style: style,\n      to: toLocation\n    }, rest); // React 15 compat\n\n\n    if (forwardRefShim$1 !== forwardRef$1) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Link, props);\n  });\n});\n\nif (true) {\n  NavLink.displayName = \"NavLink\";\n  var ariaCurrentType = prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf([\"page\", \"step\", \"location\", \"date\", \"time\", \"true\"]);\n  NavLink.propTypes = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_6__[\"default\"])({}, Link.propTypes, {\n    \"aria-current\": ariaCurrentType,\n    activeClassName: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    activeStyle: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n    className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string,\n    exact: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    isActive: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object,\n    sensitive: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    strict: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n    style: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object\n  });\n}\n\n\n//# sourceMappingURL=react-router-dom.js.map\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-router/esm/react-router.js":
+/*!*******************************************************************!*\
+  !*** ./jaas-client/node_modules/react-router/esm/react-router.js ***!
+  \*******************************************************************/
+/*! exports provided: MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, __HistoryContext, __RouterContext, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MemoryRouter\", function() { return MemoryRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Prompt\", function() { return Prompt; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Redirect\", function() { return Redirect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Route\", function() { return Route; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Router\", function() { return Router; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"StaticRouter\", function() { return StaticRouter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Switch\", function() { return Switch; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__HistoryContext\", function() { return historyContext; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__RouterContext\", function() { return context; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"generatePath\", function() { return generatePath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"matchPath\", function() { return matchPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useHistory\", function() { return useHistory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useLocation\", function() { return useLocation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useParams\", function() { return useParams; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"useRouteMatch\", function() { return useRouteMatch; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"withRouter\", function() { return withRouter; });\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var history__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! history */ \"./jaas-client/node_modules/history/esm/history.js\");\n/* harmony import */ var tiny_warning__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tiny-warning */ \"./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js\");\n/* harmony import */ var mini_create_react_context__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! mini-create-react-context */ \"./jaas-client/node_modules/mini-create-react-context/dist/esm/index.js\");\n/* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! tiny-invariant */ \"./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var path_to_regexp__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! path-to-regexp */ \"./jaas-client/node_modules/path-to-regexp/index.js\");\n/* harmony import */ var path_to_regexp__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(path_to_regexp__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react-is */ \"./jaas-client/node_modules/react-is/index.js\");\n/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! hoist-non-react-statics */ \"./jaas-client/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\");\n/* harmony import */ var hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TODO: Replace with React.createContext once we can assume React 16+\n\nvar createNamedContext = function createNamedContext(name) {\n  var context = Object(mini_create_react_context__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n  context.displayName = name;\n  return context;\n};\n\nvar historyContext =\n/*#__PURE__*/\ncreateNamedContext(\"Router-History\");\n\n// TODO: Replace with React.createContext once we can assume React 16+\n\nvar createNamedContext$1 = function createNamedContext(name) {\n  var context = Object(mini_create_react_context__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\n  context.displayName = name;\n  return context;\n};\n\nvar context =\n/*#__PURE__*/\ncreateNamedContext$1(\"Router\");\n\n/**\n * The public API for putting history on context.\n */\n\nvar Router =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Router, _React$Component);\n\n  Router.computeRootMatch = function computeRootMatch(pathname) {\n    return {\n      path: \"/\",\n      url: \"/\",\n      params: {},\n      isExact: pathname === \"/\"\n    };\n  };\n\n  function Router(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this;\n    _this.state = {\n      location: props.history.location\n    }; // This is a bit of a hack. We have to start listening for location\n    // changes here in the constructor in case there are any <Redirect>s\n    // on the initial render. If there are, they will replace/push when\n    // they mount and since cDM fires in children before parents, we may\n    // get a new location before the <Router> is mounted.\n\n    _this._isMounted = false;\n    _this._pendingLocation = null;\n\n    if (!props.staticContext) {\n      _this.unlisten = props.history.listen(function (location) {\n        if (_this._isMounted) {\n          _this.setState({\n            location: location\n          });\n        } else {\n          _this._pendingLocation = location;\n        }\n      });\n    }\n\n    return _this;\n  }\n\n  var _proto = Router.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this._isMounted = true;\n\n    if (this._pendingLocation) {\n      this.setState({\n        location: this._pendingLocation\n      });\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.unlisten) this.unlisten();\n  };\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Provider, {\n      value: {\n        history: this.props.history,\n        location: this.state.location,\n        match: Router.computeRootMatch(this.state.location.pathname),\n        staticContext: this.props.staticContext\n      }\n    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(historyContext.Provider, {\n      children: this.props.children || null,\n      value: this.props.history\n    }));\n  };\n\n  return Router;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  Router.propTypes = {\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n    history: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object.isRequired,\n    staticContext: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n  };\n\n  Router.prototype.componentDidUpdate = function (prevProps) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(prevProps.history === this.props.history, \"You cannot change <Router history>\") : undefined;\n  };\n}\n\n/**\n * The public API for a <Router> that stores location in memory.\n */\n\nvar MemoryRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(MemoryRouter, _React$Component);\n\n  function MemoryRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createMemoryHistory\"])(_this.props);\n    return _this;\n  }\n\n  var _proto = MemoryRouter.prototype;\n\n  _proto.render = function render() {\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Router, {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return MemoryRouter;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  MemoryRouter.propTypes = {\n    initialEntries: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.array,\n    initialIndex: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,\n    getUserConfirmation: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n    keyLength: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number,\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node\n  };\n\n  MemoryRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!this.props.history, \"<MemoryRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { MemoryRouter as Router }`.\") : undefined;\n  };\n}\n\nvar Lifecycle =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Lifecycle, _React$Component);\n\n  function Lifecycle() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Lifecycle.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    if (this.props.onMount) this.props.onMount.call(this, this);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    if (this.props.onUpdate) this.props.onUpdate.call(this, this, prevProps);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.props.onUnmount) this.props.onUnmount.call(this, this);\n  };\n\n  _proto.render = function render() {\n    return null;\n  };\n\n  return Lifecycle;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\n/**\n * The public API for prompting the user before navigating away from a screen.\n */\n\nfunction Prompt(_ref) {\n  var message = _ref.message,\n      _ref$when = _ref.when,\n      when = _ref$when === void 0 ? true : _ref$when;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Prompt> outside a <Router>\") : undefined : void 0;\n    if (!when || context.staticContext) return null;\n    var method = context.history.block;\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Lifecycle, {\n      onMount: function onMount(self) {\n        self.release = method(message);\n      },\n      onUpdate: function onUpdate(self, prevProps) {\n        if (prevProps.message !== message) {\n          self.release();\n          self.release = method(message);\n        }\n      },\n      onUnmount: function onUnmount(self) {\n        self.release();\n      },\n      message: message\n    });\n  });\n}\n\nif (true) {\n  var messageType = prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string]);\n  Prompt.propTypes = {\n    when: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    message: messageType.isRequired\n  };\n}\n\nvar cache = {};\nvar cacheLimit = 10000;\nvar cacheCount = 0;\n\nfunction compilePath(path) {\n  if (cache[path]) return cache[path];\n  var generator = path_to_regexp__WEBPACK_IMPORTED_MODULE_8___default.a.compile(path);\n\n  if (cacheCount < cacheLimit) {\n    cache[path] = generator;\n    cacheCount++;\n  }\n\n  return generator;\n}\n/**\n * Public API for generating a URL pathname from a path and parameters.\n */\n\n\nfunction generatePath(path, params) {\n  if (path === void 0) {\n    path = \"/\";\n  }\n\n  if (params === void 0) {\n    params = {};\n  }\n\n  return path === \"/\" ? path : compilePath(path)(params, {\n    pretty: true\n  });\n}\n\n/**\n * The public API for navigating programmatically with a component.\n */\n\nfunction Redirect(_ref) {\n  var computedMatch = _ref.computedMatch,\n      to = _ref.to,\n      _ref$push = _ref.push,\n      push = _ref$push === void 0 ? false : _ref$push;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n    !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Redirect> outside a <Router>\") : undefined : void 0;\n    var history = context.history,\n        staticContext = context.staticContext;\n    var method = push ? history.push : history.replace;\n    var location = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(computedMatch ? typeof to === \"string\" ? generatePath(to, computedMatch.params) : Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, to, {\n      pathname: generatePath(to.pathname, computedMatch.params)\n    }) : to); // When rendering in a static context,\n    // set the new location immediately.\n\n    if (staticContext) {\n      method(location);\n      return null;\n    }\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Lifecycle, {\n      onMount: function onMount() {\n        method(location);\n      },\n      onUpdate: function onUpdate(self, prevProps) {\n        var prevLocation = Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(prevProps.to);\n\n        if (!Object(history__WEBPACK_IMPORTED_MODULE_3__[\"locationsAreEqual\"])(prevLocation, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, location, {\n          key: prevLocation.key\n        }))) {\n          method(location);\n        }\n      },\n      to: to\n    });\n  });\n}\n\nif (true) {\n  Redirect.propTypes = {\n    push: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    from: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,\n    to: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object]).isRequired\n  };\n}\n\nvar cache$1 = {};\nvar cacheLimit$1 = 10000;\nvar cacheCount$1 = 0;\n\nfunction compilePath$1(path, options) {\n  var cacheKey = \"\" + options.end + options.strict + options.sensitive;\n  var pathCache = cache$1[cacheKey] || (cache$1[cacheKey] = {});\n  if (pathCache[path]) return pathCache[path];\n  var keys = [];\n  var regexp = path_to_regexp__WEBPACK_IMPORTED_MODULE_8___default()(path, keys, options);\n  var result = {\n    regexp: regexp,\n    keys: keys\n  };\n\n  if (cacheCount$1 < cacheLimit$1) {\n    pathCache[path] = result;\n    cacheCount$1++;\n  }\n\n  return result;\n}\n/**\n * Public API for matching a URL pathname to a path.\n */\n\n\nfunction matchPath(pathname, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  if (typeof options === \"string\" || Array.isArray(options)) {\n    options = {\n      path: options\n    };\n  }\n\n  var _options = options,\n      path = _options.path,\n      _options$exact = _options.exact,\n      exact = _options$exact === void 0 ? false : _options$exact,\n      _options$strict = _options.strict,\n      strict = _options$strict === void 0 ? false : _options$strict,\n      _options$sensitive = _options.sensitive,\n      sensitive = _options$sensitive === void 0 ? false : _options$sensitive;\n  var paths = [].concat(path);\n  return paths.reduce(function (matched, path) {\n    if (!path && path !== \"\") return null;\n    if (matched) return matched;\n\n    var _compilePath = compilePath$1(path, {\n      end: exact,\n      strict: strict,\n      sensitive: sensitive\n    }),\n        regexp = _compilePath.regexp,\n        keys = _compilePath.keys;\n\n    var match = regexp.exec(pathname);\n    if (!match) return null;\n    var url = match[0],\n        values = match.slice(1);\n    var isExact = pathname === url;\n    if (exact && !isExact) return null;\n    return {\n      path: path,\n      // the path used to match\n      url: path === \"/\" && url === \"\" ? \"/\" : url,\n      // the matched portion of the URL\n      isExact: isExact,\n      // whether or not we matched exactly\n      params: keys.reduce(function (memo, key, index) {\n        memo[key.name] = values[index];\n        return memo;\n      }, {})\n    };\n  }, null);\n}\n\nfunction isEmptyChildren(children) {\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.Children.count(children) === 0;\n}\n\nfunction evalChildrenDev(children, props, path) {\n  var value = children(props);\n   true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(value !== undefined, \"You returned `undefined` from the `children` function of \" + (\"<Route\" + (path ? \" path=\\\"\" + path + \"\\\"\" : \"\") + \">, but you \") + \"should have returned a React element or `null`\") : undefined;\n  return value || null;\n}\n/**\n * The public API for matching a single path and rendering.\n */\n\n\nvar Route =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Route, _React$Component);\n\n  function Route() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Route.prototype;\n\n  _proto.render = function render() {\n    var _this = this;\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context$1) {\n      !context$1 ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Route> outside a <Router>\") : undefined : void 0;\n      var location = _this.props.location || context$1.location;\n      var match = _this.props.computedMatch ? _this.props.computedMatch // <Switch> already computed the match for us\n      : _this.props.path ? matchPath(location.pathname, _this.props) : context$1.match;\n\n      var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, context$1, {\n        location: location,\n        match: match\n      });\n\n      var _this$props = _this.props,\n          children = _this$props.children,\n          component = _this$props.component,\n          render = _this$props.render; // Preact uses an empty array as children by\n      // default, so use null if that's the case.\n\n      if (Array.isArray(children) && children.length === 0) {\n        children = null;\n      }\n\n      return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Provider, {\n        value: props\n      }, props.match ? children ? typeof children === \"function\" ?  true ? evalChildrenDev(children, props, _this.props.path) : undefined : children : component ? react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(component, props) : render ? render(props) : null : typeof children === \"function\" ?  true ? evalChildrenDev(children, props, _this.props.path) : undefined : null);\n    });\n  };\n\n  return Route;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  Route.propTypes = {\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node]),\n    component: function component(props, propName) {\n      if (props[propName] && !Object(react_is__WEBPACK_IMPORTED_MODULE_9__[\"isValidElementType\"])(props[propName])) {\n        return new Error(\"Invalid prop 'component' supplied to 'Route': the prop is not a valid React component\");\n      }\n    },\n    exact: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object,\n    path: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string)]),\n    render: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n    sensitive: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n    strict: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool\n  };\n\n  Route.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.component), \"You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored\") : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.render), \"You should not use <Route render> and <Route children> in the same route; <Route render> will be ignored\") : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.component && this.props.render), \"You should not use <Route component> and <Route render> in the same route; <Route render> will be ignored\") : undefined;\n  };\n\n  Route.prototype.componentDidUpdate = function (prevProps) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.location && !prevProps.location), '<Route> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.') : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(!this.props.location && prevProps.location), '<Route> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.') : undefined;\n  };\n}\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === \"/\" ? path : \"/\" + path;\n}\n\nfunction addBasename(basename, location) {\n  if (!basename) return location;\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, location, {\n    pathname: addLeadingSlash(basename) + location.pathname\n  });\n}\n\nfunction stripBasename(basename, location) {\n  if (!basename) return location;\n  var base = addLeadingSlash(basename);\n  if (location.pathname.indexOf(base) !== 0) return location;\n  return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, location, {\n    pathname: location.pathname.substr(base.length)\n  });\n}\n\nfunction createURL(location) {\n  return typeof location === \"string\" ? location : Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createPath\"])(location);\n}\n\nfunction staticHandler(methodName) {\n  return function () {\n      true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You cannot %s with <StaticRouter>\", methodName) : undefined ;\n  };\n}\n\nfunction noop() {}\n/**\n * The public top-level API for a \"static\" <Router>, so-called because it\n * can't actually change the current location. Instead, it just records\n * location changes in a context object. Useful mainly in testing and\n * server-rendering scenarios.\n */\n\n\nvar StaticRouter =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(StaticRouter, _React$Component);\n\n  function StaticRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n\n    _this.handlePush = function (location) {\n      return _this.navigateTo(location, \"PUSH\");\n    };\n\n    _this.handleReplace = function (location) {\n      return _this.navigateTo(location, \"REPLACE\");\n    };\n\n    _this.handleListen = function () {\n      return noop;\n    };\n\n    _this.handleBlock = function () {\n      return noop;\n    };\n\n    return _this;\n  }\n\n  var _proto = StaticRouter.prototype;\n\n  _proto.navigateTo = function navigateTo(location, action) {\n    var _this$props = this.props,\n        _this$props$basename = _this$props.basename,\n        basename = _this$props$basename === void 0 ? \"\" : _this$props$basename,\n        _this$props$context = _this$props.context,\n        context = _this$props$context === void 0 ? {} : _this$props$context;\n    context.action = action;\n    context.location = addBasename(basename, Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(location));\n    context.url = createURL(context.location);\n  };\n\n  _proto.render = function render() {\n    var _this$props2 = this.props,\n        _this$props2$basename = _this$props2.basename,\n        basename = _this$props2$basename === void 0 ? \"\" : _this$props2$basename,\n        _this$props2$context = _this$props2.context,\n        context = _this$props2$context === void 0 ? {} : _this$props2$context,\n        _this$props2$location = _this$props2.location,\n        location = _this$props2$location === void 0 ? \"/\" : _this$props2$location,\n        rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(_this$props2, [\"basename\", \"context\", \"location\"]);\n\n    var history = {\n      createHref: function createHref(path) {\n        return addLeadingSlash(basename + createURL(path));\n      },\n      action: \"POP\",\n      location: stripBasename(basename, Object(history__WEBPACK_IMPORTED_MODULE_3__[\"createLocation\"])(location)),\n      push: this.handlePush,\n      replace: this.handleReplace,\n      go: staticHandler(\"go\"),\n      goBack: staticHandler(\"goBack\"),\n      goForward: staticHandler(\"goForward\"),\n      listen: this.handleListen,\n      block: this.handleBlock\n    };\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Router, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, rest, {\n      history: history,\n      staticContext: context\n    }));\n  };\n\n  return StaticRouter;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  StaticRouter.propTypes = {\n    basename: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string,\n    context: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object])\n  };\n\n  StaticRouter.prototype.componentDidMount = function () {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!this.props.history, \"<StaticRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { StaticRouter as Router }`.\") : undefined;\n  };\n}\n\n/**\n * The public API for rendering the first <Route> that matches.\n */\n\nvar Switch =\n/*#__PURE__*/\nfunction (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Switch, _React$Component);\n\n  function Switch() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Switch.prototype;\n\n  _proto.render = function render() {\n    var _this = this;\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n      !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <Switch> outside a <Router>\") : undefined : void 0;\n      var location = _this.props.location || context.location;\n      var element, match; // We use React.Children.forEach instead of React.Children.toArray().find()\n      // here because toArray adds keys to all child elements and we do not want\n      // to trigger an unmount/remount for two <Route>s that render the same\n      // component at different URLs.\n\n      react__WEBPACK_IMPORTED_MODULE_1___default.a.Children.forEach(_this.props.children, function (child) {\n        if (match == null && react__WEBPACK_IMPORTED_MODULE_1___default.a.isValidElement(child)) {\n          element = child;\n          var path = child.props.path || child.props.from;\n          match = path ? matchPath(location.pathname, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, child.props, {\n            path: path\n          })) : context.match;\n        }\n      });\n      return match ? react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(element, {\n        location: location,\n        computedMatch: match\n      }) : null;\n    });\n  };\n\n  return Switch;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nif (true) {\n  Switch.propTypes = {\n    children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node,\n    location: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object\n  };\n\n  Switch.prototype.componentDidUpdate = function (prevProps) {\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(this.props.location && !prevProps.location), '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.') : undefined;\n     true ? Object(tiny_warning__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(!(!this.props.location && prevProps.location), '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.') : undefined;\n  };\n}\n\n/**\n * A public higher-order component to access the imperative API\n */\n\nfunction withRouter(Component) {\n  var displayName = \"withRouter(\" + (Component.displayName || Component.name) + \")\";\n\n  var C = function C(props) {\n    var wrappedComponentRef = props.wrappedComponentRef,\n        remainingProps = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(props, [\"wrappedComponentRef\"]);\n\n    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(context.Consumer, null, function (context) {\n      !context ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You should not use <\" + displayName + \" /> outside a <Router>\") : undefined : void 0;\n      return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({}, remainingProps, context, {\n        ref: wrappedComponentRef\n      }));\n    });\n  };\n\n  C.displayName = displayName;\n  C.WrappedComponent = Component;\n\n  if (true) {\n    C.propTypes = {\n      wrappedComponentRef: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.object])\n    };\n  }\n\n  return hoist_non_react_statics__WEBPACK_IMPORTED_MODULE_11___default()(C, Component);\n}\n\nvar useContext = react__WEBPACK_IMPORTED_MODULE_1___default.a.useContext;\nfunction useHistory() {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useHistory()\") : undefined : void 0;\n  }\n\n  return useContext(historyContext);\n}\nfunction useLocation() {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useLocation()\") : undefined : void 0;\n  }\n\n  return useContext(context).location;\n}\nfunction useParams() {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useParams()\") : undefined : void 0;\n  }\n\n  var match = useContext(context).match;\n  return match ? match.params : {};\n}\nfunction useRouteMatch(path) {\n  if (true) {\n    !(typeof useContext === \"function\") ?  true ? Object(tiny_invariant__WEBPACK_IMPORTED_MODULE_6__[\"default\"])(false, \"You must use React >= 16.8 in order to use useRouteMatch()\") : undefined : void 0;\n  }\n\n  var location = useLocation();\n  var match = useContext(context).match;\n  return path ? matchPath(location.pathname, path) : match;\n}\n\nif (true) {\n  if (typeof window !== \"undefined\") {\n    var global = window;\n    var key = \"__react_router_build__\";\n    var buildNames = {\n      cjs: \"CommonJS\",\n      esm: \"ES modules\",\n      umd: \"UMD\"\n    };\n\n    if (global[key] && global[key] !== \"esm\") {\n      var initialBuildName = buildNames[global[key]];\n      var secondaryBuildName = buildNames[\"esm\"]; // TODO: Add link to article that explains in detail how to avoid\n      // loading 2 different builds.\n\n      throw new Error(\"You are loading the \" + secondaryBuildName + \" build of React Router \" + (\"on a page that is already running the \" + initialBuildName + \" \") + \"build, so things won't work right.\");\n    }\n\n    global[key] = \"esm\";\n  }\n}\n\n\n//# sourceMappingURL=react-router.js.map\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-router/esm/react-router.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-sound/lib/index.js":
+/*!***********************************************************!*\
+  !*** ./jaas-client/node_modules/react-sound/lib/index.js ***!
+  \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _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; }\n\nfunction _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; }\n\nvar pendingCalls = [];\nvar initialized = false;\n\nvar soundManager = void 0;\n// Allow server side rendering\nif (typeof window !== 'undefined') {\n  if (true) {\n    var _require = __webpack_require__(/*! soundmanager2 */ \"./jaas-client/node_modules/soundmanager2/script/soundmanager2.js\");\n\n    soundManager = _require.soundManager;\n  } else { var _require2; }\n\n  soundManager.onready(function () {\n    pendingCalls.slice().forEach(function (cb) {\n      return cb();\n    });\n  });\n}\n\nfunction _createSound(options, cb) {\n  if (soundManager.ok()) {\n    cb(soundManager.createSound(options));\n    return function () {};\n  } else {\n    if (!initialized) {\n      initialized = true;\n      soundManager.beginDelayedInit();\n    }\n\n    var call = function call() {\n      cb(soundManager.createSound(options));\n    };\n\n    pendingCalls.push(call);\n\n    return function () {\n      pendingCalls.splice(pendingCalls.indexOf(call), 1);\n    };\n  }\n}\n\nfunction noop() {}\n\nvar playStatuses = {\n  PLAYING: 'PLAYING',\n  STOPPED: 'STOPPED',\n  PAUSED: 'PAUSED'\n};\n\nvar Sound = function (_React$Component) {\n  _inherits(Sound, _React$Component);\n\n  function Sound() {\n    _classCallCheck(this, Sound);\n\n    return _possibleConstructorReturn(this, (Sound.__proto__ || Object.getPrototypeOf(Sound)).apply(this, arguments));\n  }\n\n  _createClass(Sound, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      this.createSound(function (sound) {\n        return _this2.updateSound(sound);\n      });\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this.removeSound();\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(prevProps) {\n      var _this3 = this;\n\n      if (this.props.url !== prevProps.url) {\n        this.createSound(function (sound) {\n          return _this3.updateSound(sound, prevProps);\n        });\n      } else {\n        this.updateSound(this.sound);\n      }\n    }\n  }, {\n    key: 'updateSound',\n    value: function updateSound(sound) {\n      var prevProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      if (!sound) {\n        return;\n      }\n\n      if (this.props.playStatus === playStatuses.PLAYING) {\n        if (sound.playState === 0) {\n          sound.play();\n        }\n\n        if (sound.paused) {\n          sound.resume();\n        }\n      } else if (this.props.playStatus === playStatuses.STOPPED) {\n        if (sound.playState !== 0) {\n          sound.stop();\n        }\n      } else {\n        // this.props.playStatus === playStatuses.PAUSED\n        if (!sound.paused) {\n          sound.pause();\n        }\n      }\n\n      if (this.props.playFromPosition != null) {\n        if (this.props.playFromPosition !== prevProps.playFromPosition) {\n          sound.setPosition(this.props.playFromPosition);\n        }\n      }\n\n      if (this.props.position != null) {\n        if (sound.position !== this.props.position && Math.round(sound.position) !== Math.round(this.props.position)) {\n\n          sound.setPosition(this.props.position);\n        }\n      }\n\n      if (this.props.volume !== prevProps.volume) {\n        sound.setVolume(this.props.volume);\n      }\n\n      if (this.props.playbackRate !== prevProps.playbackRate) {\n        sound.setPlaybackRate(this.props.playbackRate);\n      }\n    }\n  }, {\n    key: 'createSound',\n    value: function createSound(callback) {\n      var _this4 = this;\n\n      this.removeSound();\n\n      var instance = this;\n\n      if (!this.props.url) {\n        return;\n      }\n\n      this.stopCreatingSound = _createSound({\n        url: this.props.url,\n        autoLoad: this.props.autoLoad,\n        volume: this.props.volume,\n        position: this.props.playFromPosition || this.props.position || 0,\n        playbackRate: this.props.playbackRate,\n        whileloading: function whileloading() {\n          instance.props.onLoading(this);\n        },\n        whileplaying: function whileplaying() {\n          instance.props.onPlaying(this);\n        },\n        onerror: function onerror(errorCode, description) {\n          instance.props.onError(errorCode, description, this);\n        },\n        onload: function onload() {\n          instance.props.onLoad(this);\n        },\n        onpause: function onpause() {\n          instance.props.onPause(this);\n        },\n        onresume: function onresume() {\n          instance.props.onResume(this);\n        },\n        onstop: function onstop() {\n          instance.props.onStop(this);\n        },\n        onfinish: function onfinish() {\n          if (instance.props.loop && instance.props.playStatus === playStatuses.PLAYING) {\n            instance.sound.play();\n          } else {\n            instance.props.onFinishedPlaying();\n          }\n        },\n        onbufferchange: function onbufferchange() {\n          instance.props.onBufferChange(this.isBuffering);\n        }\n      }, function (sound) {\n        _this4.sound = sound;\n        callback(sound);\n      });\n    }\n  }, {\n    key: 'removeSound',\n    value: function removeSound() {\n      if (this.stopCreatingSound) {\n        this.stopCreatingSound();\n        delete this.stopCreatingSound;\n      }\n\n      if (this.sound) {\n        try {\n          this.sound.destruct();\n        } catch (e) {} // eslint-disable-line\n\n        delete this.sound;\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return null;\n    }\n  }]);\n\n  return Sound;\n}(_react2.default.Component);\n\nSound.status = playStatuses;\nSound.propTypes = {\n  url: _propTypes2.default.string.isRequired,\n  playStatus: _propTypes2.default.oneOf(Object.keys(playStatuses)).isRequired,\n  position: _propTypes2.default.number,\n  playFromPosition: _propTypes2.default.number,\n  volume: _propTypes2.default.number,\n  playbackRate: _propTypes2.default.number,\n  onError: _propTypes2.default.func,\n  onLoading: _propTypes2.default.func,\n  onLoad: _propTypes2.default.func,\n  onPlaying: _propTypes2.default.func,\n  onPause: _propTypes2.default.func,\n  onResume: _propTypes2.default.func,\n  onStop: _propTypes2.default.func,\n  onFinishedPlaying: _propTypes2.default.func,\n  onBufferChange: _propTypes2.default.func,\n  autoLoad: _propTypes2.default.bool,\n  loop: _propTypes2.default.bool\n};\nSound.defaultProps = {\n  volume: 100,\n  playbackRate: 1,\n  onError: noop,\n  onLoading: noop,\n  onPlaying: noop,\n  onLoad: noop,\n  onPause: noop,\n  onResume: noop,\n  onStop: noop,\n  onFinishedPlaying: noop,\n  onBufferChange: noop,\n  autoLoad: false,\n  loop: false\n};\nexports.default = Sound;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-sound/lib/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js":
+/*!******************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js ***!
+  \******************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var dom_helpers_addClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! dom-helpers/addClass */ \"./jaas-client/node_modules/dom-helpers/esm/addClass.js\");\n/* harmony import */ var dom_helpers_removeClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! dom-helpers/removeClass */ \"./jaas-client/node_modules/dom-helpers/esm/removeClass.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Transition */ \"./jaas-client/node_modules/react-transition-group/esm/Transition.js\");\n/* harmony import */ var _utils_PropTypes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/PropTypes */ \"./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js\");\n\n\n\n\n\n\n\n\n\n\nvar _addClass = function addClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return Object(dom_helpers_addClass__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(node, c);\n  });\n};\n\nvar removeClass = function removeClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return Object(dom_helpers_removeClass__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(node, c);\n  });\n};\n/**\n * A transition component inspired by the excellent\n * [ng-animate](https://docs.angularjs.org/api/ngAnimate) library, you should\n * use it if you're using CSS transitions or animations. It's built upon the\n * [`Transition`](https://reactcommunity.org/react-transition-group/transition)\n * component, so it inherits all of its props.\n *\n * `CSSTransition` applies a pair of class names during the `appear`, `enter`,\n * and `exit` states of the transition. The first class is applied and then a\n * second `*-active` class in order to activate the CSS transition. After the\n * transition, matching `*-done` class names are applied to persist the\n * transition state.\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <CSSTransition in={inProp} timeout={200} classNames=\"my-node\">\n *         <div>\n *           {\"I'll receive my-node-* classes\"}\n *         </div>\n *       </CSSTransition>\n *       <button type=\"button\" onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the `in` prop is set to `true`, the child component will first receive\n * the class `example-enter`, then the `example-enter-active` will be added in\n * the next tick. `CSSTransition` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `example-enter-active`. This is an important trick\n * because it allows us to transition between `example-enter` and\n * `example-enter-active` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ```css\n * .my-node-enter {\n *   opacity: 0;\n * }\n * .my-node-enter-active {\n *   opacity: 1;\n *   transition: opacity 200ms;\n * }\n * .my-node-exit {\n *   opacity: 1;\n * }\n * .my-node-exit-active {\n *   opacity: 0;\n *   transition: opacity 200ms;\n * }\n * ```\n *\n * `*-active` classes represent which styles you want to animate **to**, so it's\n * important to add `transition` declaration only to them, otherwise transitions\n * might not behave as intended! This might not be obvious when the transitions\n * are symmetrical, i.e. when `*-enter-active` is the same as `*-exit`, like in\n * the example above (minus `transition`), but it becomes apparent in more\n * complex transitions.\n *\n * **Note**: If you're using the\n * [`appear`](http://reactcommunity.org/react-transition-group/transition#Transition-prop-appear)\n * prop, make sure to define styles for `.appear-*` classes as well.\n */\n\n\nvar CSSTransition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(CSSTransition, _React$Component);\n\n  function CSSTransition() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.appliedClasses = {\n      appear: {},\n      enter: {},\n      exit: {}\n    };\n\n    _this.onEnter = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument[0],\n          appearing = _this$resolveArgument[1];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, appearing ? 'appear' : 'enter', 'base');\n\n      if (_this.props.onEnter) {\n        _this.props.onEnter(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntering = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument2 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument2[0],\n          appearing = _this$resolveArgument2[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.addClass(node, type, 'active');\n\n      if (_this.props.onEntering) {\n        _this.props.onEntering(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntered = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument3 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument3[0],\n          appearing = _this$resolveArgument3[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.removeClasses(node, type);\n\n      _this.addClass(node, type, 'done');\n\n      if (_this.props.onEntered) {\n        _this.props.onEntered(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onExit = function (maybeNode) {\n      var _this$resolveArgument4 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument4[0];\n\n      _this.removeClasses(node, 'appear');\n\n      _this.removeClasses(node, 'enter');\n\n      _this.addClass(node, 'exit', 'base');\n\n      if (_this.props.onExit) {\n        _this.props.onExit(maybeNode);\n      }\n    };\n\n    _this.onExiting = function (maybeNode) {\n      var _this$resolveArgument5 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument5[0];\n\n      _this.addClass(node, 'exit', 'active');\n\n      if (_this.props.onExiting) {\n        _this.props.onExiting(maybeNode);\n      }\n    };\n\n    _this.onExited = function (maybeNode) {\n      var _this$resolveArgument6 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument6[0];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, 'exit', 'done');\n\n      if (_this.props.onExited) {\n        _this.props.onExited(maybeNode);\n      }\n    };\n\n    _this.resolveArguments = function (maybeNode, maybeAppearing) {\n      return _this.props.nodeRef ? [_this.props.nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`\n      : [maybeNode, maybeAppearing];\n    };\n\n    _this.getClassNames = function (type) {\n      var classNames = _this.props.classNames;\n      var isStringClassNames = typeof classNames === 'string';\n      var prefix = isStringClassNames && classNames ? classNames + \"-\" : '';\n      var baseClassName = isStringClassNames ? \"\" + prefix + type : classNames[type];\n      var activeClassName = isStringClassNames ? baseClassName + \"-active\" : classNames[type + \"Active\"];\n      var doneClassName = isStringClassNames ? baseClassName + \"-done\" : classNames[type + \"Done\"];\n      return {\n        baseClassName: baseClassName,\n        activeClassName: activeClassName,\n        doneClassName: doneClassName\n      };\n    };\n\n    return _this;\n  }\n\n  var _proto = CSSTransition.prototype;\n\n  _proto.addClass = function addClass(node, type, phase) {\n    var className = this.getClassNames(type)[phase + \"ClassName\"];\n\n    var _this$getClassNames = this.getClassNames('enter'),\n        doneClassName = _this$getClassNames.doneClassName;\n\n    if (type === 'appear' && phase === 'done' && doneClassName) {\n      className += \" \" + doneClassName;\n    } // This is for to force a repaint,\n    // which is necessary in order to transition styles when adding a class name.\n\n\n    if (phase === 'active') {\n      /* eslint-disable no-unused-expressions */\n      node && node.scrollTop;\n    }\n\n    if (className) {\n      this.appliedClasses[type][phase] = className;\n\n      _addClass(node, className);\n    }\n  };\n\n  _proto.removeClasses = function removeClasses(node, type) {\n    var _this$appliedClasses$ = this.appliedClasses[type],\n        baseClassName = _this$appliedClasses$.base,\n        activeClassName = _this$appliedClasses$.active,\n        doneClassName = _this$appliedClasses$.done;\n    this.appliedClasses[type] = {};\n\n    if (baseClassName) {\n      removeClass(node, baseClassName);\n    }\n\n    if (activeClassName) {\n      removeClass(node, activeClassName);\n    }\n\n    if (doneClassName) {\n      removeClass(node, doneClassName);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        _ = _this$props.classNames,\n        props = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(_this$props, [\"classNames\"]);\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_Transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, props, {\n      onEnter: this.onEnter,\n      onEntered: this.onEntered,\n      onEntering: this.onEntering,\n      onExit: this.onExit,\n      onExiting: this.onExiting,\n      onExited: this.onExited\n    }));\n  };\n\n  return CSSTransition;\n}(react__WEBPACK_IMPORTED_MODULE_6___default.a.Component);\n\nCSSTransition.defaultProps = {\n  classNames: ''\n};\nCSSTransition.propTypes =  true ? Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, _Transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"].propTypes, {\n  /**\n   * The animation classNames applied to the component as it appears, enters,\n   * exits or has finished the transition. A single name can be provided, which\n   * will be suffixed for each stage, e.g. `classNames=\"fade\"` applies:\n   *\n   * - `fade-appear`, `fade-appear-active`, `fade-appear-done`\n   * - `fade-enter`, `fade-enter-active`, `fade-enter-done`\n   * - `fade-exit`, `fade-exit-active`, `fade-exit-done`\n   *\n   * A few details to note about how these classes are applied:\n   *\n   * 1. They are _joined_ with the ones that are already defined on the child\n   *    component, so if you want to add some base styles, you can use\n   *    `className` without worrying that it will be overridden.\n   *\n   * 2. If the transition component mounts with `in={false}`, no classes are\n   *    applied yet. You might be expecting `*-exit-done`, but if you think\n   *    about it, a component cannot finish exiting if it hasn't entered yet.\n   *\n   * 2. `fade-appear-done` and `fade-enter-done` will _both_ be applied. This\n   *    allows you to define different behavior for when appearing is done and\n   *    when regular entering is done, using selectors like\n   *    `.fade-enter-done:not(.fade-appear-done)`. For example, you could apply\n   *    an epic entrance animation when element first appears in the DOM using\n   *    [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n   *    simply use `fade-enter-done` for defining both cases.\n   *\n   * Each individual classNames can also be specified independently like:\n   *\n   * ```js\n   * classNames={{\n   *  appear: 'my-appear',\n   *  appearActive: 'my-active-appear',\n   *  appearDone: 'my-done-appear',\n   *  enter: 'my-enter',\n   *  enterActive: 'my-active-enter',\n   *  enterDone: 'my-done-enter',\n   *  exit: 'my-exit',\n   *  exitActive: 'my-active-exit',\n   *  exitDone: 'my-done-exit',\n   * }}\n   * ```\n   *\n   * If you want to set these classes using CSS Modules:\n   *\n   * ```js\n   * import styles from './styles.css';\n   * ```\n   *\n   * you might want to use camelCase in your CSS file, that way could simply\n   * spread them instead of listing them one by one:\n   *\n   * ```js\n   * classNames={{ ...styles }}\n   * ```\n   *\n   * @type {string | {\n   *  appear?: string,\n   *  appearActive?: string,\n   *  appearDone?: string,\n   *  enter?: string,\n   *  enterActive?: string,\n   *  enterDone?: string,\n   *  exit?: string,\n   *  exitActive?: string,\n   *  exitDone?: string,\n   * }}\n   */\n  classNames: _utils_PropTypes__WEBPACK_IMPORTED_MODULE_8__[\"classNamesShape\"],\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or 'appear' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter-active' or\n   * 'appear-active' class is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or\n   * 'appear' classes are **removed** and the `done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit-active' is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' classes\n   * are **removed** and the `exit-done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func\n}) : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (CSSTransition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js":
+/*!**********************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js ***!
+  \**********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _TransitionGroup__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./TransitionGroup */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js\");\n\n\n\n\n\n\n/**\n * The `<ReplaceTransition>` component is a specialized `Transition` component\n * that animates between two children.\n *\n * ```jsx\n * <ReplaceTransition in>\n *   <Fade><div>I appear first</div></Fade>\n *   <Fade><div>I replace the above</div></Fade>\n * </ReplaceTransition>\n * ```\n */\n\nvar ReplaceTransition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(ReplaceTransition, _React$Component);\n\n  function ReplaceTransition() {\n    var _this;\n\n    for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n      _args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;\n\n    _this.handleEnter = function () {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return _this.handleLifecycle('onEnter', 0, args);\n    };\n\n    _this.handleEntering = function () {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return _this.handleLifecycle('onEntering', 0, args);\n    };\n\n    _this.handleEntered = function () {\n      for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return _this.handleLifecycle('onEntered', 0, args);\n    };\n\n    _this.handleExit = function () {\n      for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        args[_key5] = arguments[_key5];\n      }\n\n      return _this.handleLifecycle('onExit', 1, args);\n    };\n\n    _this.handleExiting = function () {\n      for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        args[_key6] = arguments[_key6];\n      }\n\n      return _this.handleLifecycle('onExiting', 1, args);\n    };\n\n    _this.handleExited = function () {\n      for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n        args[_key7] = arguments[_key7];\n      }\n\n      return _this.handleLifecycle('onExited', 1, args);\n    };\n\n    return _this;\n  }\n\n  var _proto = ReplaceTransition.prototype;\n\n  _proto.handleLifecycle = function handleLifecycle(handler, idx, originalArgs) {\n    var _child$props;\n\n    var children = this.props.children;\n    var child = react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.toArray(children)[idx];\n    if (child.props[handler]) (_child$props = child.props)[handler].apply(_child$props, originalArgs);\n\n    if (this.props[handler]) {\n      var maybeNode = child.props.nodeRef ? undefined : react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this);\n      this.props[handler](maybeNode);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        children = _this$props.children,\n        inProp = _this$props.in,\n        props = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_this$props, [\"children\", \"in\"]);\n\n    var _React$Children$toArr = react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.toArray(children),\n        first = _React$Children$toArr[0],\n        second = _React$Children$toArr[1];\n\n    delete props.onEnter;\n    delete props.onEntering;\n    delete props.onEntered;\n    delete props.onExit;\n    delete props.onExiting;\n    delete props.onExited;\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_TransitionGroup__WEBPACK_IMPORTED_MODULE_5__[\"default\"], props, inProp ? react__WEBPACK_IMPORTED_MODULE_3___default.a.cloneElement(first, {\n      key: 'first',\n      onEnter: this.handleEnter,\n      onEntering: this.handleEntering,\n      onEntered: this.handleEntered\n    }) : react__WEBPACK_IMPORTED_MODULE_3___default.a.cloneElement(second, {\n      key: 'second',\n      onEnter: this.handleExit,\n      onEntering: this.handleExiting,\n      onEntered: this.handleExited\n    }));\n  };\n\n  return ReplaceTransition;\n}(react__WEBPACK_IMPORTED_MODULE_3___default.a.Component);\n\nReplaceTransition.propTypes =  true ? {\n  in: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool.isRequired,\n  children: function children(props, propName) {\n    if (react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.count(props[propName]) !== 2) return new Error(\"\\\"\" + propName + \"\\\" must be exactly two transition components.\");\n    return null;\n  }\n} : undefined;\n/* harmony default export */ __webpack_exports__[\"default\"] = (ReplaceTransition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js ***!
+  \*********************************************************************************/
+/*! exports provided: modes, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"modes\", function() { return modes; });\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Transition */ \"./jaas-client/node_modules/react-transition-group/esm/Transition.js\");\n/* harmony import */ var _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TransitionGroupContext */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js\");\n\n\nvar _leaveRenders, _enterRenders;\n\n\n\n\n\n\nfunction areChildrenDifferent(oldChildren, newChildren) {\n  if (oldChildren === newChildren) return false;\n\n  if (react__WEBPACK_IMPORTED_MODULE_1___default.a.isValidElement(oldChildren) && react__WEBPACK_IMPORTED_MODULE_1___default.a.isValidElement(newChildren) && oldChildren.key != null && oldChildren.key === newChildren.key) {\n    return false;\n  }\n\n  return true;\n}\n/**\n * Enum of modes for SwitchTransition component\n * @enum { string }\n */\n\n\nvar modes = {\n  out: 'out-in',\n  in: 'in-out'\n};\n\nvar callHook = function callHook(element, name, cb) {\n  return function () {\n    var _element$props;\n\n    element.props[name] && (_element$props = element.props)[name].apply(_element$props, arguments);\n    cb();\n  };\n};\n\nvar leaveRenders = (_leaveRenders = {}, _leaveRenders[modes.out] = function (_ref) {\n  var current = _ref.current,\n      changeState = _ref.changeState;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"], null);\n    })\n  });\n}, _leaveRenders[modes.in] = function (_ref2) {\n  var current = _ref2.current,\n      changeState = _ref2.changeState,\n      children = _ref2.children;\n  return [current, react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"]);\n    })\n  })];\n}, _leaveRenders);\nvar enterRenders = (_enterRenders = {}, _enterRenders[modes.out] = function (_ref3) {\n  var children = _ref3.children,\n      changeState = _ref3.changeState;\n  return react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"], react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n        in: true\n      }));\n    })\n  });\n}, _enterRenders[modes.in] = function (_ref4) {\n  var current = _ref4.current,\n      children = _ref4.children,\n      changeState = _ref4.changeState;\n  return [react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(_Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"], react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n        in: true\n      }));\n    })\n  }), react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(children, {\n    in: true\n  })];\n}, _enterRenders);\n/**\n * A transition component inspired by the [vue transition modes](https://vuejs.org/v2/guide/transitions.html#Transition-Modes).\n * You can use it when you want to control the render between state transitions.\n * Based on the selected mode and the child's key which is the `Transition` or `CSSTransition` component, the `SwitchTransition` makes a consistent transition between them.\n *\n * If the `out-in` mode is selected, the `SwitchTransition` waits until the old child leaves and then inserts a new child.\n * If the `in-out` mode is selected, the `SwitchTransition` inserts a new child first, waits for the new child to enter and then removes the old child.\n *\n * **Note**: If you want the animation to happen simultaneously\n * (that is, to have the old child removed and a new child inserted **at the same time**),\n * you should use\n * [`TransitionGroup`](https://reactcommunity.org/react-transition-group/transition-group)\n * instead.\n *\n * ```jsx\n * function App() {\n *  const [state, setState] = useState(false);\n *  return (\n *    <SwitchTransition>\n *      <CSSTransition\n *        key={state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        addEndListener={(node, done) => node.addEventListener(\"transitionend\", done, false)}\n *        classNames='fade'\n *      >\n *        <button onClick={() => setState(state => !state)}>\n *          {state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        </button>\n *      </CSSTransition>\n *    </SwitchTransition>\n *  );\n * }\n * ```\n *\n * ```css\n * .fade-enter{\n *    opacity: 0;\n * }\n * .fade-exit{\n *    opacity: 1;\n * }\n * .fade-enter-active{\n *    opacity: 1;\n * }\n * .fade-exit-active{\n *    opacity: 0;\n * }\n * .fade-enter-active,\n * .fade-exit-active{\n *    transition: opacity 500ms;\n * }\n * ```\n */\n\nvar SwitchTransition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(SwitchTransition, _React$Component);\n\n  function SwitchTransition() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.state = {\n      status: _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"],\n      current: null\n    };\n    _this.appeared = false;\n\n    _this.changeState = function (status, current) {\n      if (current === void 0) {\n        current = _this.state.current;\n      }\n\n      _this.setState({\n        status: status,\n        current: current\n      });\n    };\n\n    return _this;\n  }\n\n  var _proto = SwitchTransition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.appeared = true;\n  };\n\n  SwitchTransition.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {\n    if (props.children == null) {\n      return {\n        current: null\n      };\n    }\n\n    if (state.status === _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"] && props.mode === modes.in) {\n      return {\n        status: _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"]\n      };\n    }\n\n    if (state.current && areChildrenDifferent(state.current, props.children)) {\n      return {\n        status: _Transition__WEBPACK_IMPORTED_MODULE_3__[\"EXITING\"]\n      };\n    }\n\n    return {\n      current: react__WEBPACK_IMPORTED_MODULE_1___default.a.cloneElement(props.children, {\n        in: true\n      })\n    };\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        children = _this$props.children,\n        mode = _this$props.mode,\n        _this$state = this.state,\n        status = _this$state.status,\n        current = _this$state.current;\n    var data = {\n      children: children,\n      current: current,\n      changeState: this.changeState,\n      status: status\n    };\n    var component;\n\n    switch (status) {\n      case _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERING\"]:\n        component = enterRenders[mode](data);\n        break;\n\n      case _Transition__WEBPACK_IMPORTED_MODULE_3__[\"EXITING\"]:\n        component = leaveRenders[mode](data);\n        break;\n\n      case _Transition__WEBPACK_IMPORTED_MODULE_3__[\"ENTERED\"]:\n        component = current;\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_4__[\"default\"].Provider, {\n      value: {\n        isMounting: !this.appeared\n      }\n    }, component);\n  };\n\n  return SwitchTransition;\n}(react__WEBPACK_IMPORTED_MODULE_1___default.a.Component);\n\nSwitchTransition.propTypes =  true ? {\n  /**\n   * Transition modes.\n   * `out-in`: Current element transitions out first, then when complete, the new element transitions in.\n   * `in-out`: New element transitions in first, then when complete, the current element transitions out.\n   *\n   * @type {'out-in'|'in-out'}\n   */\n  mode: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf([modes.in, modes.out]),\n\n  /**\n   * Any `Transition` or `CSSTransition` component.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.element.isRequired])\n} : undefined;\nSwitchTransition.defaultProps = {\n  mode: modes.out\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (SwitchTransition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/Transition.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/Transition.js ***!
+  \***************************************************************************/
+/*! exports provided: UNMOUNTED, EXITED, ENTERING, ENTERED, EXITING, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UNMOUNTED\", function() { return UNMOUNTED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EXITED\", function() { return EXITED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ENTERING\", function() { return ENTERING; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ENTERED\", function() { return ENTERED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EXITING\", function() { return EXITING; });\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ \"./jaas-client/node_modules/react-transition-group/esm/config.js\");\n/* harmony import */ var _utils_PropTypes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/PropTypes */ \"./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js\");\n/* harmony import */ var _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TransitionGroupContext */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js\");\n\n\n\n\n\n\n\n\nvar UNMOUNTED = 'unmounted';\nvar EXITED = 'exited';\nvar ENTERING = 'entering';\nvar ENTERED = 'entered';\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n *   transition: `opacity ${duration}ms ease-in-out`,\n *   opacity: 0,\n * }\n *\n * const transitionStyles = {\n *   entering: { opacity: 1 },\n *   entered:  { opacity: 1 },\n *   exiting:  { opacity: 0 },\n *   exited:  { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n *   <Transition in={inProp} timeout={duration}>\n *     {state => (\n *       <div style={{\n *         ...defaultStyle,\n *         ...transitionStyles[state]\n *       }}>\n *         I'm a fade Transition!\n *       </div>\n *     )}\n *   </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n *  - `'entering'`\n *  - `'entered'`\n *  - `'exiting'`\n *  - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <Transition in={inProp} timeout={500}>\n *         {state => (\n *           // ...\n *         )}\n *       </Transition>\n *       <button onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Transition, _React$Component);\n\n  function Transition(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n    var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n    var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n    var initialStatus;\n    _this.appearStatus = null;\n\n    if (props.in) {\n      if (appear) {\n        initialStatus = EXITED;\n        _this.appearStatus = ENTERING;\n      } else {\n        initialStatus = ENTERED;\n      }\n    } else {\n      if (props.unmountOnExit || props.mountOnEnter) {\n        initialStatus = UNMOUNTED;\n      } else {\n        initialStatus = EXITED;\n      }\n    }\n\n    _this.state = {\n      status: initialStatus\n    };\n    _this.nextCallback = null;\n    return _this;\n  }\n\n  Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n    var nextIn = _ref.in;\n\n    if (nextIn && prevState.status === UNMOUNTED) {\n      return {\n        status: EXITED\n      };\n    }\n\n    return null;\n  } // getSnapshotBeforeUpdate(prevProps) {\n  //   let nextStatus = null\n  //   if (prevProps !== this.props) {\n  //     const { status } = this.state\n  //     if (this.props.in) {\n  //       if (status !== ENTERING && status !== ENTERED) {\n  //         nextStatus = ENTERING\n  //       }\n  //     } else {\n  //       if (status === ENTERING || status === ENTERED) {\n  //         nextStatus = EXITING\n  //       }\n  //     }\n  //   }\n  //   return { nextStatus }\n  // }\n  ;\n\n  var _proto = Transition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.updateStatus(true, this.appearStatus);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var nextStatus = null;\n\n    if (prevProps !== this.props) {\n      var status = this.state.status;\n\n      if (this.props.in) {\n        if (status !== ENTERING && status !== ENTERED) {\n          nextStatus = ENTERING;\n        }\n      } else {\n        if (status === ENTERING || status === ENTERED) {\n          nextStatus = EXITING;\n        }\n      }\n    }\n\n    this.updateStatus(false, nextStatus);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.cancelNextCallback();\n  };\n\n  _proto.getTimeouts = function getTimeouts() {\n    var timeout = this.props.timeout;\n    var exit, enter, appear;\n    exit = enter = appear = timeout;\n\n    if (timeout != null && typeof timeout !== 'number') {\n      exit = timeout.exit;\n      enter = timeout.enter; // TODO: remove fallback for next major\n\n      appear = timeout.appear !== undefined ? timeout.appear : enter;\n    }\n\n    return {\n      exit: exit,\n      enter: enter,\n      appear: appear\n    };\n  };\n\n  _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n    if (mounting === void 0) {\n      mounting = false;\n    }\n\n    if (nextStatus !== null) {\n      // nextStatus will always be ENTERING or EXITING.\n      this.cancelNextCallback();\n\n      if (nextStatus === ENTERING) {\n        this.performEnter(mounting);\n      } else {\n        this.performExit();\n      }\n    } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n      this.setState({\n        status: UNMOUNTED\n      });\n    }\n  };\n\n  _proto.performEnter = function performEnter(mounting) {\n    var _this2 = this;\n\n    var enter = this.props.enter;\n    var appearing = this.context ? this.context.isMounting : mounting;\n\n    var _ref2 = this.props.nodeRef ? [appearing] : [react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this), appearing],\n        maybeNode = _ref2[0],\n        maybeAppearing = _ref2[1];\n\n    var timeouts = this.getTimeouts();\n    var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n    // if we are mounting and running this it means appear _must_ be set\n\n    if (!mounting && !enter || _config__WEBPACK_IMPORTED_MODULE_5__[\"default\"].disabled) {\n      this.safeSetState({\n        status: ENTERED\n      }, function () {\n        _this2.props.onEntered(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onEnter(maybeNode, maybeAppearing);\n    this.safeSetState({\n      status: ENTERING\n    }, function () {\n      _this2.props.onEntering(maybeNode, maybeAppearing);\n\n      _this2.onTransitionEnd(enterTimeout, function () {\n        _this2.safeSetState({\n          status: ENTERED\n        }, function () {\n          _this2.props.onEntered(maybeNode, maybeAppearing);\n        });\n      });\n    });\n  };\n\n  _proto.performExit = function performExit() {\n    var _this3 = this;\n\n    var exit = this.props.exit;\n    var timeouts = this.getTimeouts();\n    var maybeNode = this.props.nodeRef ? undefined : react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this); // no exit animation skip right to EXITED\n\n    if (!exit || _config__WEBPACK_IMPORTED_MODULE_5__[\"default\"].disabled) {\n      this.safeSetState({\n        status: EXITED\n      }, function () {\n        _this3.props.onExited(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onExit(maybeNode);\n    this.safeSetState({\n      status: EXITING\n    }, function () {\n      _this3.props.onExiting(maybeNode);\n\n      _this3.onTransitionEnd(timeouts.exit, function () {\n        _this3.safeSetState({\n          status: EXITED\n        }, function () {\n          _this3.props.onExited(maybeNode);\n        });\n      });\n    });\n  };\n\n  _proto.cancelNextCallback = function cancelNextCallback() {\n    if (this.nextCallback !== null) {\n      this.nextCallback.cancel();\n      this.nextCallback = null;\n    }\n  };\n\n  _proto.safeSetState = function safeSetState(nextState, callback) {\n    // This shouldn't be necessary, but there are weird race conditions with\n    // setState callbacks and unmounting in testing, so always make sure that\n    // we can cancel any pending setState callbacks after we unmount.\n    callback = this.setNextCallback(callback);\n    this.setState(nextState, callback);\n  };\n\n  _proto.setNextCallback = function setNextCallback(callback) {\n    var _this4 = this;\n\n    var active = true;\n\n    this.nextCallback = function (event) {\n      if (active) {\n        active = false;\n        _this4.nextCallback = null;\n        callback(event);\n      }\n    };\n\n    this.nextCallback.cancel = function () {\n      active = false;\n    };\n\n    return this.nextCallback;\n  };\n\n  _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n    this.setNextCallback(handler);\n    var node = this.props.nodeRef ? this.props.nodeRef.current : react_dom__WEBPACK_IMPORTED_MODULE_4___default.a.findDOMNode(this);\n    var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n    if (!node || doesNotHaveTimeoutOrListener) {\n      setTimeout(this.nextCallback, 0);\n      return;\n    }\n\n    if (this.props.addEndListener) {\n      var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n          maybeNode = _ref3[0],\n          maybeNextCallback = _ref3[1];\n\n      this.props.addEndListener(maybeNode, maybeNextCallback);\n    }\n\n    if (timeout != null) {\n      setTimeout(this.nextCallback, timeout);\n    }\n  };\n\n  _proto.render = function render() {\n    var status = this.state.status;\n\n    if (status === UNMOUNTED) {\n      return null;\n    }\n\n    var _this$props = this.props,\n        children = _this$props.children,\n        _in = _this$props.in,\n        _mountOnEnter = _this$props.mountOnEnter,\n        _unmountOnExit = _this$props.unmountOnExit,\n        _appear = _this$props.appear,\n        _enter = _this$props.enter,\n        _exit = _this$props.exit,\n        _timeout = _this$props.timeout,\n        _addEndListener = _this$props.addEndListener,\n        _onEnter = _this$props.onEnter,\n        _onEntering = _this$props.onEntering,\n        _onEntered = _this$props.onEntered,\n        _onExit = _this$props.onExit,\n        _onExiting = _this$props.onExiting,\n        _onExited = _this$props.onExited,\n        _nodeRef = _this$props.nodeRef,\n        childProps = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n    return (\n      /*#__PURE__*/\n      // allows for nested Transitions\n      react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"].Provider, {\n        value: null\n      }, typeof children === 'function' ? children(status, childProps) : react__WEBPACK_IMPORTED_MODULE_3___default.a.cloneElement(react__WEBPACK_IMPORTED_MODULE_3___default.a.Children.only(children), childProps))\n    );\n  };\n\n  return Transition;\n}(react__WEBPACK_IMPORTED_MODULE_3___default.a.Component);\n\nTransition.contextType = _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\nTransition.propTypes =  true ? {\n  /**\n   * A React reference to DOM element that need to transition:\n   * https://stackoverflow.com/a/51127130/4671932\n   *\n   *   - When `nodeRef` prop is used, `node` is not passed to callback functions\n   *      (e.g. `onEnter`) because user already has direct access to the node.\n   *   - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n   *     `nodeRef` need to be provided to `Transition` with changed `key` prop\n   *     (see\n   *     [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n   */\n  nodeRef: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({\n    current: typeof Element === 'undefined' ? prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.any : prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.instanceOf(Element)\n  }),\n\n  /**\n   * A `function` child can be used instead of a React element. This function is\n   * called with the current transition status (`'entering'`, `'entered'`,\n   * `'exiting'`, `'exited'`), which can be used to apply context\n   * specific props to a component.\n   *\n   * ```jsx\n   * <Transition in={this.state.in} timeout={150}>\n   *   {state => (\n   *     <MyComponent className={`fade fade-${state}`} />\n   *   )}\n   * </Transition>\n   * ```\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func.isRequired, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.element.isRequired]).isRequired,\n\n  /**\n   * Show the component; triggers the enter or exit states\n   */\n  in: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * By default the child component is mounted immediately along with\n   * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n   * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n   * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n   */\n  mountOnEnter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * By default the child component stays mounted after it reaches the `'exited'` state.\n   * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n   */\n  unmountOnExit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * By default the child component does not perform the enter transition when\n   * it first mounts, regardless of the value of `in`. If you want this\n   * behavior, set both `appear` and `in` to `true`.\n   *\n   * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n   * > only adds an additional enter transition. However, in the\n   * > `<CSSTransition>` component that first enter transition does result in\n   * > additional `.appear-*` classes, that way you can choose to style it\n   * > differently.\n   */\n  appear: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Enable or disable enter transitions.\n   */\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * Enable or disable exit transitions.\n   */\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n\n  /**\n   * The duration of the transition, in milliseconds.\n   * Required unless `addEndListener` is provided.\n   *\n   * You may specify a single timeout for all transitions:\n   *\n   * ```jsx\n   * timeout={500}\n   * ```\n   *\n   * or individually:\n   *\n   * ```jsx\n   * timeout={{\n   *  appear: 500,\n   *  enter: 300,\n   *  exit: 500,\n   * }}\n   * ```\n   *\n   * - `appear` defaults to the value of `enter`\n   * - `enter` defaults to `0`\n   * - `exit` defaults to `0`\n   *\n   * @type {number | { enter?: number, exit?: number, appear?: number }}\n   */\n  timeout: function timeout(props) {\n    var pt = _utils_PropTypes__WEBPACK_IMPORTED_MODULE_6__[\"timeoutsShape\"];\n    if (!props.addEndListener) pt = pt.isRequired;\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    return pt.apply(void 0, [props].concat(args));\n  },\n\n  /**\n   * Add a custom transition end trigger. Called with the transitioning\n   * DOM node and a `done` callback. Allows for more fine grained transition end\n   * logic. Timeouts are still used as a fallback if provided.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * ```jsx\n   * addEndListener={(node, done) => {\n   *   // use the css transitionend event to mark the finish of a transition\n   *   node.addEventListener('transitionend', done, false);\n   * }}\n   * ```\n   */\n  addEndListener: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired before the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEnter: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"entered\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEntered: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired before the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExiting: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n\n  /**\n   * Callback fired after the \"exited\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExited: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func\n} : undefined; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n  in: false,\n  mountOnEnter: false,\n  unmountOnExit: false,\n  appear: false,\n  enter: true,\n  exit: true,\n  onEnter: noop,\n  onEntering: noop,\n  onEntered: noop,\n  onExit: noop,\n  onExiting: noop,\n  onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\n/* harmony default export */ __webpack_exports__[\"default\"] = (Transition);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/Transition.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js ***!
+  \********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/extends.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/assertThisInitialized */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js\");\n/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ \"./jaas-client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _TransitionGroupContext__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./TransitionGroupContext */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js\");\n/* harmony import */ var _utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/ChildMapping */ \"./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js\");\n\n\n\n\n\n\n\n\n\nvar values = Object.values || function (obj) {\n  return Object.keys(obj).map(function (k) {\n    return obj[k];\n  });\n};\n\nvar defaultProps = {\n  component: 'div',\n  childFactory: function childFactory(child) {\n    return child;\n  }\n};\n/**\n * The `<TransitionGroup>` component manages a set of transition components\n * (`<Transition>` and `<CSSTransition>`) in a list. Like with the transition\n * components, `<TransitionGroup>` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * `in` prop is toggled automatically by the `<TransitionGroup>`.\n *\n * Note that `<TransitionGroup>`  does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\nvar TransitionGroup = /*#__PURE__*/function (_React$Component) {\n  Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(TransitionGroup, _React$Component);\n\n  function TransitionGroup(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n\n    var handleExited = _this.handleExited.bind(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(_this)); // Initial children should all be entering, dependent on appear\n\n\n    _this.state = {\n      contextValue: {\n        isMounting: true\n      },\n      handleExited: handleExited,\n      firstRender: true\n    };\n    return _this;\n  }\n\n  var _proto = TransitionGroup.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.mounted = true;\n    this.setState({\n      contextValue: {\n        isMounting: false\n      }\n    });\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.mounted = false;\n  };\n\n  TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n    var prevChildMapping = _ref.children,\n        handleExited = _ref.handleExited,\n        firstRender = _ref.firstRender;\n    return {\n      children: firstRender ? Object(_utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__[\"getInitialChildMapping\"])(nextProps, handleExited) : Object(_utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__[\"getNextChildMapping\"])(nextProps, prevChildMapping, handleExited),\n      firstRender: false\n    };\n  } // node is `undefined` when user provided `nodeRef` prop\n  ;\n\n  _proto.handleExited = function handleExited(child, node) {\n    var currentChildMapping = Object(_utils_ChildMapping__WEBPACK_IMPORTED_MODULE_7__[\"getChildMapping\"])(this.props.children);\n    if (child.key in currentChildMapping) return;\n\n    if (child.props.onExited) {\n      child.props.onExited(node);\n    }\n\n    if (this.mounted) {\n      this.setState(function (state) {\n        var children = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({}, state.children);\n\n        delete children[child.key];\n        return {\n          children: children\n        };\n      });\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        Component = _this$props.component,\n        childFactory = _this$props.childFactory,\n        props = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_this$props, [\"component\", \"childFactory\"]);\n\n    var contextValue = this.state.contextValue;\n    var children = values(this.state.children).map(childFactory);\n    delete props.appear;\n    delete props.enter;\n    delete props.exit;\n\n    if (Component === null) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_6__[\"default\"].Provider, {\n        value: contextValue\n      }, children);\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_TransitionGroupContext__WEBPACK_IMPORTED_MODULE_6__[\"default\"].Provider, {\n      value: contextValue\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(Component, props, children));\n  };\n\n  return TransitionGroup;\n}(react__WEBPACK_IMPORTED_MODULE_5___default.a.Component);\n\nTransitionGroup.propTypes =  true ? {\n  /**\n   * `<TransitionGroup>` renders a `<div>` by default. You can change this\n   * behavior by providing a `component` prop.\n   * If you use React v16+ and would like to avoid a wrapping `<div>` element\n   * you can pass in `component={null}`. This is useful if the wrapping div\n   * borks your css styles.\n   */\n  component: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.any,\n\n  /**\n   * A set of `<Transition>` components, that are toggled `in` and out as they\n   * leave. the `<TransitionGroup>` will inject specific transition props, so\n   * remember to spread them through if you are wrapping the `<Transition>` as\n   * with our `<Fade>` example.\n   *\n   * While this component is meant for multiple `Transition` or `CSSTransition`\n   * children, sometimes you may want to have a single transition child with\n   * content that you want to be transitioned out and in when you change it\n   * (e.g. routes, images etc.) In that case you can change the `key` prop of\n   * the transition child as you change its content, this will cause\n   * `TransitionGroup` to transition the child out and back in.\n   */\n  children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node,\n\n  /**\n   * A convenience prop that enables or disables appear animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  appear: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * A convenience prop that enables or disables enter animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * A convenience prop that enables or disables exit animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool,\n\n  /**\n   * You may need to apply reactive updates to a child as it is exiting.\n   * This is generally done by using `cloneElement` however in the case of an exiting\n   * child the element has already been removed and not accessible to the consumer.\n   *\n   * If you do need to update a child as it leaves you can provide a `childFactory`\n   * to wrap every child, even the ones that are leaving.\n   *\n   * @type Function(child: ReactElement) -> ReactElement\n   */\n  childFactory: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func\n} : undefined;\nTransitionGroup.defaultProps = defaultProps;\n/* harmony default export */ __webpack_exports__[\"default\"] = (TransitionGroup);\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js":
+/*!***************************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js ***!
+  \***************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext(null));\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/TransitionGroupContext.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/config.js":
+/*!***********************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/config.js ***!
+  \***********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n  disabled: false\n});\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/config.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/index.js":
+/*!**********************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/index.js ***!
+  \**********************************************************************/
+/*! exports provided: CSSTransition, ReplaceTransition, SwitchTransition, TransitionGroup, Transition, config */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _CSSTransition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CSSTransition */ \"./jaas-client/node_modules/react-transition-group/esm/CSSTransition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CSSTransition\", function() { return _CSSTransition__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _ReplaceTransition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ReplaceTransition */ \"./jaas-client/node_modules/react-transition-group/esm/ReplaceTransition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ReplaceTransition\", function() { return _ReplaceTransition__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/* harmony import */ var _SwitchTransition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SwitchTransition */ \"./jaas-client/node_modules/react-transition-group/esm/SwitchTransition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SwitchTransition\", function() { return _SwitchTransition__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; });\n\n/* harmony import */ var _TransitionGroup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TransitionGroup */ \"./jaas-client/node_modules/react-transition-group/esm/TransitionGroup.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TransitionGroup\", function() { return _TransitionGroup__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; });\n\n/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Transition */ \"./jaas-client/node_modules/react-transition-group/esm/Transition.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Transition\", function() { return _Transition__WEBPACK_IMPORTED_MODULE_4__[\"default\"]; });\n\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ \"./jaas-client/node_modules/react-transition-group/esm/config.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"config\", function() { return _config__WEBPACK_IMPORTED_MODULE_5__[\"default\"]; });\n\n\n\n\n\n\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js ***!
+  \***********************************************************************************/
+/*! exports provided: getChildMapping, mergeChildMappings, getInitialChildMapping, getNextChildMapping */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getChildMapping\", function() { return getChildMapping; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeChildMappings\", function() { return mergeChildMappings; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getInitialChildMapping\", function() { return getInitialChildMapping; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getNextChildMapping\", function() { return getNextChildMapping; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * Given `this.props.children`, return an object mapping key to child.\n *\n * @param {*} children `this.props.children`\n * @return {object} Mapping of key to child\n */\n\nfunction getChildMapping(children, mapFn) {\n  var mapper = function mapper(child) {\n    return mapFn && Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(child) ? mapFn(child) : child;\n  };\n\n  var result = Object.create(null);\n  if (children) react__WEBPACK_IMPORTED_MODULE_0__[\"Children\"].map(children, function (c) {\n    return c;\n  }).forEach(function (child) {\n    // run the map function here instead so that the key is the computed one\n    result[child.key] = mapper(child);\n  });\n  return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @param {object} next next children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @return {object} a key set that contains all keys in `prev` and all keys\n * in `next` in a reasonable order.\n */\n\nfunction mergeChildMappings(prev, next) {\n  prev = prev || {};\n  next = next || {};\n\n  function getValueForKey(key) {\n    return key in next ? next[key] : prev[key];\n  } // For each key of `next`, the list of keys to insert before that key in\n  // the combined list\n\n\n  var nextKeysPending = Object.create(null);\n  var pendingKeys = [];\n\n  for (var prevKey in prev) {\n    if (prevKey in next) {\n      if (pendingKeys.length) {\n        nextKeysPending[prevKey] = pendingKeys;\n        pendingKeys = [];\n      }\n    } else {\n      pendingKeys.push(prevKey);\n    }\n  }\n\n  var i;\n  var childMapping = {};\n\n  for (var nextKey in next) {\n    if (nextKeysPending[nextKey]) {\n      for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n        var pendingNextKey = nextKeysPending[nextKey][i];\n        childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n      }\n    }\n\n    childMapping[nextKey] = getValueForKey(nextKey);\n  } // Finally, add the keys which didn't appear before any key in `next`\n\n\n  for (i = 0; i < pendingKeys.length; i++) {\n    childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n  }\n\n  return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n  return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nfunction getInitialChildMapping(props, onExited) {\n  return getChildMapping(props.children, function (child) {\n    return Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n      onExited: onExited.bind(null, child),\n      in: true,\n      appear: getProp(child, 'appear', props),\n      enter: getProp(child, 'enter', props),\n      exit: getProp(child, 'exit', props)\n    });\n  });\n}\nfunction getNextChildMapping(nextProps, prevChildMapping, onExited) {\n  var nextChildMapping = getChildMapping(nextProps.children);\n  var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n  Object.keys(children).forEach(function (key) {\n    var child = children[key];\n    if (!Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(child)) return;\n    var hasPrev = (key in prevChildMapping);\n    var hasNext = (key in nextChildMapping);\n    var prevChild = prevChildMapping[key];\n    var isLeaving = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(prevChild) && !prevChild.props.in; // item is new (entering)\n\n    if (hasNext && (!hasPrev || isLeaving)) {\n      // console.log('entering', key)\n      children[key] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n        onExited: onExited.bind(null, child),\n        in: true,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    } else if (!hasNext && hasPrev && !isLeaving) {\n      // item is old (exiting)\n      // console.log('leaving', key)\n      children[key] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n        in: false\n      });\n    } else if (hasNext && hasPrev && Object(react__WEBPACK_IMPORTED_MODULE_0__[\"isValidElement\"])(prevChild)) {\n      // item hasn't changed transition states\n      // copy over the last transition props;\n      // console.log('unchanged', key)\n      children[key] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"cloneElement\"])(child, {\n        onExited: onExited.bind(null, child),\n        in: prevChild.props.in,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    }\n  });\n  return children;\n}\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/utils/ChildMapping.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js":
+/*!********************************************************************************!*\
+  !*** ./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js ***!
+  \********************************************************************************/
+/*! exports provided: timeoutsShape, classNamesShape */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"timeoutsShape\", function() { return timeoutsShape; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classNamesShape\", function() { return classNamesShape; });\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ \"./jaas-client/node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n\nvar timeoutsShape =  true ? prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number,\n  appear: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.number\n}).isRequired]) : undefined;\nvar classNamesShape =  true ? prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  active: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string\n}), prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.shape({\n  enter: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  enterDone: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  enterActive: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exit: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exitDone: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n  exitActive: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string\n})]) : undefined;\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react-transition-group/esm/utils/PropTypes.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react/cjs/react.development.js":
+/*!*****************************************************************!*\
+  !*** ./jaas-client/node_modules/react/cjs/react.development.js ***!
+  \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/** @license React v16.13.1\n * react.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar _assign = __webpack_require__(/*! object-assign */ \"./jaas-client/node_modules/object-assign/index.js\");\nvar checkPropTypes = __webpack_require__(/*! prop-types/checkPropTypes */ \"./jaas-client/node_modules/prop-types/checkPropTypes.js\");\n\nvar ReactVersion = '16.13.1';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n  if (maybeIterable === null || typeof maybeIterable !== 'object') {\n    return null;\n  }\n\n  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n  if (typeof maybeIterator === 'function') {\n    return maybeIterator;\n  }\n\n  return null;\n}\n\n/**\n * Keeps track of the current dispatcher.\n */\nvar ReactCurrentDispatcher = {\n  /**\n   * @internal\n   * @type {ReactComponent}\n   */\n  current: null\n};\n\n/**\n * Keeps track of the current batch's configuration such as how long an update\n * should suspend for if it needs to.\n */\nvar ReactCurrentBatchConfig = {\n  suspense: null\n};\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n  /**\n   * @internal\n   * @type {ReactComponent}\n   */\n  current: null\n};\n\nvar BEFORE_SLASH_RE = /^(.*)[\\\\\\/]/;\nfunction describeComponentFrame (name, source, ownerName) {\n  var sourceInfo = '';\n\n  if (source) {\n    var path = source.fileName;\n    var fileName = path.replace(BEFORE_SLASH_RE, '');\n\n    {\n      // In DEV, include code for a common special case:\n      // prefer \"folder/index.js\" instead of just \"index.js\".\n      if (/^index\\./.test(fileName)) {\n        var match = path.match(BEFORE_SLASH_RE);\n\n        if (match) {\n          var pathBeforeSlash = match[1];\n\n          if (pathBeforeSlash) {\n            var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');\n            fileName = folderName + '/' + fileName;\n          }\n        }\n      }\n    }\n\n    sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';\n  } else if (ownerName) {\n    sourceInfo = ' (created by ' + ownerName + ')';\n  }\n\n  return '\\n    in ' + (name || 'Unknown') + sourceInfo;\n}\n\nvar Resolved = 1;\nfunction refineResolvedLazyComponent(lazyComponent) {\n  return lazyComponent._status === Resolved ? lazyComponent._result : null;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n  var functionName = innerType.displayName || innerType.name || '';\n  return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getComponentName(type) {\n  if (type == null) {\n    // Host root, text node or just invalid type.\n    return null;\n  }\n\n  {\n    if (typeof type.tag === 'number') {\n      error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n    }\n  }\n\n  if (typeof type === 'function') {\n    return type.displayName || type.name || null;\n  }\n\n  if (typeof type === 'string') {\n    return type;\n  }\n\n  switch (type) {\n    case REACT_FRAGMENT_TYPE:\n      return 'Fragment';\n\n    case REACT_PORTAL_TYPE:\n      return 'Portal';\n\n    case REACT_PROFILER_TYPE:\n      return \"Profiler\";\n\n    case REACT_STRICT_MODE_TYPE:\n      return 'StrictMode';\n\n    case REACT_SUSPENSE_TYPE:\n      return 'Suspense';\n\n    case REACT_SUSPENSE_LIST_TYPE:\n      return 'SuspenseList';\n  }\n\n  if (typeof type === 'object') {\n    switch (type.$$typeof) {\n      case REACT_CONTEXT_TYPE:\n        return 'Context.Consumer';\n\n      case REACT_PROVIDER_TYPE:\n        return 'Context.Provider';\n\n      case REACT_FORWARD_REF_TYPE:\n        return getWrappedName(type, type.render, 'ForwardRef');\n\n      case REACT_MEMO_TYPE:\n        return getComponentName(type.type);\n\n      case REACT_BLOCK_TYPE:\n        return getComponentName(type.render);\n\n      case REACT_LAZY_TYPE:\n        {\n          var thenable = type;\n          var resolvedThenable = refineResolvedLazyComponent(thenable);\n\n          if (resolvedThenable) {\n            return getComponentName(resolvedThenable);\n          }\n\n          break;\n        }\n    }\n  }\n\n  return null;\n}\n\nvar ReactDebugCurrentFrame = {};\nvar currentlyValidatingElement = null;\nfunction setCurrentlyValidatingElement(element) {\n  {\n    currentlyValidatingElement = element;\n  }\n}\n\n{\n  // Stack implementation injected by the current renderer.\n  ReactDebugCurrentFrame.getCurrentStack = null;\n\n  ReactDebugCurrentFrame.getStackAddendum = function () {\n    var stack = ''; // Add an extra top frame while an element is being validated\n\n    if (currentlyValidatingElement) {\n      var name = getComponentName(currentlyValidatingElement.type);\n      var owner = currentlyValidatingElement._owner;\n      stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type));\n    } // Delegate to the injected renderer-specific implementation\n\n\n    var impl = ReactDebugCurrentFrame.getCurrentStack;\n\n    if (impl) {\n      stack += impl() || '';\n    }\n\n    return stack;\n  };\n}\n\n/**\n * Used by act() to track whether you're inside an act() scope.\n */\nvar IsSomeRendererActing = {\n  current: false\n};\n\nvar ReactSharedInternals = {\n  ReactCurrentDispatcher: ReactCurrentDispatcher,\n  ReactCurrentBatchConfig: ReactCurrentBatchConfig,\n  ReactCurrentOwner: ReactCurrentOwner,\n  IsSomeRendererActing: IsSomeRendererActing,\n  // Used by renderers to avoid bundling object-assign twice in UMD bundles:\n  assign: _assign\n};\n\n{\n  _assign(ReactSharedInternals, {\n    // These should not be included in production.\n    ReactDebugCurrentFrame: ReactDebugCurrentFrame,\n    // Shim for React DOM 16.0.0 which still destructured (but not used) this.\n    // TODO: remove in React 17.0.\n    ReactComponentTreeHook: {}\n  });\n}\n\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n  {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    printWarning('warn', format, args);\n  }\n}\nfunction error(format) {\n  {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n\n    printWarning('error', format, args);\n  }\n}\n\nfunction printWarning(level, format, args) {\n  // When changing this logic, you might want to also\n  // update consoleWithStackDev.www.js as well.\n  {\n    var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\\n    in') === 0;\n\n    if (!hasExistingStack) {\n      var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n      var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n      if (stack !== '') {\n        format += '%s';\n        args = args.concat([stack]);\n      }\n    }\n\n    var argsWithFormat = args.map(function (item) {\n      return '' + item;\n    }); // Careful: RN currently depends on this prefix\n\n    argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n    // breaks IE9: https://github.com/facebook/react/issues/13610\n    // eslint-disable-next-line react-internal/no-production-logging\n\n    Function.prototype.apply.call(console[level], console, argsWithFormat);\n\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      var argIndex = 0;\n      var message = 'Warning: ' + format.replace(/%s/g, function () {\n        return args[argIndex++];\n      });\n      throw new Error(message);\n    } catch (x) {}\n  }\n}\n\nvar didWarnStateUpdateForUnmountedComponent = {};\n\nfunction warnNoop(publicInstance, callerName) {\n  {\n    var _constructor = publicInstance.constructor;\n    var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';\n    var warningKey = componentName + \".\" + callerName;\n\n    if (didWarnStateUpdateForUnmountedComponent[warningKey]) {\n      return;\n    }\n\n    error(\"Can't call %s on a component that is not yet mounted. \" + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);\n\n    didWarnStateUpdateForUnmountedComponent[warningKey] = true;\n  }\n}\n/**\n * This is the abstract API for an update queue.\n */\n\n\nvar ReactNoopUpdateQueue = {\n  /**\n   * Checks whether or not this composite component is mounted.\n   * @param {ReactClass} publicInstance The instance we want to test.\n   * @return {boolean} True if mounted, false otherwise.\n   * @protected\n   * @final\n   */\n  isMounted: function (publicInstance) {\n    return false;\n  },\n\n  /**\n   * Forces an update. This should only be invoked when it is known with\n   * certainty that we are **not** in a DOM transaction.\n   *\n   * You may want to call this when you know that some deeper aspect of the\n   * component's state has changed but `setState` was not called.\n   *\n   * This will not invoke `shouldComponentUpdate`, but it will invoke\n   * `componentWillUpdate` and `componentDidUpdate`.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {?function} callback Called after component is updated.\n   * @param {?string} callerName name of the calling function in the public API.\n   * @internal\n   */\n  enqueueForceUpdate: function (publicInstance, callback, callerName) {\n    warnNoop(publicInstance, 'forceUpdate');\n  },\n\n  /**\n   * Replaces all of the state. Always use this or `setState` to mutate state.\n   * You should treat `this.state` as immutable.\n   *\n   * There is no guarantee that `this.state` will be immediately updated, so\n   * accessing `this.state` after calling this method may return the old value.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} completeState Next state.\n   * @param {?function} callback Called after component is updated.\n   * @param {?string} callerName name of the calling function in the public API.\n   * @internal\n   */\n  enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {\n    warnNoop(publicInstance, 'replaceState');\n  },\n\n  /**\n   * Sets a subset of the state. This only exists because _pendingState is\n   * internal. This provides a merging strategy that is not available to deep\n   * properties which is confusing. TODO: Expose pendingState or don't use it\n   * during the merge.\n   *\n   * @param {ReactClass} publicInstance The instance that should rerender.\n   * @param {object} partialState Next partial state to be merged with state.\n   * @param {?function} callback Called after component is updated.\n   * @param {?string} Name of the calling function in the public API.\n   * @internal\n   */\n  enqueueSetState: function (publicInstance, partialState, callback, callerName) {\n    warnNoop(publicInstance, 'setState');\n  }\n};\n\nvar emptyObject = {};\n\n{\n  Object.freeze(emptyObject);\n}\n/**\n * Base class helpers for the updating state of a component.\n */\n\n\nfunction Component(props, context, updater) {\n  this.props = props;\n  this.context = context; // If a component has string refs, we will assign a different object later.\n\n  this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the\n  // renderer.\n\n  this.updater = updater || ReactNoopUpdateQueue;\n}\n\nComponent.prototype.isReactComponent = {};\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together.  You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n *        produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\n\nComponent.prototype.setState = function (partialState, callback) {\n  if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) {\n    {\n      throw Error( \"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\" );\n    }\n  }\n\n  this.updater.enqueueSetState(this, partialState, callback, 'setState');\n};\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\n\n\nComponent.prototype.forceUpdate = function (callback) {\n  this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');\n};\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\n\n\n{\n  var deprecatedAPIs = {\n    isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n    replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']\n  };\n\n  var defineDeprecationWarning = function (methodName, info) {\n    Object.defineProperty(Component.prototype, methodName, {\n      get: function () {\n        warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);\n\n        return undefined;\n      }\n    });\n  };\n\n  for (var fnName in deprecatedAPIs) {\n    if (deprecatedAPIs.hasOwnProperty(fnName)) {\n      defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n    }\n  }\n}\n\nfunction ComponentDummy() {}\n\nComponentDummy.prototype = Component.prototype;\n/**\n * Convenience component with default shallow equality check for sCU.\n */\n\nfunction PureComponent(props, context, updater) {\n  this.props = props;\n  this.context = context; // If a component has string refs, we will assign a different object later.\n\n  this.refs = emptyObject;\n  this.updater = updater || ReactNoopUpdateQueue;\n}\n\nvar pureComponentPrototype = PureComponent.prototype = new ComponentDummy();\npureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.\n\n_assign(pureComponentPrototype, Component.prototype);\n\npureComponentPrototype.isPureReactComponent = true;\n\n// an immutable object with a single mutable value\nfunction createRef() {\n  var refObject = {\n    current: null\n  };\n\n  {\n    Object.seal(refObject);\n  }\n\n  return refObject;\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar RESERVED_PROPS = {\n  key: true,\n  ref: true,\n  __self: true,\n  __source: true\n};\nvar specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;\n\n{\n  didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n  {\n    if (hasOwnProperty.call(config, 'ref')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n\n  return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n  {\n    if (hasOwnProperty.call(config, 'key')) {\n      var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n      if (getter && getter.isReactWarning) {\n        return false;\n      }\n    }\n  }\n\n  return config.key !== undefined;\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n  var warnAboutAccessingKey = function () {\n    {\n      if (!specialPropKeyWarningShown) {\n        specialPropKeyWarningShown = true;\n\n        error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n      }\n    }\n  };\n\n  warnAboutAccessingKey.isReactWarning = true;\n  Object.defineProperty(props, 'key', {\n    get: warnAboutAccessingKey,\n    configurable: true\n  });\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n  var warnAboutAccessingRef = function () {\n    {\n      if (!specialPropRefWarningShown) {\n        specialPropRefWarningShown = true;\n\n        error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n      }\n    }\n  };\n\n  warnAboutAccessingRef.isReactWarning = true;\n  Object.defineProperty(props, 'ref', {\n    get: warnAboutAccessingRef,\n    configurable: true\n  });\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config) {\n  {\n    if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {\n      var componentName = getComponentName(ReactCurrentOwner.current.type);\n\n      if (!didWarnAboutStringRefs[componentName]) {\n        error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref);\n\n        didWarnAboutStringRefs[componentName] = true;\n      }\n    }\n  }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n  var element = {\n    // This tag allows us to uniquely identify this as a React Element\n    $$typeof: REACT_ELEMENT_TYPE,\n    // Built-in properties that belong on the element\n    type: type,\n    key: key,\n    ref: ref,\n    props: props,\n    // Record the component responsible for creating this element.\n    _owner: owner\n  };\n\n  {\n    // The validation flag is currently mutative. We put it on\n    // an external backing store so that we can freeze the whole object.\n    // This can be replaced with a WeakMap once they are implemented in\n    // commonly used development environments.\n    element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n    // the validation flag non-enumerable (where possible, which should\n    // include every environment we run tests in), so the test framework\n    // ignores it.\n\n    Object.defineProperty(element._store, 'validated', {\n      configurable: false,\n      enumerable: false,\n      writable: true,\n      value: false\n    }); // self and source are DEV only properties.\n\n    Object.defineProperty(element, '_self', {\n      configurable: false,\n      enumerable: false,\n      writable: false,\n      value: self\n    }); // Two elements created in two different places should be considered\n    // equal for testing purposes and therefore we hide it from enumeration.\n\n    Object.defineProperty(element, '_source', {\n      configurable: false,\n      enumerable: false,\n      writable: false,\n      value: source\n    });\n\n    if (Object.freeze) {\n      Object.freeze(element.props);\n      Object.freeze(element);\n    }\n  }\n\n  return element;\n};\n/**\n * Create and return a new ReactElement of the given type.\n * See https://reactjs.org/docs/react-api.html#createelement\n */\n\nfunction createElement(type, config, children) {\n  var propName; // Reserved names are extracted\n\n  var props = {};\n  var key = null;\n  var ref = null;\n  var self = null;\n  var source = null;\n\n  if (config != null) {\n    if (hasValidRef(config)) {\n      ref = config.ref;\n\n      {\n        warnIfStringRefCannotBeAutoConverted(config);\n      }\n    }\n\n    if (hasValidKey(config)) {\n      key = '' + config.key;\n    }\n\n    self = config.__self === undefined ? null : config.__self;\n    source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object\n\n    for (propName in config) {\n      if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n        props[propName] = config[propName];\n      }\n    }\n  } // Children can be more than one argument, and those are transferred onto\n  // the newly allocated props object.\n\n\n  var childrenLength = arguments.length - 2;\n\n  if (childrenLength === 1) {\n    props.children = children;\n  } else if (childrenLength > 1) {\n    var childArray = Array(childrenLength);\n\n    for (var i = 0; i < childrenLength; i++) {\n      childArray[i] = arguments[i + 2];\n    }\n\n    {\n      if (Object.freeze) {\n        Object.freeze(childArray);\n      }\n    }\n\n    props.children = childArray;\n  } // Resolve default props\n\n\n  if (type && type.defaultProps) {\n    var defaultProps = type.defaultProps;\n\n    for (propName in defaultProps) {\n      if (props[propName] === undefined) {\n        props[propName] = defaultProps[propName];\n      }\n    }\n  }\n\n  {\n    if (key || ref) {\n      var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n      if (key) {\n        defineKeyPropWarningGetter(props, displayName);\n      }\n\n      if (ref) {\n        defineRefPropWarningGetter(props, displayName);\n      }\n    }\n  }\n\n  return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n  var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n  return newElement;\n}\n/**\n * Clone and return a new ReactElement using element as the starting point.\n * See https://reactjs.org/docs/react-api.html#cloneelement\n */\n\nfunction cloneElement(element, config, children) {\n  if (!!(element === null || element === undefined)) {\n    {\n      throw Error( \"React.cloneElement(...): The argument must be a React element, but you passed \" + element + \".\" );\n    }\n  }\n\n  var propName; // Original props are copied\n\n  var props = _assign({}, element.props); // Reserved names are extracted\n\n\n  var key = element.key;\n  var ref = element.ref; // Self is preserved since the owner is preserved.\n\n  var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a\n  // transpiler, and the original source is probably a better indicator of the\n  // true owner.\n\n  var source = element._source; // Owner will be preserved, unless ref is overridden\n\n  var owner = element._owner;\n\n  if (config != null) {\n    if (hasValidRef(config)) {\n      // Silently steal the ref from the parent.\n      ref = config.ref;\n      owner = ReactCurrentOwner.current;\n    }\n\n    if (hasValidKey(config)) {\n      key = '' + config.key;\n    } // Remaining properties override existing props\n\n\n    var defaultProps;\n\n    if (element.type && element.type.defaultProps) {\n      defaultProps = element.type.defaultProps;\n    }\n\n    for (propName in config) {\n      if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n        if (config[propName] === undefined && defaultProps !== undefined) {\n          // Resolve default props\n          props[propName] = defaultProps[propName];\n        } else {\n          props[propName] = config[propName];\n        }\n      }\n    }\n  } // Children can be more than one argument, and those are transferred onto\n  // the newly allocated props object.\n\n\n  var childrenLength = arguments.length - 2;\n\n  if (childrenLength === 1) {\n    props.children = children;\n  } else if (childrenLength > 1) {\n    var childArray = Array(childrenLength);\n\n    for (var i = 0; i < childrenLength; i++) {\n      childArray[i] = arguments[i + 2];\n    }\n\n    props.children = childArray;\n  }\n\n  return ReactElement(element.type, key, ref, self, source, owner, props);\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\nfunction isValidElement(object) {\n  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\n\nvar SEPARATOR = '.';\nvar SUBSEPARATOR = ':';\n/**\n * Escape and wrap key so it is safe to use as a reactid\n *\n * @param {string} key to be escaped.\n * @return {string} the escaped key.\n */\n\nfunction escape(key) {\n  var escapeRegex = /[=:]/g;\n  var escaperLookup = {\n    '=': '=0',\n    ':': '=2'\n  };\n  var escapedString = ('' + key).replace(escapeRegex, function (match) {\n    return escaperLookup[match];\n  });\n  return '$' + escapedString;\n}\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\n\nvar didWarnAboutMaps = false;\nvar userProvidedKeyEscapeRegex = /\\/+/g;\n\nfunction escapeUserProvidedKey(text) {\n  return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');\n}\n\nvar POOL_SIZE = 10;\nvar traverseContextPool = [];\n\nfunction getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {\n  if (traverseContextPool.length) {\n    var traverseContext = traverseContextPool.pop();\n    traverseContext.result = mapResult;\n    traverseContext.keyPrefix = keyPrefix;\n    traverseContext.func = mapFunction;\n    traverseContext.context = mapContext;\n    traverseContext.count = 0;\n    return traverseContext;\n  } else {\n    return {\n      result: mapResult,\n      keyPrefix: keyPrefix,\n      func: mapFunction,\n      context: mapContext,\n      count: 0\n    };\n  }\n}\n\nfunction releaseTraverseContext(traverseContext) {\n  traverseContext.result = null;\n  traverseContext.keyPrefix = null;\n  traverseContext.func = null;\n  traverseContext.context = null;\n  traverseContext.count = 0;\n\n  if (traverseContextPool.length < POOL_SIZE) {\n    traverseContextPool.push(traverseContext);\n  }\n}\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\n\n\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n  var type = typeof children;\n\n  if (type === 'undefined' || type === 'boolean') {\n    // All of the above are perceived as null.\n    children = null;\n  }\n\n  var invokeCallback = false;\n\n  if (children === null) {\n    invokeCallback = true;\n  } else {\n    switch (type) {\n      case 'string':\n      case 'number':\n        invokeCallback = true;\n        break;\n\n      case 'object':\n        switch (children.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n          case REACT_PORTAL_TYPE:\n            invokeCallback = true;\n        }\n\n    }\n  }\n\n  if (invokeCallback) {\n    callback(traverseContext, children, // If it's the only child, treat the name as if it was wrapped in an array\n    // so that it's consistent if the number of children grows.\n    nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n    return 1;\n  }\n\n  var child;\n  var nextName;\n  var subtreeCount = 0; // Count of children found in the current subtree.\n\n  var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n  if (Array.isArray(children)) {\n    for (var i = 0; i < children.length; i++) {\n      child = children[i];\n      nextName = nextNamePrefix + getComponentKey(child, i);\n      subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n    }\n  } else {\n    var iteratorFn = getIteratorFn(children);\n\n    if (typeof iteratorFn === 'function') {\n\n      {\n        // Warn about using Maps as children\n        if (iteratorFn === children.entries) {\n          if (!didWarnAboutMaps) {\n            warn('Using Maps as children is deprecated and will be removed in ' + 'a future major release. Consider converting children to ' + 'an array of keyed ReactElements instead.');\n          }\n\n          didWarnAboutMaps = true;\n        }\n      }\n\n      var iterator = iteratorFn.call(children);\n      var step;\n      var ii = 0;\n\n      while (!(step = iterator.next()).done) {\n        child = step.value;\n        nextName = nextNamePrefix + getComponentKey(child, ii++);\n        subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n      }\n    } else if (type === 'object') {\n      var addendum = '';\n\n      {\n        addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum();\n      }\n\n      var childrenString = '' + children;\n\n      {\n        {\n          throw Error( \"Objects are not valid as a React child (found: \" + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + \").\" + addendum );\n        }\n      }\n    }\n  }\n\n  return subtreeCount;\n}\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\n\n\nfunction traverseAllChildren(children, callback, traverseContext) {\n  if (children == null) {\n    return 0;\n  }\n\n  return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\n\n\nfunction getComponentKey(component, index) {\n  // Do some typechecking here since we call this blindly. We want to ensure\n  // that we don't block potential future ES APIs.\n  if (typeof component === 'object' && component !== null && component.key != null) {\n    // Explicit key\n    return escape(component.key);\n  } // Implicit key determined by the index in the set\n\n\n  return index.toString(36);\n}\n\nfunction forEachSingleChild(bookKeeping, child, name) {\n  var func = bookKeeping.func,\n      context = bookKeeping.context;\n  func.call(context, child, bookKeeping.count++);\n}\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenforeach\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\n\n\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n  if (children == null) {\n    return children;\n  }\n\n  var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);\n  traverseAllChildren(children, forEachSingleChild, traverseContext);\n  releaseTraverseContext(traverseContext);\n}\n\nfunction mapSingleChildIntoContext(bookKeeping, child, childKey) {\n  var result = bookKeeping.result,\n      keyPrefix = bookKeeping.keyPrefix,\n      func = bookKeeping.func,\n      context = bookKeeping.context;\n  var mappedChild = func.call(context, child, bookKeeping.count++);\n\n  if (Array.isArray(mappedChild)) {\n    mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, function (c) {\n      return c;\n    });\n  } else if (mappedChild != null) {\n    if (isValidElement(mappedChild)) {\n      mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as\n      // traverseAllChildren used to do for objects as children\n      keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);\n    }\n\n    result.push(mappedChild);\n  }\n}\n\nfunction mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n  var escapedPrefix = '';\n\n  if (prefix != null) {\n    escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n  }\n\n  var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);\n  traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n  releaseTraverseContext(traverseContext);\n}\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenmap\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\n\n\nfunction mapChildren(children, func, context) {\n  if (children == null) {\n    return children;\n  }\n\n  var result = [];\n  mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n  return result;\n}\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrencount\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\n\n\nfunction countChildren(children) {\n  return traverseAllChildren(children, function () {\n    return null;\n  }, null);\n}\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrentoarray\n */\n\n\nfunction toArray(children) {\n  var result = [];\n  mapIntoWithKeyPrefixInternal(children, result, null, function (child) {\n    return child;\n  });\n  return result;\n}\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenonly\n *\n * The current implementation of this function assumes that a single child gets\n * passed without a wrapper, but the purpose of this helper function is to\n * abstract away the particular structure of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactElement} The first and only `ReactElement` contained in the\n * structure.\n */\n\n\nfunction onlyChild(children) {\n  if (!isValidElement(children)) {\n    {\n      throw Error( \"React.Children.only expected to receive a single React element child.\" );\n    }\n  }\n\n  return children;\n}\n\nfunction createContext(defaultValue, calculateChangedBits) {\n  if (calculateChangedBits === undefined) {\n    calculateChangedBits = null;\n  } else {\n    {\n      if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') {\n        error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits);\n      }\n    }\n  }\n\n  var context = {\n    $$typeof: REACT_CONTEXT_TYPE,\n    _calculateChangedBits: calculateChangedBits,\n    // As a workaround to support multiple concurrent renderers, we categorize\n    // some renderers as primary and others as secondary. We only expect\n    // there to be two concurrent renderers at most: React Native (primary) and\n    // Fabric (secondary); React DOM (primary) and React ART (secondary).\n    // Secondary renderers store their context values on separate fields.\n    _currentValue: defaultValue,\n    _currentValue2: defaultValue,\n    // Used to track how many concurrent renderers this context currently\n    // supports within in a single renderer. Such as parallel server rendering.\n    _threadCount: 0,\n    // These are circular\n    Provider: null,\n    Consumer: null\n  };\n  context.Provider = {\n    $$typeof: REACT_PROVIDER_TYPE,\n    _context: context\n  };\n  var hasWarnedAboutUsingNestedContextConsumers = false;\n  var hasWarnedAboutUsingConsumerProvider = false;\n\n  {\n    // A separate object, but proxies back to the original context object for\n    // backwards compatibility. It has a different $$typeof, so we can properly\n    // warn for the incorrect usage of Context as a Consumer.\n    var Consumer = {\n      $$typeof: REACT_CONTEXT_TYPE,\n      _context: context,\n      _calculateChangedBits: context._calculateChangedBits\n    }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here\n\n    Object.defineProperties(Consumer, {\n      Provider: {\n        get: function () {\n          if (!hasWarnedAboutUsingConsumerProvider) {\n            hasWarnedAboutUsingConsumerProvider = true;\n\n            error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?');\n          }\n\n          return context.Provider;\n        },\n        set: function (_Provider) {\n          context.Provider = _Provider;\n        }\n      },\n      _currentValue: {\n        get: function () {\n          return context._currentValue;\n        },\n        set: function (_currentValue) {\n          context._currentValue = _currentValue;\n        }\n      },\n      _currentValue2: {\n        get: function () {\n          return context._currentValue2;\n        },\n        set: function (_currentValue2) {\n          context._currentValue2 = _currentValue2;\n        }\n      },\n      _threadCount: {\n        get: function () {\n          return context._threadCount;\n        },\n        set: function (_threadCount) {\n          context._threadCount = _threadCount;\n        }\n      },\n      Consumer: {\n        get: function () {\n          if (!hasWarnedAboutUsingNestedContextConsumers) {\n            hasWarnedAboutUsingNestedContextConsumers = true;\n\n            error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');\n          }\n\n          return context.Consumer;\n        }\n      }\n    }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty\n\n    context.Consumer = Consumer;\n  }\n\n  {\n    context._currentRenderer = null;\n    context._currentRenderer2 = null;\n  }\n\n  return context;\n}\n\nfunction lazy(ctor) {\n  var lazyType = {\n    $$typeof: REACT_LAZY_TYPE,\n    _ctor: ctor,\n    // React uses these fields to store the result.\n    _status: -1,\n    _result: null\n  };\n\n  {\n    // In production, this would just set it on the object.\n    var defaultProps;\n    var propTypes;\n    Object.defineProperties(lazyType, {\n      defaultProps: {\n        configurable: true,\n        get: function () {\n          return defaultProps;\n        },\n        set: function (newDefaultProps) {\n          error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n          defaultProps = newDefaultProps; // Match production behavior more closely:\n\n          Object.defineProperty(lazyType, 'defaultProps', {\n            enumerable: true\n          });\n        }\n      },\n      propTypes: {\n        configurable: true,\n        get: function () {\n          return propTypes;\n        },\n        set: function (newPropTypes) {\n          error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n          propTypes = newPropTypes; // Match production behavior more closely:\n\n          Object.defineProperty(lazyType, 'propTypes', {\n            enumerable: true\n          });\n        }\n      }\n    });\n  }\n\n  return lazyType;\n}\n\nfunction forwardRef(render) {\n  {\n    if (render != null && render.$$typeof === REACT_MEMO_TYPE) {\n      error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');\n    } else if (typeof render !== 'function') {\n      error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);\n    } else {\n      if (render.length !== 0 && render.length !== 2) {\n        error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.');\n      }\n    }\n\n    if (render != null) {\n      if (render.defaultProps != null || render.propTypes != null) {\n        error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?');\n      }\n    }\n  }\n\n  return {\n    $$typeof: REACT_FORWARD_REF_TYPE,\n    render: render\n  };\n}\n\nfunction isValidElementType(type) {\n  return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n  type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction memo(type, compare) {\n  {\n    if (!isValidElementType(type)) {\n      error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);\n    }\n  }\n\n  return {\n    $$typeof: REACT_MEMO_TYPE,\n    type: type,\n    compare: compare === undefined ? null : compare\n  };\n}\n\nfunction resolveDispatcher() {\n  var dispatcher = ReactCurrentDispatcher.current;\n\n  if (!(dispatcher !== null)) {\n    {\n      throw Error( \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.\" );\n    }\n  }\n\n  return dispatcher;\n}\n\nfunction useContext(Context, unstable_observedBits) {\n  var dispatcher = resolveDispatcher();\n\n  {\n    if (unstable_observedBits !== undefined) {\n      error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\\n\\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://fb.me/rules-of-hooks' : '');\n    } // TODO: add a more generic warning for invalid values.\n\n\n    if (Context._context !== undefined) {\n      var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs\n      // and nobody should be using this in existing code.\n\n      if (realContext.Consumer === Context) {\n        error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');\n      } else if (realContext.Provider === Context) {\n        error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');\n      }\n    }\n  }\n\n  return dispatcher.useContext(Context, unstable_observedBits);\n}\nfunction useState(initialState) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useState(initialState);\n}\nfunction useReducer(reducer, initialArg, init) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useReducer(reducer, initialArg, init);\n}\nfunction useRef(initialValue) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useRef(initialValue);\n}\nfunction useEffect(create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useEffect(create, deps);\n}\nfunction useLayoutEffect(create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useLayoutEffect(create, deps);\n}\nfunction useCallback(callback, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useCallback(callback, deps);\n}\nfunction useMemo(create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useMemo(create, deps);\n}\nfunction useImperativeHandle(ref, create, deps) {\n  var dispatcher = resolveDispatcher();\n  return dispatcher.useImperativeHandle(ref, create, deps);\n}\nfunction useDebugValue(value, formatterFn) {\n  {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useDebugValue(value, formatterFn);\n  }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n  propTypesMisspellWarningShown = false;\n}\n\nfunction getDeclarationErrorAddendum() {\n  if (ReactCurrentOwner.current) {\n    var name = getComponentName(ReactCurrentOwner.current.type);\n\n    if (name) {\n      return '\\n\\nCheck the render method of `' + name + '`.';\n    }\n  }\n\n  return '';\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n  if (source !== undefined) {\n    var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n    var lineNumber = source.lineNumber;\n    return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n  }\n\n  return '';\n}\n\nfunction getSourceInfoErrorAddendumForProps(elementProps) {\n  if (elementProps !== null && elementProps !== undefined) {\n    return getSourceInfoErrorAddendum(elementProps.__source);\n  }\n\n  return '';\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n  var info = getDeclarationErrorAddendum();\n\n  if (!info) {\n    var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n    if (parentName) {\n      info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n    }\n  }\n\n  return info;\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n  if (!element._store || element._store.validated || element.key != null) {\n    return;\n  }\n\n  element._store.validated = true;\n  var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n  if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n    return;\n  }\n\n  ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n  // property, it may be the creator of the child that's responsible for\n  // assigning it a key.\n\n  var childOwner = '';\n\n  if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n    // Give the component that originally created this child.\n    childOwner = \" It was passed a child from \" + getComponentName(element._owner.type) + \".\";\n  }\n\n  setCurrentlyValidatingElement(element);\n\n  {\n    error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.', currentComponentErrorInfo, childOwner);\n  }\n\n  setCurrentlyValidatingElement(null);\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n  if (typeof node !== 'object') {\n    return;\n  }\n\n  if (Array.isArray(node)) {\n    for (var i = 0; i < node.length; i++) {\n      var child = node[i];\n\n      if (isValidElement(child)) {\n        validateExplicitKey(child, parentType);\n      }\n    }\n  } else if (isValidElement(node)) {\n    // This element was passed in a valid location.\n    if (node._store) {\n      node._store.validated = true;\n    }\n  } else if (node) {\n    var iteratorFn = getIteratorFn(node);\n\n    if (typeof iteratorFn === 'function') {\n      // Entry iterators used to provide implicit keys,\n      // but now we print a separate warning for them later.\n      if (iteratorFn !== node.entries) {\n        var iterator = iteratorFn.call(node);\n        var step;\n\n        while (!(step = iterator.next()).done) {\n          if (isValidElement(step.value)) {\n            validateExplicitKey(step.value, parentType);\n          }\n        }\n      }\n    }\n  }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n  {\n    var type = element.type;\n\n    if (type === null || type === undefined || typeof type === 'string') {\n      return;\n    }\n\n    var name = getComponentName(type);\n    var propTypes;\n\n    if (typeof type === 'function') {\n      propTypes = type.propTypes;\n    } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n    // Inner props are checked in the reconciler.\n    type.$$typeof === REACT_MEMO_TYPE)) {\n      propTypes = type.propTypes;\n    } else {\n      return;\n    }\n\n    if (propTypes) {\n      setCurrentlyValidatingElement(element);\n      checkPropTypes(propTypes, element.props, 'prop', name, ReactDebugCurrentFrame.getStackAddendum);\n      setCurrentlyValidatingElement(null);\n    } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n      propTypesMisspellWarningShown = true;\n\n      error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown');\n    }\n\n    if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n      error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n    }\n  }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n  {\n    setCurrentlyValidatingElement(fragment);\n    var keys = Object.keys(fragment.props);\n\n    for (var i = 0; i < keys.length; i++) {\n      var key = keys[i];\n\n      if (key !== 'children' && key !== 'key') {\n        error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n        break;\n      }\n    }\n\n    if (fragment.ref !== null) {\n      error('Invalid attribute `ref` supplied to `React.Fragment`.');\n    }\n\n    setCurrentlyValidatingElement(null);\n  }\n}\nfunction createElementWithValidation(type, props, children) {\n  var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n  // succeed and there will likely be errors in render.\n\n  if (!validType) {\n    var info = '';\n\n    if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n      info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n    }\n\n    var sourceInfo = getSourceInfoErrorAddendumForProps(props);\n\n    if (sourceInfo) {\n      info += sourceInfo;\n    } else {\n      info += getDeclarationErrorAddendum();\n    }\n\n    var typeString;\n\n    if (type === null) {\n      typeString = 'null';\n    } else if (Array.isArray(type)) {\n      typeString = 'array';\n    } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n      typeString = \"<\" + (getComponentName(type.type) || 'Unknown') + \" />\";\n      info = ' Did you accidentally export a JSX literal instead of a component?';\n    } else {\n      typeString = typeof type;\n    }\n\n    {\n      error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n    }\n  }\n\n  var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.\n  // TODO: Drop this when these are no longer allowed as the type argument.\n\n  if (element == null) {\n    return element;\n  } // Skip key warning if the type isn't valid since our key validation logic\n  // doesn't expect a non-string/function type and can throw confusing errors.\n  // We don't want exception behavior to differ between dev and prod.\n  // (Rendering will throw with a helpful message and as soon as the type is\n  // fixed, the key warnings will appear.)\n\n\n  if (validType) {\n    for (var i = 2; i < arguments.length; i++) {\n      validateChildKeys(arguments[i], type);\n    }\n  }\n\n  if (type === REACT_FRAGMENT_TYPE) {\n    validateFragmentProps(element);\n  } else {\n    validatePropTypes(element);\n  }\n\n  return element;\n}\nvar didWarnAboutDeprecatedCreateFactory = false;\nfunction createFactoryWithValidation(type) {\n  var validatedFactory = createElementWithValidation.bind(null, type);\n  validatedFactory.type = type;\n\n  {\n    if (!didWarnAboutDeprecatedCreateFactory) {\n      didWarnAboutDeprecatedCreateFactory = true;\n\n      warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.');\n    } // Legacy hook: remove it\n\n\n    Object.defineProperty(validatedFactory, 'type', {\n      enumerable: false,\n      get: function () {\n        warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');\n\n        Object.defineProperty(this, 'type', {\n          value: type\n        });\n        return type;\n      }\n    });\n  }\n\n  return validatedFactory;\n}\nfunction cloneElementWithValidation(element, props, children) {\n  var newElement = cloneElement.apply(this, arguments);\n\n  for (var i = 2; i < arguments.length; i++) {\n    validateChildKeys(arguments[i], newElement.type);\n  }\n\n  validatePropTypes(newElement);\n  return newElement;\n}\n\n{\n\n  try {\n    var frozenObject = Object.freeze({});\n    var testMap = new Map([[frozenObject, null]]);\n    var testSet = new Set([frozenObject]); // This is necessary for Rollup to not consider these unused.\n    // https://github.com/rollup/rollup/issues/1771\n    // TODO: we can remove these if Rollup fixes the bug.\n\n    testMap.set(0, 0);\n    testSet.add(0);\n  } catch (e) {\n  }\n}\n\nvar createElement$1 =  createElementWithValidation ;\nvar cloneElement$1 =  cloneElementWithValidation ;\nvar createFactory =  createFactoryWithValidation ;\nvar Children = {\n  map: mapChildren,\n  forEach: forEachChildren,\n  count: countChildren,\n  toArray: toArray,\n  only: onlyChild\n};\n\nexports.Children = Children;\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals;\nexports.cloneElement = cloneElement$1;\nexports.createContext = createContext;\nexports.createElement = createElement$1;\nexports.createFactory = createFactory;\nexports.createRef = createRef;\nexports.forwardRef = forwardRef;\nexports.isValidElement = isValidElement;\nexports.lazy = lazy;\nexports.memo = memo;\nexports.useCallback = useCallback;\nexports.useContext = useContext;\nexports.useDebugValue = useDebugValue;\nexports.useEffect = useEffect;\nexports.useImperativeHandle = useImperativeHandle;\nexports.useLayoutEffect = useLayoutEffect;\nexports.useMemo = useMemo;\nexports.useReducer = useReducer;\nexports.useRef = useRef;\nexports.useState = useState;\nexports.version = ReactVersion;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react/cjs/react.development.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/react/index.js":
+/*!*************************************************!*\
+  !*** ./jaas-client/node_modules/react/index.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react.development.js */ \"./jaas-client/node_modules/react/cjs/react.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/react/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js":
+/*!***************************************************************************!*\
+  !*** ./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nfunction isAbsolute(pathname) {\n  return pathname.charAt(0) === '/';\n}\n\n// About 1.5x faster than the two-arg version of Array#splice()\nfunction spliceOne(list, index) {\n  for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {\n    list[i] = list[k];\n  }\n\n  list.pop();\n}\n\n// This implementation is based heavily on node's url.parse\nfunction resolvePathname(to, from) {\n  if (from === undefined) from = '';\n\n  var toParts = (to && to.split('/')) || [];\n  var fromParts = (from && from.split('/')) || [];\n\n  var isToAbs = to && isAbsolute(to);\n  var isFromAbs = from && isAbsolute(from);\n  var mustEndAbs = isToAbs || isFromAbs;\n\n  if (to && isAbsolute(to)) {\n    // to is absolute\n    fromParts = toParts;\n  } else if (toParts.length) {\n    // to is relative, drop the filename\n    fromParts.pop();\n    fromParts = fromParts.concat(toParts);\n  }\n\n  if (!fromParts.length) return '/';\n\n  var hasTrailingSlash;\n  if (fromParts.length) {\n    var last = fromParts[fromParts.length - 1];\n    hasTrailingSlash = last === '.' || last === '..' || last === '';\n  } else {\n    hasTrailingSlash = false;\n  }\n\n  var up = 0;\n  for (var i = fromParts.length; i >= 0; i--) {\n    var part = fromParts[i];\n\n    if (part === '.') {\n      spliceOne(fromParts, i);\n    } else if (part === '..') {\n      spliceOne(fromParts, i);\n      up++;\n    } else if (up) {\n      spliceOne(fromParts, i);\n      up--;\n    }\n  }\n\n  if (!mustEndAbs) for (; up--; up) fromParts.unshift('..');\n\n  if (\n    mustEndAbs &&\n    fromParts[0] !== '' &&\n    (!fromParts[0] || !isAbsolute(fromParts[0]))\n  )\n    fromParts.unshift('');\n\n  var result = fromParts.join('/');\n\n  if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';\n\n  return result;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (resolvePathname);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/resolve-pathname/esm/resolve-pathname.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js ***!
+  \*********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/** @license React v0.19.1\n * scheduler-tracing.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs.\n\nvar interactionIDCounter = 0;\nvar threadIDCounter = 0; // Set of currently traced interactions.\n// Interactions \"stack\"–\n// Meaning that newly traced interactions are appended to the previously active set.\n// When an interaction goes out of scope, the previous set (if any) is restored.\n\nexports.__interactionsRef = null; // Listener(s) to notify when interactions begin and end.\n\nexports.__subscriberRef = null;\n\n{\n  exports.__interactionsRef = {\n    current: new Set()\n  };\n  exports.__subscriberRef = {\n    current: null\n  };\n}\nfunction unstable_clear(callback) {\n\n  var prevInteractions = exports.__interactionsRef.current;\n  exports.__interactionsRef.current = new Set();\n\n  try {\n    return callback();\n  } finally {\n    exports.__interactionsRef.current = prevInteractions;\n  }\n}\nfunction unstable_getCurrent() {\n  {\n    return exports.__interactionsRef.current;\n  }\n}\nfunction unstable_getThreadID() {\n  return ++threadIDCounter;\n}\nfunction unstable_trace(name, timestamp, callback) {\n  var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID;\n\n  var interaction = {\n    __count: 1,\n    id: interactionIDCounter++,\n    name: name,\n    timestamp: timestamp\n  };\n  var prevInteractions = exports.__interactionsRef.current; // Traced interactions should stack/accumulate.\n  // To do that, clone the current interactions.\n  // The previous set will be restored upon completion.\n\n  var interactions = new Set(prevInteractions);\n  interactions.add(interaction);\n  exports.__interactionsRef.current = interactions;\n  var subscriber = exports.__subscriberRef.current;\n  var returnValue;\n\n  try {\n    if (subscriber !== null) {\n      subscriber.onInteractionTraced(interaction);\n    }\n  } finally {\n    try {\n      if (subscriber !== null) {\n        subscriber.onWorkStarted(interactions, threadID);\n      }\n    } finally {\n      try {\n        returnValue = callback();\n      } finally {\n        exports.__interactionsRef.current = prevInteractions;\n\n        try {\n          if (subscriber !== null) {\n            subscriber.onWorkStopped(interactions, threadID);\n          }\n        } finally {\n          interaction.__count--; // If no async work was scheduled for this interaction,\n          // Notify subscribers that it's completed.\n\n          if (subscriber !== null && interaction.__count === 0) {\n            subscriber.onInteractionScheduledWorkCompleted(interaction);\n          }\n        }\n      }\n    }\n  }\n\n  return returnValue;\n}\nfunction unstable_wrap(callback) {\n  var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID;\n\n  var wrappedInteractions = exports.__interactionsRef.current;\n  var subscriber = exports.__subscriberRef.current;\n\n  if (subscriber !== null) {\n    subscriber.onWorkScheduled(wrappedInteractions, threadID);\n  } // Update the pending async work count for the current interactions.\n  // Update after calling subscribers in case of error.\n\n\n  wrappedInteractions.forEach(function (interaction) {\n    interaction.__count++;\n  });\n  var hasRun = false;\n\n  function wrapped() {\n    var prevInteractions = exports.__interactionsRef.current;\n    exports.__interactionsRef.current = wrappedInteractions;\n    subscriber = exports.__subscriberRef.current;\n\n    try {\n      var returnValue;\n\n      try {\n        if (subscriber !== null) {\n          subscriber.onWorkStarted(wrappedInteractions, threadID);\n        }\n      } finally {\n        try {\n          returnValue = callback.apply(undefined, arguments);\n        } finally {\n          exports.__interactionsRef.current = prevInteractions;\n\n          if (subscriber !== null) {\n            subscriber.onWorkStopped(wrappedInteractions, threadID);\n          }\n        }\n      }\n\n      return returnValue;\n    } finally {\n      if (!hasRun) {\n        // We only expect a wrapped function to be executed once,\n        // But in the event that it's executed more than once–\n        // Only decrement the outstanding interaction counts once.\n        hasRun = true; // Update pending async counts for all wrapped interactions.\n        // If this was the last scheduled async work for any of them,\n        // Mark them as completed.\n\n        wrappedInteractions.forEach(function (interaction) {\n          interaction.__count--;\n\n          if (subscriber !== null && interaction.__count === 0) {\n            subscriber.onInteractionScheduledWorkCompleted(interaction);\n          }\n        });\n      }\n    }\n  }\n\n  wrapped.cancel = function cancel() {\n    subscriber = exports.__subscriberRef.current;\n\n    try {\n      if (subscriber !== null) {\n        subscriber.onWorkCanceled(wrappedInteractions, threadID);\n      }\n    } finally {\n      // Update pending async counts for all wrapped interactions.\n      // If this was the last scheduled async work for any of them,\n      // Mark them as completed.\n      wrappedInteractions.forEach(function (interaction) {\n        interaction.__count--;\n\n        if (subscriber && interaction.__count === 0) {\n          subscriber.onInteractionScheduledWorkCompleted(interaction);\n        }\n      });\n    }\n  };\n\n  return wrapped;\n}\n\nvar subscribers = null;\n\n{\n  subscribers = new Set();\n}\n\nfunction unstable_subscribe(subscriber) {\n  {\n    subscribers.add(subscriber);\n\n    if (subscribers.size === 1) {\n      exports.__subscriberRef.current = {\n        onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted,\n        onInteractionTraced: onInteractionTraced,\n        onWorkCanceled: onWorkCanceled,\n        onWorkScheduled: onWorkScheduled,\n        onWorkStarted: onWorkStarted,\n        onWorkStopped: onWorkStopped\n      };\n    }\n  }\n}\nfunction unstable_unsubscribe(subscriber) {\n  {\n    subscribers.delete(subscriber);\n\n    if (subscribers.size === 0) {\n      exports.__subscriberRef.current = null;\n    }\n  }\n}\n\nfunction onInteractionTraced(interaction) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onInteractionTraced(interaction);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onInteractionScheduledWorkCompleted(interaction) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onInteractionScheduledWorkCompleted(interaction);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkScheduled(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkScheduled(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkStarted(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkStarted(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkStopped(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkStopped(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nfunction onWorkCanceled(interactions, threadID) {\n  var didCatchError = false;\n  var caughtError = null;\n  subscribers.forEach(function (subscriber) {\n    try {\n      subscriber.onWorkCanceled(interactions, threadID);\n    } catch (error) {\n      if (!didCatchError) {\n        didCatchError = true;\n        caughtError = error;\n      }\n    }\n  });\n\n  if (didCatchError) {\n    throw caughtError;\n  }\n}\n\nexports.unstable_clear = unstable_clear;\nexports.unstable_getCurrent = unstable_getCurrent;\nexports.unstable_getThreadID = unstable_getThreadID;\nexports.unstable_subscribe = unstable_subscribe;\nexports.unstable_trace = unstable_trace;\nexports.unstable_unsubscribe = unstable_unsubscribe;\nexports.unstable_wrap = unstable_wrap;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/scheduler/cjs/scheduler.development.js":
+/*!*************************************************************************!*\
+  !*** ./jaas-client/node_modules/scheduler/cjs/scheduler.development.js ***!
+  \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/** @license React v0.19.1\n * scheduler.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\nif (true) {\n  (function() {\n'use strict';\n\nvar enableSchedulerDebugging = false;\nvar enableProfiling = true;\n\nvar requestHostCallback;\nvar requestHostTimeout;\nvar cancelHostTimeout;\nvar shouldYieldToHost;\nvar requestPaint;\n\nif ( // If Scheduler runs in a non-DOM environment, it falls back to a naive\n// implementation using setTimeout.\ntypeof window === 'undefined' || // Check if MessageChannel is supported, too.\ntypeof MessageChannel !== 'function') {\n  // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore,\n  // fallback to a naive implementation.\n  var _callback = null;\n  var _timeoutID = null;\n\n  var _flushCallback = function () {\n    if (_callback !== null) {\n      try {\n        var currentTime = exports.unstable_now();\n        var hasRemainingTime = true;\n\n        _callback(hasRemainingTime, currentTime);\n\n        _callback = null;\n      } catch (e) {\n        setTimeout(_flushCallback, 0);\n        throw e;\n      }\n    }\n  };\n\n  var initialTime = Date.now();\n\n  exports.unstable_now = function () {\n    return Date.now() - initialTime;\n  };\n\n  requestHostCallback = function (cb) {\n    if (_callback !== null) {\n      // Protect against re-entrancy.\n      setTimeout(requestHostCallback, 0, cb);\n    } else {\n      _callback = cb;\n      setTimeout(_flushCallback, 0);\n    }\n  };\n\n  requestHostTimeout = function (cb, ms) {\n    _timeoutID = setTimeout(cb, ms);\n  };\n\n  cancelHostTimeout = function () {\n    clearTimeout(_timeoutID);\n  };\n\n  shouldYieldToHost = function () {\n    return false;\n  };\n\n  requestPaint = exports.unstable_forceFrameRate = function () {};\n} else {\n  // Capture local references to native APIs, in case a polyfill overrides them.\n  var performance = window.performance;\n  var _Date = window.Date;\n  var _setTimeout = window.setTimeout;\n  var _clearTimeout = window.clearTimeout;\n\n  if (typeof console !== 'undefined') {\n    // TODO: Scheduler no longer requires these methods to be polyfilled. But\n    // maybe we want to continue warning if they don't exist, to preserve the\n    // option to rely on it in the future?\n    var requestAnimationFrame = window.requestAnimationFrame;\n    var cancelAnimationFrame = window.cancelAnimationFrame; // TODO: Remove fb.me link\n\n    if (typeof requestAnimationFrame !== 'function') {\n      // Using console['error'] to evade Babel and ESLint\n      console['error'](\"This browser doesn't support requestAnimationFrame. \" + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n    }\n\n    if (typeof cancelAnimationFrame !== 'function') {\n      // Using console['error'] to evade Babel and ESLint\n      console['error'](\"This browser doesn't support cancelAnimationFrame. \" + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n    }\n  }\n\n  if (typeof performance === 'object' && typeof performance.now === 'function') {\n    exports.unstable_now = function () {\n      return performance.now();\n    };\n  } else {\n    var _initialTime = _Date.now();\n\n    exports.unstable_now = function () {\n      return _Date.now() - _initialTime;\n    };\n  }\n\n  var isMessageLoopRunning = false;\n  var scheduledHostCallback = null;\n  var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main\n  // thread, like user events. By default, it yields multiple times per frame.\n  // It does not attempt to align with frame boundaries, since most tasks don't\n  // need to be frame aligned; for those that do, use requestAnimationFrame.\n\n  var yieldInterval = 5;\n  var deadline = 0; // TODO: Make this configurable\n\n  {\n    // `isInputPending` is not available. Since we have no way of knowing if\n    // there's pending input, always yield at the end of the frame.\n    shouldYieldToHost = function () {\n      return exports.unstable_now() >= deadline;\n    }; // Since we yield every frame regardless, `requestPaint` has no effect.\n\n\n    requestPaint = function () {};\n  }\n\n  exports.unstable_forceFrameRate = function (fps) {\n    if (fps < 0 || fps > 125) {\n      // Using console['error'] to evade Babel and ESLint\n      console['error']('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing framerates higher than 125 fps is not unsupported');\n      return;\n    }\n\n    if (fps > 0) {\n      yieldInterval = Math.floor(1000 / fps);\n    } else {\n      // reset the framerate\n      yieldInterval = 5;\n    }\n  };\n\n  var performWorkUntilDeadline = function () {\n    if (scheduledHostCallback !== null) {\n      var currentTime = exports.unstable_now(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync\n      // cycle. This means there's always time remaining at the beginning of\n      // the message event.\n\n      deadline = currentTime + yieldInterval;\n      var hasTimeRemaining = true;\n\n      try {\n        var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime);\n\n        if (!hasMoreWork) {\n          isMessageLoopRunning = false;\n          scheduledHostCallback = null;\n        } else {\n          // If there's more work, schedule the next message event at the end\n          // of the preceding one.\n          port.postMessage(null);\n        }\n      } catch (error) {\n        // If a scheduler task throws, exit the current browser task so the\n        // error can be observed.\n        port.postMessage(null);\n        throw error;\n      }\n    } else {\n      isMessageLoopRunning = false;\n    } // Yielding to the browser will give it a chance to paint, so we can\n  };\n\n  var channel = new MessageChannel();\n  var port = channel.port2;\n  channel.port1.onmessage = performWorkUntilDeadline;\n\n  requestHostCallback = function (callback) {\n    scheduledHostCallback = callback;\n\n    if (!isMessageLoopRunning) {\n      isMessageLoopRunning = true;\n      port.postMessage(null);\n    }\n  };\n\n  requestHostTimeout = function (callback, ms) {\n    taskTimeoutID = _setTimeout(function () {\n      callback(exports.unstable_now());\n    }, ms);\n  };\n\n  cancelHostTimeout = function () {\n    _clearTimeout(taskTimeoutID);\n\n    taskTimeoutID = -1;\n  };\n}\n\nfunction push(heap, node) {\n  var index = heap.length;\n  heap.push(node);\n  siftUp(heap, node, index);\n}\nfunction peek(heap) {\n  var first = heap[0];\n  return first === undefined ? null : first;\n}\nfunction pop(heap) {\n  var first = heap[0];\n\n  if (first !== undefined) {\n    var last = heap.pop();\n\n    if (last !== first) {\n      heap[0] = last;\n      siftDown(heap, last, 0);\n    }\n\n    return first;\n  } else {\n    return null;\n  }\n}\n\nfunction siftUp(heap, node, i) {\n  var index = i;\n\n  while (true) {\n    var parentIndex = index - 1 >>> 1;\n    var parent = heap[parentIndex];\n\n    if (parent !== undefined && compare(parent, node) > 0) {\n      // The parent is larger. Swap positions.\n      heap[parentIndex] = node;\n      heap[index] = parent;\n      index = parentIndex;\n    } else {\n      // The parent is smaller. Exit.\n      return;\n    }\n  }\n}\n\nfunction siftDown(heap, node, i) {\n  var index = i;\n  var length = heap.length;\n\n  while (index < length) {\n    var leftIndex = (index + 1) * 2 - 1;\n    var left = heap[leftIndex];\n    var rightIndex = leftIndex + 1;\n    var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those.\n\n    if (left !== undefined && compare(left, node) < 0) {\n      if (right !== undefined && compare(right, left) < 0) {\n        heap[index] = right;\n        heap[rightIndex] = node;\n        index = rightIndex;\n      } else {\n        heap[index] = left;\n        heap[leftIndex] = node;\n        index = leftIndex;\n      }\n    } else if (right !== undefined && compare(right, node) < 0) {\n      heap[index] = right;\n      heap[rightIndex] = node;\n      index = rightIndex;\n    } else {\n      // Neither child is smaller. Exit.\n      return;\n    }\n  }\n}\n\nfunction compare(a, b) {\n  // Compare sort index first, then task id.\n  var diff = a.sortIndex - b.sortIndex;\n  return diff !== 0 ? diff : a.id - b.id;\n}\n\n// TODO: Use symbols?\nvar NoPriority = 0;\nvar ImmediatePriority = 1;\nvar UserBlockingPriority = 2;\nvar NormalPriority = 3;\nvar LowPriority = 4;\nvar IdlePriority = 5;\n\nvar runIdCounter = 0;\nvar mainThreadIdCounter = 0;\nvar profilingStateSize = 4;\nvar sharedProfilingBuffer =  // $FlowFixMe Flow doesn't know about SharedArrayBuffer\ntypeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer\ntypeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9\n;\nvar profilingState =  sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks\n\nvar PRIORITY = 0;\nvar CURRENT_TASK_ID = 1;\nvar CURRENT_RUN_ID = 2;\nvar QUEUE_SIZE = 3;\n\n{\n  profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue\n  // array might include canceled tasks.\n\n  profilingState[QUEUE_SIZE] = 0;\n  profilingState[CURRENT_TASK_ID] = 0;\n} // Bytes per element is 4\n\n\nvar INITIAL_EVENT_LOG_SIZE = 131072;\nvar MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes\n\nvar eventLogSize = 0;\nvar eventLogBuffer = null;\nvar eventLog = null;\nvar eventLogIndex = 0;\nvar TaskStartEvent = 1;\nvar TaskCompleteEvent = 2;\nvar TaskErrorEvent = 3;\nvar TaskCancelEvent = 4;\nvar TaskRunEvent = 5;\nvar TaskYieldEvent = 6;\nvar SchedulerSuspendEvent = 7;\nvar SchedulerResumeEvent = 8;\n\nfunction logEvent(entries) {\n  if (eventLog !== null) {\n    var offset = eventLogIndex;\n    eventLogIndex += entries.length;\n\n    if (eventLogIndex + 1 > eventLogSize) {\n      eventLogSize *= 2;\n\n      if (eventLogSize > MAX_EVENT_LOG_SIZE) {\n        // Using console['error'] to evade Babel and ESLint\n        console['error'](\"Scheduler Profiling: Event log exceeded maximum size. Don't \" + 'forget to call `stopLoggingProfilingEvents()`.');\n        stopLoggingProfilingEvents();\n        return;\n      }\n\n      var newEventLog = new Int32Array(eventLogSize * 4);\n      newEventLog.set(eventLog);\n      eventLogBuffer = newEventLog.buffer;\n      eventLog = newEventLog;\n    }\n\n    eventLog.set(entries, offset);\n  }\n}\n\nfunction startLoggingProfilingEvents() {\n  eventLogSize = INITIAL_EVENT_LOG_SIZE;\n  eventLogBuffer = new ArrayBuffer(eventLogSize * 4);\n  eventLog = new Int32Array(eventLogBuffer);\n  eventLogIndex = 0;\n}\nfunction stopLoggingProfilingEvents() {\n  var buffer = eventLogBuffer;\n  eventLogSize = 0;\n  eventLogBuffer = null;\n  eventLog = null;\n  eventLogIndex = 0;\n  return buffer;\n}\nfunction markTaskStart(task, ms) {\n  {\n    profilingState[QUEUE_SIZE]++;\n\n    if (eventLog !== null) {\n      // performance.now returns a float, representing milliseconds. When the\n      // event is logged, it's coerced to an int. Convert to microseconds to\n      // maintain extra degrees of precision.\n      logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]);\n    }\n  }\n}\nfunction markTaskCompleted(task, ms) {\n  {\n    profilingState[PRIORITY] = NoPriority;\n    profilingState[CURRENT_TASK_ID] = 0;\n    profilingState[QUEUE_SIZE]--;\n\n    if (eventLog !== null) {\n      logEvent([TaskCompleteEvent, ms * 1000, task.id]);\n    }\n  }\n}\nfunction markTaskCanceled(task, ms) {\n  {\n    profilingState[QUEUE_SIZE]--;\n\n    if (eventLog !== null) {\n      logEvent([TaskCancelEvent, ms * 1000, task.id]);\n    }\n  }\n}\nfunction markTaskErrored(task, ms) {\n  {\n    profilingState[PRIORITY] = NoPriority;\n    profilingState[CURRENT_TASK_ID] = 0;\n    profilingState[QUEUE_SIZE]--;\n\n    if (eventLog !== null) {\n      logEvent([TaskErrorEvent, ms * 1000, task.id]);\n    }\n  }\n}\nfunction markTaskRun(task, ms) {\n  {\n    runIdCounter++;\n    profilingState[PRIORITY] = task.priorityLevel;\n    profilingState[CURRENT_TASK_ID] = task.id;\n    profilingState[CURRENT_RUN_ID] = runIdCounter;\n\n    if (eventLog !== null) {\n      logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]);\n    }\n  }\n}\nfunction markTaskYield(task, ms) {\n  {\n    profilingState[PRIORITY] = NoPriority;\n    profilingState[CURRENT_TASK_ID] = 0;\n    profilingState[CURRENT_RUN_ID] = 0;\n\n    if (eventLog !== null) {\n      logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]);\n    }\n  }\n}\nfunction markSchedulerSuspended(ms) {\n  {\n    mainThreadIdCounter++;\n\n    if (eventLog !== null) {\n      logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]);\n    }\n  }\n}\nfunction markSchedulerUnsuspended(ms) {\n  {\n    if (eventLog !== null) {\n      logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]);\n    }\n  }\n}\n\n/* eslint-disable no-var */\n// Math.pow(2, 30) - 1\n// 0b111111111111111111111111111111\n\nvar maxSigned31BitInt = 1073741823; // Times out immediately\n\nvar IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out\n\nvar USER_BLOCKING_PRIORITY = 250;\nvar NORMAL_PRIORITY_TIMEOUT = 5000;\nvar LOW_PRIORITY_TIMEOUT = 10000; // Never times out\n\nvar IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap\n\nvar taskQueue = [];\nvar timerQueue = []; // Incrementing id counter. Used to maintain insertion order.\n\nvar taskIdCounter = 1; // Pausing the scheduler is useful for debugging.\nvar currentTask = null;\nvar currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy.\n\nvar isPerformingWork = false;\nvar isHostCallbackScheduled = false;\nvar isHostTimeoutScheduled = false;\n\nfunction advanceTimers(currentTime) {\n  // Check for tasks that are no longer delayed and add them to the queue.\n  var timer = peek(timerQueue);\n\n  while (timer !== null) {\n    if (timer.callback === null) {\n      // Timer was cancelled.\n      pop(timerQueue);\n    } else if (timer.startTime <= currentTime) {\n      // Timer fired. Transfer to the task queue.\n      pop(timerQueue);\n      timer.sortIndex = timer.expirationTime;\n      push(taskQueue, timer);\n\n      {\n        markTaskStart(timer, currentTime);\n        timer.isQueued = true;\n      }\n    } else {\n      // Remaining timers are pending.\n      return;\n    }\n\n    timer = peek(timerQueue);\n  }\n}\n\nfunction handleTimeout(currentTime) {\n  isHostTimeoutScheduled = false;\n  advanceTimers(currentTime);\n\n  if (!isHostCallbackScheduled) {\n    if (peek(taskQueue) !== null) {\n      isHostCallbackScheduled = true;\n      requestHostCallback(flushWork);\n    } else {\n      var firstTimer = peek(timerQueue);\n\n      if (firstTimer !== null) {\n        requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n      }\n    }\n  }\n}\n\nfunction flushWork(hasTimeRemaining, initialTime) {\n  {\n    markSchedulerUnsuspended(initialTime);\n  } // We'll need a host callback the next time work is scheduled.\n\n\n  isHostCallbackScheduled = false;\n\n  if (isHostTimeoutScheduled) {\n    // We scheduled a timeout but it's no longer needed. Cancel it.\n    isHostTimeoutScheduled = false;\n    cancelHostTimeout();\n  }\n\n  isPerformingWork = true;\n  var previousPriorityLevel = currentPriorityLevel;\n\n  try {\n    if (enableProfiling) {\n      try {\n        return workLoop(hasTimeRemaining, initialTime);\n      } catch (error) {\n        if (currentTask !== null) {\n          var currentTime = exports.unstable_now();\n          markTaskErrored(currentTask, currentTime);\n          currentTask.isQueued = false;\n        }\n\n        throw error;\n      }\n    } else {\n      // No catch in prod codepath.\n      return workLoop(hasTimeRemaining, initialTime);\n    }\n  } finally {\n    currentTask = null;\n    currentPriorityLevel = previousPriorityLevel;\n    isPerformingWork = false;\n\n    {\n      var _currentTime = exports.unstable_now();\n\n      markSchedulerSuspended(_currentTime);\n    }\n  }\n}\n\nfunction workLoop(hasTimeRemaining, initialTime) {\n  var currentTime = initialTime;\n  advanceTimers(currentTime);\n  currentTask = peek(taskQueue);\n\n  while (currentTask !== null && !(enableSchedulerDebugging )) {\n    if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {\n      // This currentTask hasn't expired, and we've reached the deadline.\n      break;\n    }\n\n    var callback = currentTask.callback;\n\n    if (callback !== null) {\n      currentTask.callback = null;\n      currentPriorityLevel = currentTask.priorityLevel;\n      var didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n      markTaskRun(currentTask, currentTime);\n      var continuationCallback = callback(didUserCallbackTimeout);\n      currentTime = exports.unstable_now();\n\n      if (typeof continuationCallback === 'function') {\n        currentTask.callback = continuationCallback;\n        markTaskYield(currentTask, currentTime);\n      } else {\n        {\n          markTaskCompleted(currentTask, currentTime);\n          currentTask.isQueued = false;\n        }\n\n        if (currentTask === peek(taskQueue)) {\n          pop(taskQueue);\n        }\n      }\n\n      advanceTimers(currentTime);\n    } else {\n      pop(taskQueue);\n    }\n\n    currentTask = peek(taskQueue);\n  } // Return whether there's additional work\n\n\n  if (currentTask !== null) {\n    return true;\n  } else {\n    var firstTimer = peek(timerQueue);\n\n    if (firstTimer !== null) {\n      requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n    }\n\n    return false;\n  }\n}\n\nfunction unstable_runWithPriority(priorityLevel, eventHandler) {\n  switch (priorityLevel) {\n    case ImmediatePriority:\n    case UserBlockingPriority:\n    case NormalPriority:\n    case LowPriority:\n    case IdlePriority:\n      break;\n\n    default:\n      priorityLevel = NormalPriority;\n  }\n\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n}\n\nfunction unstable_next(eventHandler) {\n  var priorityLevel;\n\n  switch (currentPriorityLevel) {\n    case ImmediatePriority:\n    case UserBlockingPriority:\n    case NormalPriority:\n      // Shift down to normal priority\n      priorityLevel = NormalPriority;\n      break;\n\n    default:\n      // Anything lower than normal priority should remain at the current level.\n      priorityLevel = currentPriorityLevel;\n      break;\n  }\n\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n}\n\nfunction unstable_wrapCallback(callback) {\n  var parentPriorityLevel = currentPriorityLevel;\n  return function () {\n    // This is a fork of runWithPriority, inlined for performance.\n    var previousPriorityLevel = currentPriorityLevel;\n    currentPriorityLevel = parentPriorityLevel;\n\n    try {\n      return callback.apply(this, arguments);\n    } finally {\n      currentPriorityLevel = previousPriorityLevel;\n    }\n  };\n}\n\nfunction timeoutForPriorityLevel(priorityLevel) {\n  switch (priorityLevel) {\n    case ImmediatePriority:\n      return IMMEDIATE_PRIORITY_TIMEOUT;\n\n    case UserBlockingPriority:\n      return USER_BLOCKING_PRIORITY;\n\n    case IdlePriority:\n      return IDLE_PRIORITY;\n\n    case LowPriority:\n      return LOW_PRIORITY_TIMEOUT;\n\n    case NormalPriority:\n    default:\n      return NORMAL_PRIORITY_TIMEOUT;\n  }\n}\n\nfunction unstable_scheduleCallback(priorityLevel, callback, options) {\n  var currentTime = exports.unstable_now();\n  var startTime;\n  var timeout;\n\n  if (typeof options === 'object' && options !== null) {\n    var delay = options.delay;\n\n    if (typeof delay === 'number' && delay > 0) {\n      startTime = currentTime + delay;\n    } else {\n      startTime = currentTime;\n    }\n\n    timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel);\n  } else {\n    timeout = timeoutForPriorityLevel(priorityLevel);\n    startTime = currentTime;\n  }\n\n  var expirationTime = startTime + timeout;\n  var newTask = {\n    id: taskIdCounter++,\n    callback: callback,\n    priorityLevel: priorityLevel,\n    startTime: startTime,\n    expirationTime: expirationTime,\n    sortIndex: -1\n  };\n\n  {\n    newTask.isQueued = false;\n  }\n\n  if (startTime > currentTime) {\n    // This is a delayed task.\n    newTask.sortIndex = startTime;\n    push(timerQueue, newTask);\n\n    if (peek(taskQueue) === null && newTask === peek(timerQueue)) {\n      // All tasks are delayed, and this is the task with the earliest delay.\n      if (isHostTimeoutScheduled) {\n        // Cancel an existing timeout.\n        cancelHostTimeout();\n      } else {\n        isHostTimeoutScheduled = true;\n      } // Schedule a timeout.\n\n\n      requestHostTimeout(handleTimeout, startTime - currentTime);\n    }\n  } else {\n    newTask.sortIndex = expirationTime;\n    push(taskQueue, newTask);\n\n    {\n      markTaskStart(newTask, currentTime);\n      newTask.isQueued = true;\n    } // Schedule a host callback, if needed. If we're already performing work,\n    // wait until the next time we yield.\n\n\n    if (!isHostCallbackScheduled && !isPerformingWork) {\n      isHostCallbackScheduled = true;\n      requestHostCallback(flushWork);\n    }\n  }\n\n  return newTask;\n}\n\nfunction unstable_pauseExecution() {\n}\n\nfunction unstable_continueExecution() {\n\n  if (!isHostCallbackScheduled && !isPerformingWork) {\n    isHostCallbackScheduled = true;\n    requestHostCallback(flushWork);\n  }\n}\n\nfunction unstable_getFirstCallbackNode() {\n  return peek(taskQueue);\n}\n\nfunction unstable_cancelCallback(task) {\n  {\n    if (task.isQueued) {\n      var currentTime = exports.unstable_now();\n      markTaskCanceled(task, currentTime);\n      task.isQueued = false;\n    }\n  } // Null out the callback to indicate the task has been canceled. (Can't\n  // remove from the queue because you can't remove arbitrary nodes from an\n  // array based heap, only the first one.)\n\n\n  task.callback = null;\n}\n\nfunction unstable_getCurrentPriorityLevel() {\n  return currentPriorityLevel;\n}\n\nfunction unstable_shouldYield() {\n  var currentTime = exports.unstable_now();\n  advanceTimers(currentTime);\n  var firstTask = peek(taskQueue);\n  return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost();\n}\n\nvar unstable_requestPaint = requestPaint;\nvar unstable_Profiling =  {\n  startLoggingProfilingEvents: startLoggingProfilingEvents,\n  stopLoggingProfilingEvents: stopLoggingProfilingEvents,\n  sharedProfilingBuffer: sharedProfilingBuffer\n} ;\n\nexports.unstable_IdlePriority = IdlePriority;\nexports.unstable_ImmediatePriority = ImmediatePriority;\nexports.unstable_LowPriority = LowPriority;\nexports.unstable_NormalPriority = NormalPriority;\nexports.unstable_Profiling = unstable_Profiling;\nexports.unstable_UserBlockingPriority = UserBlockingPriority;\nexports.unstable_cancelCallback = unstable_cancelCallback;\nexports.unstable_continueExecution = unstable_continueExecution;\nexports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;\nexports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode;\nexports.unstable_next = unstable_next;\nexports.unstable_pauseExecution = unstable_pauseExecution;\nexports.unstable_requestPaint = unstable_requestPaint;\nexports.unstable_runWithPriority = unstable_runWithPriority;\nexports.unstable_scheduleCallback = unstable_scheduleCallback;\nexports.unstable_shouldYield = unstable_shouldYield;\nexports.unstable_wrapCallback = unstable_wrapCallback;\n  })();\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/cjs/scheduler.development.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/scheduler/index.js":
+/*!*****************************************************!*\
+  !*** ./jaas-client/node_modules/scheduler/index.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/scheduler.development.js */ \"./jaas-client/node_modules/scheduler/cjs/scheduler.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/scheduler/tracing.js":
+/*!*******************************************************!*\
+  !*** ./jaas-client/node_modules/scheduler/tracing.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/scheduler-tracing.development.js */ \"./jaas-client/node_modules/scheduler/cjs/scheduler-tracing.development.js\");\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/scheduler/tracing.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-client/lib/index.js":
+/*!****************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-client/lib/index.js ***!
+  \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\n/**\n * Module dependencies.\n */\n\nvar url = __webpack_require__(/*! ./url */ \"./jaas-client/node_modules/socket.io-client/lib/url.js\");\nvar parser = __webpack_require__(/*! socket.io-parser */ \"./jaas-client/node_modules/socket.io-parser/index.js\");\nvar Manager = __webpack_require__(/*! ./manager */ \"./jaas-client/node_modules/socket.io-client/lib/manager.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = lookup;\n\n/**\n * Managers cache.\n */\n\nvar cache = exports.managers = {};\n\n/**\n * Looks up an existing `Manager` for multiplexing.\n * If the user summons:\n *\n *   `io('http://localhost/a');`\n *   `io('http://localhost/b');`\n *\n * We reuse the existing instance based on same scheme/port/host,\n * and we initialize sockets for each namespace.\n *\n * @api public\n */\n\nfunction lookup (uri, opts) {\n  if (typeof uri === 'object') {\n    opts = uri;\n    uri = undefined;\n  }\n\n  opts = opts || {};\n\n  var parsed = url(uri);\n  var source = parsed.source;\n  var id = parsed.id;\n  var path = parsed.path;\n  var sameNamespace = cache[id] && path in cache[id].nsps;\n  var newConnection = opts.forceNew || opts['force new connection'] ||\n                      false === opts.multiplex || sameNamespace;\n\n  var io;\n\n  if (newConnection) {\n    debug('ignoring socket cache for %s', source);\n    io = Manager(source, opts);\n  } else {\n    if (!cache[id]) {\n      debug('new io instance for %s', source);\n      cache[id] = Manager(source, opts);\n    }\n    io = cache[id];\n  }\n  if (parsed.query && !opts.query) {\n    opts.query = parsed.query;\n  }\n  return io.socket(parsed.path, opts);\n}\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = parser.protocol;\n\n/**\n * `connect`.\n *\n * @param {String} uri\n * @api public\n */\n\nexports.connect = lookup;\n\n/**\n * Expose constructors for standalone build.\n *\n * @api public\n */\n\nexports.Manager = __webpack_require__(/*! ./manager */ \"./jaas-client/node_modules/socket.io-client/lib/manager.js\");\nexports.Socket = __webpack_require__(/*! ./socket */ \"./jaas-client/node_modules/socket.io-client/lib/socket.js\");\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-client/lib/manager.js":
+/*!******************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-client/lib/manager.js ***!
+  \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\n/**\n * Module dependencies.\n */\n\nvar eio = __webpack_require__(/*! engine.io-client */ \"./jaas-client/node_modules/engine.io-client/lib/index.js\");\nvar Socket = __webpack_require__(/*! ./socket */ \"./jaas-client/node_modules/socket.io-client/lib/socket.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js\");\nvar parser = __webpack_require__(/*! socket.io-parser */ \"./jaas-client/node_modules/socket.io-parser/index.js\");\nvar on = __webpack_require__(/*! ./on */ \"./jaas-client/node_modules/socket.io-client/lib/on.js\");\nvar bind = __webpack_require__(/*! component-bind */ \"./jaas-client/node_modules/component-bind/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client:manager');\nvar indexOf = __webpack_require__(/*! indexof */ \"./jaas-client/node_modules/indexof/index.js\");\nvar Backoff = __webpack_require__(/*! backo2 */ \"./jaas-client/node_modules/backo2/index.js\");\n\n/**\n * IE6+ hasOwnProperty\n */\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Module exports\n */\n\nmodule.exports = Manager;\n\n/**\n * `Manager` constructor.\n *\n * @param {String} engine instance or engine uri/opts\n * @param {Object} options\n * @api public\n */\n\nfunction Manager (uri, opts) {\n  if (!(this instanceof Manager)) return new Manager(uri, opts);\n  if (uri && ('object' === typeof uri)) {\n    opts = uri;\n    uri = undefined;\n  }\n  opts = opts || {};\n\n  opts.path = opts.path || '/socket.io';\n  this.nsps = {};\n  this.subs = [];\n  this.opts = opts;\n  this.reconnection(opts.reconnection !== false);\n  this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n  this.reconnectionDelay(opts.reconnectionDelay || 1000);\n  this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n  this.randomizationFactor(opts.randomizationFactor || 0.5);\n  this.backoff = new Backoff({\n    min: this.reconnectionDelay(),\n    max: this.reconnectionDelayMax(),\n    jitter: this.randomizationFactor()\n  });\n  this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n  this.readyState = 'closed';\n  this.uri = uri;\n  this.connecting = [];\n  this.lastPing = null;\n  this.encoding = false;\n  this.packetBuffer = [];\n  var _parser = opts.parser || parser;\n  this.encoder = new _parser.Encoder();\n  this.decoder = new _parser.Decoder();\n  this.autoConnect = opts.autoConnect !== false;\n  if (this.autoConnect) this.open();\n}\n\n/**\n * Propagate given event to sockets and emit on `this`\n *\n * @api private\n */\n\nManager.prototype.emitAll = function () {\n  this.emit.apply(this, arguments);\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);\n    }\n  }\n};\n\n/**\n * Update `socket.id` of all sockets\n *\n * @api private\n */\n\nManager.prototype.updateSocketIds = function () {\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].id = this.generateId(nsp);\n    }\n  }\n};\n\n/**\n * generate `socket.id` for the given `nsp`\n *\n * @param {String} nsp\n * @return {String}\n * @api private\n */\n\nManager.prototype.generateId = function (nsp) {\n  return (nsp === '/' ? '' : (nsp + '#')) + this.engine.id;\n};\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Manager.prototype);\n\n/**\n * Sets the `reconnection` config.\n *\n * @param {Boolean} true/false if it should automatically reconnect\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnection = function (v) {\n  if (!arguments.length) return this._reconnection;\n  this._reconnection = !!v;\n  return this;\n};\n\n/**\n * Sets the reconnection attempts config.\n *\n * @param {Number} max reconnection attempts before giving up\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionAttempts = function (v) {\n  if (!arguments.length) return this._reconnectionAttempts;\n  this._reconnectionAttempts = v;\n  return this;\n};\n\n/**\n * Sets the delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelay = function (v) {\n  if (!arguments.length) return this._reconnectionDelay;\n  this._reconnectionDelay = v;\n  this.backoff && this.backoff.setMin(v);\n  return this;\n};\n\nManager.prototype.randomizationFactor = function (v) {\n  if (!arguments.length) return this._randomizationFactor;\n  this._randomizationFactor = v;\n  this.backoff && this.backoff.setJitter(v);\n  return this;\n};\n\n/**\n * Sets the maximum delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelayMax = function (v) {\n  if (!arguments.length) return this._reconnectionDelayMax;\n  this._reconnectionDelayMax = v;\n  this.backoff && this.backoff.setMax(v);\n  return this;\n};\n\n/**\n * Sets the connection timeout. `false` to disable\n *\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.timeout = function (v) {\n  if (!arguments.length) return this._timeout;\n  this._timeout = v;\n  return this;\n};\n\n/**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @api private\n */\n\nManager.prototype.maybeReconnectOnOpen = function () {\n  // Only try to reconnect if it's the first time we're connecting\n  if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {\n    // keeps reconnection from firing twice for the same reconnection loop\n    this.reconnect();\n  }\n};\n\n/**\n * Sets the current transport `socket`.\n *\n * @param {Function} optional, callback\n * @return {Manager} self\n * @api public\n */\n\nManager.prototype.open =\nManager.prototype.connect = function (fn, opts) {\n  debug('readyState %s', this.readyState);\n  if (~this.readyState.indexOf('open')) return this;\n\n  debug('opening %s', this.uri);\n  this.engine = eio(this.uri, this.opts);\n  var socket = this.engine;\n  var self = this;\n  this.readyState = 'opening';\n  this.skipReconnect = false;\n\n  // emit `open`\n  var openSub = on(socket, 'open', function () {\n    self.onopen();\n    fn && fn();\n  });\n\n  // emit `connect_error`\n  var errorSub = on(socket, 'error', function (data) {\n    debug('connect_error');\n    self.cleanup();\n    self.readyState = 'closed';\n    self.emitAll('connect_error', data);\n    if (fn) {\n      var err = new Error('Connection error');\n      err.data = data;\n      fn(err);\n    } else {\n      // Only do this if there is no fn to handle the error\n      self.maybeReconnectOnOpen();\n    }\n  });\n\n  // emit `connect_timeout`\n  if (false !== this._timeout) {\n    var timeout = this._timeout;\n    debug('connect attempt will timeout after %d', timeout);\n\n    // set timer\n    var timer = setTimeout(function () {\n      debug('connect attempt timed out after %d', timeout);\n      openSub.destroy();\n      socket.close();\n      socket.emit('error', 'timeout');\n      self.emitAll('connect_timeout', timeout);\n    }, timeout);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n\n  this.subs.push(openSub);\n  this.subs.push(errorSub);\n\n  return this;\n};\n\n/**\n * Called upon transport open.\n *\n * @api private\n */\n\nManager.prototype.onopen = function () {\n  debug('open');\n\n  // clear old subs\n  this.cleanup();\n\n  // mark as open\n  this.readyState = 'open';\n  this.emit('open');\n\n  // add new subs\n  var socket = this.engine;\n  this.subs.push(on(socket, 'data', bind(this, 'ondata')));\n  this.subs.push(on(socket, 'ping', bind(this, 'onping')));\n  this.subs.push(on(socket, 'pong', bind(this, 'onpong')));\n  this.subs.push(on(socket, 'error', bind(this, 'onerror')));\n  this.subs.push(on(socket, 'close', bind(this, 'onclose')));\n  this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));\n};\n\n/**\n * Called upon a ping.\n *\n * @api private\n */\n\nManager.prototype.onping = function () {\n  this.lastPing = new Date();\n  this.emitAll('ping');\n};\n\n/**\n * Called upon a packet.\n *\n * @api private\n */\n\nManager.prototype.onpong = function () {\n  this.emitAll('pong', new Date() - this.lastPing);\n};\n\n/**\n * Called with data.\n *\n * @api private\n */\n\nManager.prototype.ondata = function (data) {\n  this.decoder.add(data);\n};\n\n/**\n * Called when parser fully decodes a packet.\n *\n * @api private\n */\n\nManager.prototype.ondecoded = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon socket error.\n *\n * @api private\n */\n\nManager.prototype.onerror = function (err) {\n  debug('error', err);\n  this.emitAll('error', err);\n};\n\n/**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @api public\n */\n\nManager.prototype.socket = function (nsp, opts) {\n  var socket = this.nsps[nsp];\n  if (!socket) {\n    socket = new Socket(this, nsp, opts);\n    this.nsps[nsp] = socket;\n    var self = this;\n    socket.on('connecting', onConnecting);\n    socket.on('connect', function () {\n      socket.id = self.generateId(nsp);\n    });\n\n    if (this.autoConnect) {\n      // manually call here since connecting event is fired before listening\n      onConnecting();\n    }\n  }\n\n  function onConnecting () {\n    if (!~indexOf(self.connecting, socket)) {\n      self.connecting.push(socket);\n    }\n  }\n\n  return socket;\n};\n\n/**\n * Called upon a socket close.\n *\n * @param {Socket} socket\n */\n\nManager.prototype.destroy = function (socket) {\n  var index = indexOf(this.connecting, socket);\n  if (~index) this.connecting.splice(index, 1);\n  if (this.connecting.length) return;\n\n  this.close();\n};\n\n/**\n * Writes a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nManager.prototype.packet = function (packet) {\n  debug('writing packet %j', packet);\n  var self = this;\n  if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;\n\n  if (!self.encoding) {\n    // encode, then write to engine with result\n    self.encoding = true;\n    this.encoder.encode(packet, function (encodedPackets) {\n      for (var i = 0; i < encodedPackets.length; i++) {\n        self.engine.write(encodedPackets[i], packet.options);\n      }\n      self.encoding = false;\n      self.processPacketQueue();\n    });\n  } else { // add packet to the queue\n    self.packetBuffer.push(packet);\n  }\n};\n\n/**\n * If packet buffer is non-empty, begins encoding the\n * next packet in line.\n *\n * @api private\n */\n\nManager.prototype.processPacketQueue = function () {\n  if (this.packetBuffer.length > 0 && !this.encoding) {\n    var pack = this.packetBuffer.shift();\n    this.packet(pack);\n  }\n};\n\n/**\n * Clean up transport subscriptions and packet buffer.\n *\n * @api private\n */\n\nManager.prototype.cleanup = function () {\n  debug('cleanup');\n\n  var subsLength = this.subs.length;\n  for (var i = 0; i < subsLength; i++) {\n    var sub = this.subs.shift();\n    sub.destroy();\n  }\n\n  this.packetBuffer = [];\n  this.encoding = false;\n  this.lastPing = null;\n\n  this.decoder.destroy();\n};\n\n/**\n * Close the current socket.\n *\n * @api private\n */\n\nManager.prototype.close =\nManager.prototype.disconnect = function () {\n  debug('disconnect');\n  this.skipReconnect = true;\n  this.reconnecting = false;\n  if ('opening' === this.readyState) {\n    // `onclose` will not fire because\n    // an open event never happened\n    this.cleanup();\n  }\n  this.backoff.reset();\n  this.readyState = 'closed';\n  if (this.engine) this.engine.close();\n};\n\n/**\n * Called upon engine close.\n *\n * @api private\n */\n\nManager.prototype.onclose = function (reason) {\n  debug('onclose');\n\n  this.cleanup();\n  this.backoff.reset();\n  this.readyState = 'closed';\n  this.emit('close', reason);\n\n  if (this._reconnection && !this.skipReconnect) {\n    this.reconnect();\n  }\n};\n\n/**\n * Attempt a reconnection.\n *\n * @api private\n */\n\nManager.prototype.reconnect = function () {\n  if (this.reconnecting || this.skipReconnect) return this;\n\n  var self = this;\n\n  if (this.backoff.attempts >= this._reconnectionAttempts) {\n    debug('reconnect failed');\n    this.backoff.reset();\n    this.emitAll('reconnect_failed');\n    this.reconnecting = false;\n  } else {\n    var delay = this.backoff.duration();\n    debug('will wait %dms before reconnect attempt', delay);\n\n    this.reconnecting = true;\n    var timer = setTimeout(function () {\n      if (self.skipReconnect) return;\n\n      debug('attempting reconnect');\n      self.emitAll('reconnect_attempt', self.backoff.attempts);\n      self.emitAll('reconnecting', self.backoff.attempts);\n\n      // check again for the case socket closed in above events\n      if (self.skipReconnect) return;\n\n      self.open(function (err) {\n        if (err) {\n          debug('reconnect attempt error');\n          self.reconnecting = false;\n          self.reconnect();\n          self.emitAll('reconnect_error', err.data);\n        } else {\n          debug('reconnect success');\n          self.onreconnect();\n        }\n      });\n    }, delay);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n};\n\n/**\n * Called upon successful reconnect.\n *\n * @api private\n */\n\nManager.prototype.onreconnect = function () {\n  var attempt = this.backoff.attempts;\n  this.reconnecting = false;\n  this.backoff.reset();\n  this.updateSocketIds();\n  this.emitAll('reconnect', attempt);\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/manager.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-client/lib/on.js":
+/*!*************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-client/lib/on.js ***!
+  \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("\n/**\n * Module exports.\n */\n\nmodule.exports = on;\n\n/**\n * Helper for subscriptions.\n *\n * @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`\n * @param {String} event name\n * @param {Function} callback\n * @api public\n */\n\nfunction on (obj, ev, fn) {\n  obj.on(ev, fn);\n  return {\n    destroy: function () {\n      obj.removeListener(ev, fn);\n    }\n  };\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/on.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-client/lib/socket.js":
+/*!*****************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-client/lib/socket.js ***!
+  \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\n/**\n * Module dependencies.\n */\n\nvar parser = __webpack_require__(/*! socket.io-parser */ \"./jaas-client/node_modules/socket.io-parser/index.js\");\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js\");\nvar toArray = __webpack_require__(/*! to-array */ \"./jaas-client/node_modules/to-array/index.js\");\nvar on = __webpack_require__(/*! ./on */ \"./jaas-client/node_modules/socket.io-client/lib/on.js\");\nvar bind = __webpack_require__(/*! component-bind */ \"./jaas-client/node_modules/component-bind/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client:socket');\nvar parseqs = __webpack_require__(/*! parseqs */ \"./jaas-client/node_modules/parseqs/index.js\");\nvar hasBin = __webpack_require__(/*! has-binary2 */ \"./jaas-client/node_modules/has-binary2/index.js\");\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = Socket;\n\n/**\n * Internal events (blacklisted).\n * These events can't be emitted by the user.\n *\n * @api private\n */\n\nvar events = {\n  connect: 1,\n  connect_error: 1,\n  connect_timeout: 1,\n  connecting: 1,\n  disconnect: 1,\n  error: 1,\n  reconnect: 1,\n  reconnect_attempt: 1,\n  reconnect_failed: 1,\n  reconnect_error: 1,\n  reconnecting: 1,\n  ping: 1,\n  pong: 1\n};\n\n/**\n * Shortcut to `Emitter#emit`.\n */\n\nvar emit = Emitter.prototype.emit;\n\n/**\n * `Socket` constructor.\n *\n * @api public\n */\n\nfunction Socket (io, nsp, opts) {\n  this.io = io;\n  this.nsp = nsp;\n  this.json = this; // compat\n  this.ids = 0;\n  this.acks = {};\n  this.receiveBuffer = [];\n  this.sendBuffer = [];\n  this.connected = false;\n  this.disconnected = true;\n  this.flags = {};\n  if (opts && opts.query) {\n    this.query = opts.query;\n  }\n  if (this.io.autoConnect) this.open();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Subscribe to open, close and packet events\n *\n * @api private\n */\n\nSocket.prototype.subEvents = function () {\n  if (this.subs) return;\n\n  var io = this.io;\n  this.subs = [\n    on(io, 'open', bind(this, 'onopen')),\n    on(io, 'packet', bind(this, 'onpacket')),\n    on(io, 'close', bind(this, 'onclose'))\n  ];\n};\n\n/**\n * \"Opens\" the socket.\n *\n * @api public\n */\n\nSocket.prototype.open =\nSocket.prototype.connect = function () {\n  if (this.connected) return this;\n\n  this.subEvents();\n  this.io.open(); // ensure open\n  if ('open' === this.io.readyState) this.onopen();\n  this.emit('connecting');\n  return this;\n};\n\n/**\n * Sends a `message` event.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.send = function () {\n  var args = toArray(arguments);\n  args.unshift('message');\n  this.emit.apply(this, args);\n  return this;\n};\n\n/**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @param {String} event name\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.emit = function (ev) {\n  if (events.hasOwnProperty(ev)) {\n    emit.apply(this, arguments);\n    return this;\n  }\n\n  var args = toArray(arguments);\n  var packet = {\n    type: (this.flags.binary !== undefined ? this.flags.binary : hasBin(args)) ? parser.BINARY_EVENT : parser.EVENT,\n    data: args\n  };\n\n  packet.options = {};\n  packet.options.compress = !this.flags || false !== this.flags.compress;\n\n  // event ack callback\n  if ('function' === typeof args[args.length - 1]) {\n    debug('emitting packet with ack id %d', this.ids);\n    this.acks[this.ids] = args.pop();\n    packet.id = this.ids++;\n  }\n\n  if (this.connected) {\n    this.packet(packet);\n  } else {\n    this.sendBuffer.push(packet);\n  }\n\n  this.flags = {};\n\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.packet = function (packet) {\n  packet.nsp = this.nsp;\n  this.io.packet(packet);\n};\n\n/**\n * Called upon engine `open`.\n *\n * @api private\n */\n\nSocket.prototype.onopen = function () {\n  debug('transport is open - connecting');\n\n  // write connect packet if necessary\n  if ('/' !== this.nsp) {\n    if (this.query) {\n      var query = typeof this.query === 'object' ? parseqs.encode(this.query) : this.query;\n      debug('sending connect packet with query %s', query);\n      this.packet({type: parser.CONNECT, query: query});\n    } else {\n      this.packet({type: parser.CONNECT});\n    }\n  }\n};\n\n/**\n * Called upon engine `close`.\n *\n * @param {String} reason\n * @api private\n */\n\nSocket.prototype.onclose = function (reason) {\n  debug('close (%s)', reason);\n  this.connected = false;\n  this.disconnected = true;\n  delete this.id;\n  this.emit('disconnect', reason);\n};\n\n/**\n * Called with socket packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onpacket = function (packet) {\n  var sameNamespace = packet.nsp === this.nsp;\n  var rootNamespaceError = packet.type === parser.ERROR && packet.nsp === '/';\n\n  if (!sameNamespace && !rootNamespaceError) return;\n\n  switch (packet.type) {\n    case parser.CONNECT:\n      this.onconnect();\n      break;\n\n    case parser.EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.BINARY_EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.ACK:\n      this.onack(packet);\n      break;\n\n    case parser.BINARY_ACK:\n      this.onack(packet);\n      break;\n\n    case parser.DISCONNECT:\n      this.ondisconnect();\n      break;\n\n    case parser.ERROR:\n      this.emit('error', packet.data);\n      break;\n  }\n};\n\n/**\n * Called upon a server event.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onevent = function (packet) {\n  var args = packet.data || [];\n  debug('emitting event %j', args);\n\n  if (null != packet.id) {\n    debug('attaching ack callback to event');\n    args.push(this.ack(packet.id));\n  }\n\n  if (this.connected) {\n    emit.apply(this, args);\n  } else {\n    this.receiveBuffer.push(args);\n  }\n};\n\n/**\n * Produces an ack callback to emit with an event.\n *\n * @api private\n */\n\nSocket.prototype.ack = function (id) {\n  var self = this;\n  var sent = false;\n  return function () {\n    // prevent double callbacks\n    if (sent) return;\n    sent = true;\n    var args = toArray(arguments);\n    debug('sending ack %j', args);\n\n    self.packet({\n      type: hasBin(args) ? parser.BINARY_ACK : parser.ACK,\n      id: id,\n      data: args\n    });\n  };\n};\n\n/**\n * Called upon a server acknowlegement.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onack = function (packet) {\n  var ack = this.acks[packet.id];\n  if ('function' === typeof ack) {\n    debug('calling ack %s with %j', packet.id, packet.data);\n    ack.apply(this, packet.data);\n    delete this.acks[packet.id];\n  } else {\n    debug('bad ack %s', packet.id);\n  }\n};\n\n/**\n * Called upon server connect.\n *\n * @api private\n */\n\nSocket.prototype.onconnect = function () {\n  this.connected = true;\n  this.disconnected = false;\n  this.emit('connect');\n  this.emitBuffered();\n};\n\n/**\n * Emit buffered events (received and emitted).\n *\n * @api private\n */\n\nSocket.prototype.emitBuffered = function () {\n  var i;\n  for (i = 0; i < this.receiveBuffer.length; i++) {\n    emit.apply(this, this.receiveBuffer[i]);\n  }\n  this.receiveBuffer = [];\n\n  for (i = 0; i < this.sendBuffer.length; i++) {\n    this.packet(this.sendBuffer[i]);\n  }\n  this.sendBuffer = [];\n};\n\n/**\n * Called upon server disconnect.\n *\n * @api private\n */\n\nSocket.prototype.ondisconnect = function () {\n  debug('server disconnect (%s)', this.nsp);\n  this.destroy();\n  this.onclose('io server disconnect');\n};\n\n/**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @api private.\n */\n\nSocket.prototype.destroy = function () {\n  if (this.subs) {\n    // clean subscriptions to avoid reconnections\n    for (var i = 0; i < this.subs.length; i++) {\n      this.subs[i].destroy();\n    }\n    this.subs = null;\n  }\n\n  this.io.destroy(this);\n};\n\n/**\n * Disconnects the socket manually.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.close =\nSocket.prototype.disconnect = function () {\n  if (this.connected) {\n    debug('performing disconnect (%s)', this.nsp);\n    this.packet({ type: parser.DISCONNECT });\n  }\n\n  // remove socket from pool\n  this.destroy();\n\n  if (this.connected) {\n    // fire events\n    this.onclose('io client disconnect');\n  }\n  return this;\n};\n\n/**\n * Sets the compress flag.\n *\n * @param {Boolean} if `true`, compresses the sending data\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.compress = function (compress) {\n  this.flags.compress = compress;\n  return this;\n};\n\n/**\n * Sets the binary flag\n *\n * @param {Boolean} whether the emitted data contains binary\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.binary = function (binary) {\n  this.flags.binary = binary;\n  return this;\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/socket.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-client/lib/url.js":
+/*!**************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-client/lib/url.js ***!
+  \**************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\n/**\n * Module dependencies.\n */\n\nvar parseuri = __webpack_require__(/*! parseuri */ \"./jaas-client/node_modules/parseuri/index.js\");\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/debug/src/browser.js\")('socket.io-client:url');\n\n/**\n * Module exports.\n */\n\nmodule.exports = url;\n\n/**\n * URL parser.\n *\n * @param {String} url\n * @param {Object} An object meant to mimic window.location.\n *                 Defaults to window.location.\n * @api public\n */\n\nfunction url (uri, loc) {\n  var obj = uri;\n\n  // default to window.location\n  loc = loc || (typeof location !== 'undefined' && location);\n  if (null == uri) uri = loc.protocol + '//' + loc.host;\n\n  // relative path support\n  if ('string' === typeof uri) {\n    if ('/' === uri.charAt(0)) {\n      if ('/' === uri.charAt(1)) {\n        uri = loc.protocol + uri;\n      } else {\n        uri = loc.host + uri;\n      }\n    }\n\n    if (!/^(https?|wss?):\\/\\//.test(uri)) {\n      debug('protocol-less url %s', uri);\n      if ('undefined' !== typeof loc) {\n        uri = loc.protocol + '//' + uri;\n      } else {\n        uri = 'https://' + uri;\n      }\n    }\n\n    // parse\n    debug('parse %s', uri);\n    obj = parseuri(uri);\n  }\n\n  // make sure we treat `localhost:80` and `localhost` equally\n  if (!obj.port) {\n    if (/^(http|ws)$/.test(obj.protocol)) {\n      obj.port = '80';\n    } else if (/^(http|ws)s$/.test(obj.protocol)) {\n      obj.port = '443';\n    }\n  }\n\n  obj.path = obj.path || '/';\n\n  var ipv6 = obj.host.indexOf(':') !== -1;\n  var host = ipv6 ? '[' + obj.host + ']' : obj.host;\n\n  // define unique id\n  obj.id = obj.protocol + '://' + host + ':' + obj.port;\n  // define href\n  obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : (':' + obj.port));\n\n  return obj;\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/lib/url.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js":
+/*!*******************************************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js ***!
+  \*******************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (true) {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  var args = [].slice.call(arguments, 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-client/node_modules/component-emitter/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-parser/binary.js":
+/*!*************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-parser/binary.js ***!
+  \*************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/*global Blob,File*/\n\n/**\n * Module requirements\n */\n\nvar isArray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js\");\nvar isBuf = __webpack_require__(/*! ./is-buffer */ \"./jaas-client/node_modules/socket.io-parser/is-buffer.js\");\nvar toString = Object.prototype.toString;\nvar withNativeBlob = typeof Blob === 'function' || (typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]');\nvar withNativeFile = typeof File === 'function' || (typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]');\n\n/**\n * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.\n * Anything with blobs or files should be fed through removeBlobs before coming\n * here.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @api public\n */\n\nexports.deconstructPacket = function(packet) {\n  var buffers = [];\n  var packetData = packet.data;\n  var pack = packet;\n  pack.data = _deconstructPacket(packetData, buffers);\n  pack.attachments = buffers.length; // number of binary 'attachments'\n  return {packet: pack, buffers: buffers};\n};\n\nfunction _deconstructPacket(data, buffers) {\n  if (!data) return data;\n\n  if (isBuf(data)) {\n    var placeholder = { _placeholder: true, num: buffers.length };\n    buffers.push(data);\n    return placeholder;\n  } else if (isArray(data)) {\n    var newData = new Array(data.length);\n    for (var i = 0; i < data.length; i++) {\n      newData[i] = _deconstructPacket(data[i], buffers);\n    }\n    return newData;\n  } else if (typeof data === 'object' && !(data instanceof Date)) {\n    var newData = {};\n    for (var key in data) {\n      newData[key] = _deconstructPacket(data[key], buffers);\n    }\n    return newData;\n  }\n  return data;\n}\n\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @api public\n */\n\nexports.reconstructPacket = function(packet, buffers) {\n  packet.data = _reconstructPacket(packet.data, buffers);\n  packet.attachments = undefined; // no longer useful\n  return packet;\n};\n\nfunction _reconstructPacket(data, buffers) {\n  if (!data) return data;\n\n  if (data && data._placeholder) {\n    return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n  } else if (isArray(data)) {\n    for (var i = 0; i < data.length; i++) {\n      data[i] = _reconstructPacket(data[i], buffers);\n    }\n  } else if (typeof data === 'object') {\n    for (var key in data) {\n      data[key] = _reconstructPacket(data[key], buffers);\n    }\n  }\n\n  return data;\n}\n\n/**\n * Asynchronously removes Blobs or Files from data via\n * FileReader's readAsArrayBuffer method. Used before encoding\n * data as msgpack. Calls callback with the blobless data.\n *\n * @param {Object} data\n * @param {Function} callback\n * @api private\n */\n\nexports.removeBlobs = function(data, callback) {\n  function _removeBlobs(obj, curKey, containingObject) {\n    if (!obj) return obj;\n\n    // convert any blob\n    if ((withNativeBlob && obj instanceof Blob) ||\n        (withNativeFile && obj instanceof File)) {\n      pendingBlobs++;\n\n      // async filereader\n      var fileReader = new FileReader();\n      fileReader.onload = function() { // this.result == arraybuffer\n        if (containingObject) {\n          containingObject[curKey] = this.result;\n        }\n        else {\n          bloblessData = this.result;\n        }\n\n        // if nothing pending its callback time\n        if(! --pendingBlobs) {\n          callback(bloblessData);\n        }\n      };\n\n      fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer\n    } else if (isArray(obj)) { // handle array\n      for (var i = 0; i < obj.length; i++) {\n        _removeBlobs(obj[i], i, obj);\n      }\n    } else if (typeof obj === 'object' && !isBuf(obj)) { // and object\n      for (var key in obj) {\n        _removeBlobs(obj[key], key, obj);\n      }\n    }\n  }\n\n  var pendingBlobs = 0;\n  var bloblessData = data;\n  _removeBlobs(bloblessData);\n  if (!pendingBlobs) {\n    callback(bloblessData);\n  }\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/binary.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-parser/index.js":
+/*!************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-parser/index.js ***!
+  \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\n/**\n * Module dependencies.\n */\n\nvar debug = __webpack_require__(/*! debug */ \"./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js\")('socket.io-parser');\nvar Emitter = __webpack_require__(/*! component-emitter */ \"./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js\");\nvar binary = __webpack_require__(/*! ./binary */ \"./jaas-client/node_modules/socket.io-parser/binary.js\");\nvar isArray = __webpack_require__(/*! isarray */ \"./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js\");\nvar isBuf = __webpack_require__(/*! ./is-buffer */ \"./jaas-client/node_modules/socket.io-parser/is-buffer.js\");\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = 4;\n\n/**\n * Packet types.\n *\n * @api public\n */\n\nexports.types = [\n  'CONNECT',\n  'DISCONNECT',\n  'EVENT',\n  'ACK',\n  'ERROR',\n  'BINARY_EVENT',\n  'BINARY_ACK'\n];\n\n/**\n * Packet type `connect`.\n *\n * @api public\n */\n\nexports.CONNECT = 0;\n\n/**\n * Packet type `disconnect`.\n *\n * @api public\n */\n\nexports.DISCONNECT = 1;\n\n/**\n * Packet type `event`.\n *\n * @api public\n */\n\nexports.EVENT = 2;\n\n/**\n * Packet type `ack`.\n *\n * @api public\n */\n\nexports.ACK = 3;\n\n/**\n * Packet type `error`.\n *\n * @api public\n */\n\nexports.ERROR = 4;\n\n/**\n * Packet type 'binary event'\n *\n * @api public\n */\n\nexports.BINARY_EVENT = 5;\n\n/**\n * Packet type `binary ack`. For acks with binary arguments.\n *\n * @api public\n */\n\nexports.BINARY_ACK = 6;\n\n/**\n * Encoder constructor.\n *\n * @api public\n */\n\nexports.Encoder = Encoder;\n\n/**\n * Decoder constructor.\n *\n * @api public\n */\n\nexports.Decoder = Decoder;\n\n/**\n * A socket.io Encoder instance\n *\n * @api public\n */\n\nfunction Encoder() {}\n\nvar ERROR_PACKET = exports.ERROR + '\"encode error\"';\n\n/**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n * @param {Function} callback - function to handle encodings (likely engine.write)\n * @return Calls callback with Array of encodings\n * @api public\n */\n\nEncoder.prototype.encode = function(obj, callback){\n  debug('encoding packet %j', obj);\n\n  if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n    encodeAsBinary(obj, callback);\n  } else {\n    var encoding = encodeAsString(obj);\n    callback([encoding]);\n  }\n};\n\n/**\n * Encode packet as string.\n *\n * @param {Object} packet\n * @return {String} encoded\n * @api private\n */\n\nfunction encodeAsString(obj) {\n\n  // first is type\n  var str = '' + obj.type;\n\n  // attachments if we have them\n  if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n    str += obj.attachments + '-';\n  }\n\n  // if we have a namespace other than `/`\n  // we append it followed by a comma `,`\n  if (obj.nsp && '/' !== obj.nsp) {\n    str += obj.nsp + ',';\n  }\n\n  // immediately followed by the id\n  if (null != obj.id) {\n    str += obj.id;\n  }\n\n  // json data\n  if (null != obj.data) {\n    var payload = tryStringify(obj.data);\n    if (payload !== false) {\n      str += payload;\n    } else {\n      return ERROR_PACKET;\n    }\n  }\n\n  debug('encoded %j as %s', obj, str);\n  return str;\n}\n\nfunction tryStringify(str) {\n  try {\n    return JSON.stringify(str);\n  } catch(e){\n    return false;\n  }\n}\n\n/**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n *\n * @param {Object} packet\n * @return {Buffer} encoded\n * @api private\n */\n\nfunction encodeAsBinary(obj, callback) {\n\n  function writeEncoding(bloblessData) {\n    var deconstruction = binary.deconstructPacket(bloblessData);\n    var pack = encodeAsString(deconstruction.packet);\n    var buffers = deconstruction.buffers;\n\n    buffers.unshift(pack); // add packet info to beginning of data list\n    callback(buffers); // write all the buffers\n  }\n\n  binary.removeBlobs(obj, writeEncoding);\n}\n\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n * @api public\n */\n\nfunction Decoder() {\n  this.reconstructor = null;\n}\n\n/**\n * Mix in `Emitter` with Decoder.\n */\n\nEmitter(Decoder.prototype);\n\n/**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n * @return {Object} packet\n * @api public\n */\n\nDecoder.prototype.add = function(obj) {\n  var packet;\n  if (typeof obj === 'string') {\n    packet = decodeString(obj);\n    if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json\n      this.reconstructor = new BinaryReconstructor(packet);\n\n      // no attachments, labeled binary but no binary data to follow\n      if (this.reconstructor.reconPack.attachments === 0) {\n        this.emit('decoded', packet);\n      }\n    } else { // non-binary full packet\n      this.emit('decoded', packet);\n    }\n  } else if (isBuf(obj) || obj.base64) { // raw binary data\n    if (!this.reconstructor) {\n      throw new Error('got binary data when not reconstructing a packet');\n    } else {\n      packet = this.reconstructor.takeBinaryData(obj);\n      if (packet) { // received final buffer\n        this.reconstructor = null;\n        this.emit('decoded', packet);\n      }\n    }\n  } else {\n    throw new Error('Unknown type: ' + obj);\n  }\n};\n\n/**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n * @api private\n */\n\nfunction decodeString(str) {\n  var i = 0;\n  // look up type\n  var p = {\n    type: Number(str.charAt(0))\n  };\n\n  if (null == exports.types[p.type]) {\n    return error('unknown packet type ' + p.type);\n  }\n\n  // look up attachments if type binary\n  if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {\n    var buf = '';\n    while (str.charAt(++i) !== '-') {\n      buf += str.charAt(i);\n      if (i == str.length) break;\n    }\n    if (buf != Number(buf) || str.charAt(i) !== '-') {\n      throw new Error('Illegal attachments');\n    }\n    p.attachments = Number(buf);\n  }\n\n  // look up namespace (if any)\n  if ('/' === str.charAt(i + 1)) {\n    p.nsp = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (',' === c) break;\n      p.nsp += c;\n      if (i === str.length) break;\n    }\n  } else {\n    p.nsp = '/';\n  }\n\n  // look up id\n  var next = str.charAt(i + 1);\n  if ('' !== next && Number(next) == next) {\n    p.id = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (null == c || Number(c) != c) {\n        --i;\n        break;\n      }\n      p.id += str.charAt(i);\n      if (i === str.length) break;\n    }\n    p.id = Number(p.id);\n  }\n\n  // look up json data\n  if (str.charAt(++i)) {\n    var payload = tryParse(str.substr(i));\n    var isPayloadValid = payload !== false && (p.type === exports.ERROR || isArray(payload));\n    if (isPayloadValid) {\n      p.data = payload;\n    } else {\n      return error('invalid payload');\n    }\n  }\n\n  debug('decoded %s as %j', str, p);\n  return p;\n}\n\nfunction tryParse(str) {\n  try {\n    return JSON.parse(str);\n  } catch(e){\n    return false;\n  }\n}\n\n/**\n * Deallocates a parser's resources\n *\n * @api public\n */\n\nDecoder.prototype.destroy = function() {\n  if (this.reconstructor) {\n    this.reconstructor.finishedReconstruction();\n  }\n};\n\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n * @api private\n */\n\nfunction BinaryReconstructor(packet) {\n  this.reconPack = packet;\n  this.buffers = [];\n}\n\n/**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n *   a reconstructed packet object if all buffers have been received.\n * @api private\n */\n\nBinaryReconstructor.prototype.takeBinaryData = function(binData) {\n  this.buffers.push(binData);\n  if (this.buffers.length === this.reconPack.attachments) { // done with buffer list\n    var packet = binary.reconstructPacket(this.reconPack, this.buffers);\n    this.finishedReconstruction();\n    return packet;\n  }\n  return null;\n};\n\n/**\n * Cleans up binary packet reconstruction variables.\n *\n * @api private\n */\n\nBinaryReconstructor.prototype.finishedReconstruction = function() {\n  this.reconPack = null;\n  this.buffers = [];\n};\n\nfunction error(msg) {\n  return {\n    type: exports.ERROR,\n    data: 'parser error: ' + msg\n  };\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-parser/is-buffer.js":
+/*!****************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-parser/is-buffer.js ***!
+  \****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(Buffer) {\nmodule.exports = isBuf;\n\nvar withNativeBuffer = typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function';\nvar withNativeArrayBuffer = typeof ArrayBuffer === 'function';\n\nvar isView = function (obj) {\n  return typeof ArrayBuffer.isView === 'function' ? ArrayBuffer.isView(obj) : (obj.buffer instanceof ArrayBuffer);\n};\n\n/**\n * Returns true if obj is a buffer or an arraybuffer.\n *\n * @api private\n */\n\nfunction isBuf(obj) {\n  return (withNativeBuffer && Buffer.isBuffer(obj)) ||\n          (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj)));\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/buffer/index.js */ \"./node_modules/buffer/index.js\").Buffer))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/is-buffer.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js":
+/*!*******************************************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js ***!
+  \*******************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (true) {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  var args = [].slice.call(arguments, 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/component-emitter/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js":
+/*!*************************************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js ***!
+  \*************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(process) {/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = __webpack_require__(/*! ./debug */ \"./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js\");\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n  '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n  '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n  '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n  '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n  '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n  '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n  '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n  '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n  '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n  '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // NB: In an Electron preload script, document will be defined but not fully\n  // initialized. Since we know we're in Chrome, we'll just detect this case\n  // explicitly\n  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n    return true;\n  }\n\n  // Internet Explorer and Edge do not support colors.\n  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n    return false;\n  }\n\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n    // double check webkit in userAgent just in case we are in a worker\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  try {\n    return JSON.stringify(v);\n  } catch (err) {\n    return '[UnexpectedJSONParseError]: ' + err.message;\n  }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return;\n\n  var c = 'color: ' + this.color;\n  args.splice(1, 0, c, 'color: inherit')\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-zA-Z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = exports.storage.debug;\n  } catch(e) {}\n\n  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n  if (!r && typeof process !== 'undefined' && 'env' in process) {\n    r = process.env.DEBUG;\n  }\n\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../../node_modules/process/browser.js */ \"./node_modules/process/browser.js\")))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/browser.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js":
+/*!***********************************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js ***!
+  \***********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = __webpack_require__(/*! ms */ \"./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js\");\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n  var hash = 0, i;\n\n  for (i in namespace) {\n    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);\n    hash |= 0; // Convert to 32bit integer\n  }\n\n  return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n  var prevTime;\n\n  function debug() {\n    // disabled?\n    if (!debug.enabled) return;\n\n    var self = debug;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // turn the `arguments` into a proper Array\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %O\n      args.unshift('%O');\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    // apply env-specific formatting (colors, etc.)\n    exports.formatArgs.call(self, args);\n\n    var logFn = debug.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n\n  debug.namespace = namespace;\n  debug.enabled = exports.enabled(namespace);\n  debug.useColors = exports.useColors();\n  debug.color = selectColor(namespace);\n  debug.destroy = destroy;\n\n  // env-specific initialization logic for debug instances\n  if ('function' === typeof exports.init) {\n    exports.init(debug);\n  }\n\n  exports.instances.push(debug);\n\n  return debug;\n}\n\nfunction destroy () {\n  var index = exports.instances.indexOf(this);\n  if (index !== -1) {\n    exports.instances.splice(index, 1);\n    return true;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  exports.names = [];\n  exports.skips = [];\n\n  var i;\n  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n\n  for (i = 0; i < exports.instances.length; i++) {\n    var instance = exports.instances[i];\n    instance.enabled = exports.enabled(instance.namespace);\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  if (name[name.length - 1] === '*') {\n    return true;\n  }\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/debug/src/debug.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js":
+/*!*********************************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js ***!
+  \*********************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/isarray/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js ***!
+  \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isNaN(val) === false) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  if (ms >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (ms >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (ms >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (ms >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  return plural(ms, d, 'day') ||\n    plural(ms, h, 'hour') ||\n    plural(ms, m, 'minute') ||\n    plural(ms, s, 'second') ||\n    ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n  if (ms < n) {\n    return;\n  }\n  if (ms < n * 1.5) {\n    return Math.floor(ms / n) + ' ' + name;\n  }\n  return Math.ceil(ms / n) + ' ' + name + 's';\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/socket.io-parser/node_modules/ms/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/soundmanager2/script/soundmanager2.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/soundmanager2/script/soundmanager2.js ***!
+  \************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_RESULT__;/** @license\r\n *\r\n * SoundManager 2: JavaScript Sound for the Web\r\n * ----------------------------------------------\r\n * http://schillmania.com/projects/soundmanager2/\r\n *\r\n * Copyright (c) 2007, Scott Schiller. All rights reserved.\r\n * Code provided under the BSD License:\r\n * http://schillmania.com/projects/soundmanager2/license.txt\r\n *\r\n * V2.97a.20170601\r\n */\r\n\r\n/**\r\n * About this file\r\n * -------------------------------------------------------------------------------------\r\n * This is the fully-commented source version of the SoundManager 2 API,\r\n * recommended for use during development and testing.\r\n *\r\n * See soundmanager2-nodebug-jsmin.js for an optimized build (~11KB with gzip.)\r\n * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion\r\n * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.)\r\n *\r\n * You may notice <d> and </d> comments in this source; these are delimiters for\r\n * debug blocks which are removed in the -nodebug builds, further optimizing code size.\r\n *\r\n * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;)\r\n */\r\n\r\n(function SM2(window, _undefined) {\r\n\r\n/* global Audio, document, window, navigator, define, module, SM2_DEFER, opera, setTimeout, setInterval, clearTimeout, sm2Debugger */\r\n\r\n'use strict';\r\n\r\nif (!window || !window.document) {\r\n\r\n  // Don't cross the [environment] streams. SM2 expects to be running in a browser, not under node.js etc.\r\n  // Additionally, if a browser somehow manages to fail this test, as Egon said: \"It would be bad.\"\r\n\r\n  throw new Error('SoundManager requires a browser with window and document objects.');\r\n\r\n}\r\n\r\nvar soundManager = null;\r\n\r\n/**\r\n * The SoundManager constructor.\r\n *\r\n * @constructor\r\n * @param {string} smURL Optional: Path to SWF files\r\n * @param {string} smID Optional: The ID to use for the SWF container element\r\n * @this {SoundManager}\r\n * @return {SoundManager} The new SoundManager instance\r\n */\r\n\r\nfunction SoundManager(smURL, smID) {\r\n\r\n  /**\r\n   * soundManager configuration options list\r\n   * defines top-level configuration properties to be applied to the soundManager instance (eg. soundManager.flashVersion)\r\n   * to set these properties, use the setup() method - eg., soundManager.setup({url: '/swf/', flashVersion: 9})\r\n   */\r\n\r\n  this.setupOptions = {\r\n\r\n    url: (smURL || null),             // path (directory) where SoundManager 2 SWFs exist, eg., /path/to/swfs/\r\n    flashVersion: 8,                  // flash build to use (8 or 9.) Some API features require 9.\r\n    debugMode: true,                  // enable debugging output (console.log() with HTML fallback)\r\n    debugFlash: false,                // enable debugging output inside SWF, troubleshoot Flash/browser issues\r\n    useConsole: true,                 // use console.log() if available (otherwise, writes to #soundmanager-debug element)\r\n    consoleOnly: true,                // if console is being used, do not create/write to #soundmanager-debug\r\n    waitForWindowLoad: false,         // force SM2 to wait for window.onload() before trying to call soundManager.onload()\r\n    bgColor: '#ffffff',               // SWF background color. N/A when wmode = 'transparent'\r\n    useHighPerformance: false,        // position:fixed flash movie can help increase js/flash speed, minimize lag\r\n    flashPollingInterval: null,       // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used.\r\n    html5PollingInterval: null,       // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used.\r\n    flashLoadTimeout: 1000,           // msec to wait for flash movie to load before failing (0 = infinity)\r\n    wmode: null,                      // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work)\r\n    allowScriptAccess: 'always',      // for scripting the SWF (object/embed property), 'always' or 'sameDomain'\r\n    useFlashBlock: false,             // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.\r\n    useHTML5Audio: true,              // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (MP3/MP4 support varies.) Ideally, transparent vs. Flash API where possible.\r\n    forceUseGlobalHTML5Audio: false,  // if true, a single Audio() object is used for all sounds - and only one can play at a time.\r\n    ignoreMobileRestrictions: false,  // if true, SM2 will not apply global HTML5 audio rules to mobile UAs. iOS > 7 and WebViews may allow multiple Audio() instances.\r\n    html5Test: /^(probably|maybe)$/i, // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.\r\n    preferFlash: false,               // overrides useHTML5audio, will use Flash for MP3/MP4/AAC if present. Potential option if HTML5 playback with these formats is quirky.\r\n    noSWFCache: false,                // if true, appends ?ts={date} to break aggressive SWF caching.\r\n    idPrefix: 'sound'                 // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc.\r\n\r\n  };\r\n\r\n  this.defaultOptions = {\r\n\r\n    /**\r\n     * the default configuration for sound objects made with createSound() and related methods\r\n     * eg., volume, auto-load behaviour and so forth\r\n     */\r\n\r\n    autoLoad: false,        // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)\r\n    autoPlay: false,        // enable playing of file as soon as possible (much faster if \"stream\" is true)\r\n    from: null,             // position to start playback within a sound (msec), default = beginning\r\n    loops: 1,               // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)\r\n    onid3: null,            // callback function for \"ID3 data is added/available\"\r\n    onerror: null,          // callback function for \"load failed\" (or, playback/network/decode error under HTML5.)\r\n    onload: null,           // callback function for \"load finished\"\r\n    whileloading: null,     // callback function for \"download progress update\" (X of Y bytes received)\r\n    onplay: null,           // callback for \"play\" start\r\n    onpause: null,          // callback for \"pause\"\r\n    onresume: null,         // callback for \"resume\" (pause toggle)\r\n    whileplaying: null,     // callback during play (position update)\r\n    onposition: null,       // object containing times and function callbacks for positions of interest\r\n    onstop: null,           // callback for \"user stop\"\r\n    onfinish: null,         // callback function for \"sound finished playing\"\r\n    multiShot: true,        // let sounds \"restart\" or layer on top of each other when played multiple times, rather than one-shot/one at a time\r\n    multiShotEvents: false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled\r\n    position: null,         // offset (milliseconds) to seek to within loaded sound data.\r\n    pan: 0,                 // \"pan\" settings, left-to-right, -100 to 100\r\n    playbackRate: 1,        // rate at which to play the sound (HTML5-only)\r\n    stream: true,           // allows playing before entire file has loaded (recommended)\r\n    to: null,               // position to end playback within a sound (msec), default = end\r\n    type: null,             // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3\r\n    usePolicyFile: false,   // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)\r\n    volume: 100             // self-explanatory. 0-100, the latter being the max.\r\n\r\n  };\r\n\r\n  this.flash9Options = {\r\n\r\n    /**\r\n     * flash 9-only options,\r\n     * merged into defaultOptions if flash 9 is being used\r\n     */\r\n\r\n    onfailure: null,        // callback function for when playing fails (Flash 9, MovieStar + RTMP-only)\r\n    isMovieStar: null,      // \"MovieStar\" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL\r\n    usePeakData: false,     // enable left/right channel peak (level) data\r\n    useWaveformData: false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load.\r\n    useEQData: false,       // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load.\r\n    onbufferchange: null,   // callback for \"isBuffering\" property change\r\n    ondataerror: null       // callback for waveform/eq data access error (flash playing audio in other tabs/domains)\r\n\r\n  };\r\n\r\n  this.movieStarOptions = {\r\n\r\n    /**\r\n     * flash 9.0r115+ MPEG4 audio options,\r\n     * merged into defaultOptions if flash 9+movieStar mode is enabled\r\n     */\r\n\r\n    bufferTime: 3,          // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)\r\n    serverURL: null,        // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants\r\n    onconnect: null,        // rtmp: callback for connection to flash media server\r\n    duration: null          // rtmp: song duration (msec)\r\n\r\n  };\r\n\r\n  this.audioFormats = {\r\n\r\n    /**\r\n     * determines HTML5 support + flash requirements.\r\n     * if no support (via flash and/or HTML5) for a \"required\" format, SM2 will fail to start.\r\n     * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)\r\n     */\r\n\r\n    mp3: {\r\n      type: ['audio/mpeg; codecs=\"mp3\"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],\r\n      required: true\r\n    },\r\n\r\n    mp4: {\r\n      related: ['aac', 'm4a', 'm4b'], // additional formats under the MP4 container\r\n      type: ['audio/mp4; codecs=\"mp4a.40.2\"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],\r\n      required: false\r\n    },\r\n\r\n    ogg: {\r\n      type: ['audio/ogg; codecs=vorbis'],\r\n      required: false\r\n    },\r\n\r\n    opus: {\r\n      type: ['audio/ogg; codecs=opus', 'audio/opus'],\r\n      required: false\r\n    },\r\n\r\n    wav: {\r\n      type: ['audio/wav; codecs=\"1\"', 'audio/wav', 'audio/wave', 'audio/x-wav'],\r\n      required: false\r\n    },\r\n\r\n    flac: {\r\n      type: ['audio/flac'],\r\n      required: false\r\n    }\r\n\r\n  };\r\n\r\n  // HTML attributes (id + class names) for the SWF container\r\n\r\n  this.movieID = 'sm2-container';\r\n  this.id = (smID || 'sm2movie');\r\n\r\n  this.debugID = 'soundmanager-debug';\r\n  this.debugURLParam = /([#?&])debug=1/i;\r\n\r\n  // dynamic attributes\r\n\r\n  this.versionNumber = 'V2.97a.20170601';\r\n  this.version = null;\r\n  this.movieURL = null;\r\n  this.altURL = null;\r\n  this.swfLoaded = false;\r\n  this.enabled = false;\r\n  this.oMC = null;\r\n  this.sounds = {};\r\n  this.soundIDs = [];\r\n  this.muted = false;\r\n  this.didFlashBlock = false;\r\n  this.filePattern = null;\r\n\r\n  this.filePatterns = {\r\n    flash8: /\\.mp3(\\?.*)?$/i,\r\n    flash9: /\\.mp3(\\?.*)?$/i\r\n  };\r\n\r\n  // support indicators, set at init\r\n\r\n  this.features = {\r\n    buffering: false,\r\n    peakData: false,\r\n    waveformData: false,\r\n    eqData: false,\r\n    movieStar: false\r\n  };\r\n\r\n  // flash sandbox info, used primarily in troubleshooting\r\n\r\n  this.sandbox = {\r\n    // <d>\r\n    type: null,\r\n    types: {\r\n      remote: 'remote (domain-based) rules',\r\n      localWithFile: 'local with file access (no internet access)',\r\n      localWithNetwork: 'local with network (internet access only, no local access)',\r\n      localTrusted: 'local, trusted (local+internet access)'\r\n    },\r\n    description: null,\r\n    noRemote: null,\r\n    noLocal: null\r\n    // </d>\r\n  };\r\n\r\n  /**\r\n   * format support (html5/flash)\r\n   * stores canPlayType() results based on audioFormats.\r\n   * eg. { mp3: boolean, mp4: boolean }\r\n   * treat as read-only.\r\n   */\r\n\r\n  this.html5 = {\r\n    usingFlash: null // set if/when flash fallback is needed\r\n  };\r\n\r\n  // file type support hash\r\n  this.flash = {};\r\n\r\n  // determined at init time\r\n  this.html5Only = false;\r\n\r\n  // used for special cases (eg. iPad/iPhone/palm OS?)\r\n  this.ignoreFlash = false;\r\n\r\n  /**\r\n   * a few private internals (OK, a lot. :D)\r\n   */\r\n\r\n  var SMSound,\r\n  sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [],\r\n  canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5ErrorCodes, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, didSetup, msecScale = 1000,\r\n  is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie|trident/i),\r\n  isWebkit = ua.match(/webkit/i),\r\n  isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)),\r\n  isOpera = (ua.match(/opera/i)),\r\n  mobileHTML5 = (ua.match(/(mobile|pre\\/|xoom)/i) || is_iDevice || isAndroid),\r\n  isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS\\sX\\s10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, \"Silk\") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159\r\n  hasConsole = (window.console !== _undefined && console.log !== _undefined),\r\n  isFocused = (doc.hasFocus !== _undefined ? doc.hasFocus() : null),\r\n  tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())),\r\n  okToDisable = !tryInitOnFocus,\r\n  flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i,\r\n  emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs)\r\n  emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', // tiny WAV for HTML5 unloading\r\n  overHTTP = (doc.location ? doc.location.protocol.match(/http/i) : null),\r\n  http = (!overHTTP ? '//' : ''),\r\n  // mp3, mp4, aac etc.\r\n  netStreamMimeTypes = /^\\s*audio\\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4|m4v|m4a|m4b|mp4v|3gp|3g2)\\s*(?:$|;)/i,\r\n  // Flash v9.0r115+ \"moviestar\" formats\r\n  netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'],\r\n  netStreamPattern = new RegExp('\\\\.(' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n  this.mimePattern = /^\\s*audio\\/(?:x-)?(?:mp(?:eg|3))\\s*(?:$|;)/i; // default mp3 set\r\n\r\n  // use altURL if not \"online\"\r\n  this.useAltURL = !overHTTP;\r\n\r\n  swfCSS = {\r\n    swfBox: 'sm2-object-box',\r\n    swfDefault: 'movieContainer',\r\n    swfError: 'swf_error', // SWF loaded, but SM2 couldn't start (other error)\r\n    swfTimedout: 'swf_timedout',\r\n    swfLoaded: 'swf_loaded',\r\n    swfUnblocked: 'swf_unblocked', // or loaded OK\r\n    sm2Debug: 'sm2_debug',\r\n    highPerf: 'high_performance',\r\n    flashDebug: 'flash_debug'\r\n  };\r\n\r\n  /**\r\n   * HTML5 error codes, per W3C\r\n   * Error code 1, MEDIA_ERR_ABORTED: Client aborted download at user's request.\r\n   * Error code 2, MEDIA_ERR_NETWORK: A network error of some description caused the user agent to stop fetching the media resource, after the resource was established to be usable.\r\n   * Error code 3, MEDIA_ERR_DECODE: An error of some description occurred while decoding the media resource, after the resource was established to be usable.\r\n   * Error code 4, MEDIA_ERR_SRC_NOT_SUPPORTED: Media (audio file) not supported (\"not usable.\")\r\n   * Reference: https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n   */\r\n  html5ErrorCodes = [\r\n    null,\r\n    'MEDIA_ERR_ABORTED',\r\n    'MEDIA_ERR_NETWORK',\r\n    'MEDIA_ERR_DECODE',\r\n    'MEDIA_ERR_SRC_NOT_SUPPORTED'\r\n  ];\r\n\r\n  /**\r\n   * basic HTML5 Audio() support test\r\n   * try...catch because of IE 9 \"not implemented\" nonsense\r\n   * https://github.com/Modernizr/Modernizr/issues/224\r\n   */\r\n\r\n  this.hasHTML5 = (function() {\r\n    try {\r\n      // new Audio(null) for stupid Opera 9.64 case, which throws not_enough_arguments exception otherwise.\r\n      return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined);\r\n    } catch(e) {\r\n      return false;\r\n    }\r\n  }());\r\n\r\n  /**\r\n   * Public SoundManager API\r\n   * -----------------------\r\n   */\r\n\r\n  /**\r\n   * Configures top-level soundManager properties.\r\n   *\r\n   * @param {object} options Option parameters, eg. { flashVersion: 9, url: '/path/to/swfs/' }\r\n   * onready and ontimeout are also accepted parameters. call soundManager.setup() to see the full list.\r\n   */\r\n\r\n  this.setup = function(options) {\r\n\r\n    var noURL = (!sm2.url);\r\n\r\n    // warn if flash options have already been applied\r\n\r\n    if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) {\r\n      complain(str('setupLate'));\r\n    }\r\n\r\n    // TODO: defer: true?\r\n\r\n    assign(options);\r\n\r\n    if (!useGlobalHTML5Audio) {\r\n\r\n      if (mobileHTML5) {\r\n\r\n        // force the singleton HTML5 pattern on mobile, by default.\r\n        if (!sm2.setupOptions.ignoreMobileRestrictions || sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n          messages.push(strings.globalHTML5);\r\n          useGlobalHTML5Audio = true;\r\n        }\r\n\r\n      } else if (sm2.setupOptions.forceUseGlobalHTML5Audio) {\r\n\r\n        // only apply singleton HTML5 on desktop if forced.\r\n        messages.push(strings.globalHTML5);\r\n        useGlobalHTML5Audio = true;\r\n\r\n      }\r\n\r\n    }\r\n\r\n    if (!didSetup && mobileHTML5) {\r\n\r\n      if (sm2.setupOptions.ignoreMobileRestrictions) {\r\n\r\n        messages.push(strings.ignoreMobile);\r\n\r\n      } else {\r\n\r\n        // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.\r\n\r\n        // <d>\r\n        if (!sm2.setupOptions.useHTML5Audio || sm2.setupOptions.preferFlash) {\r\n          // notify that defaults are being changed.\r\n          sm2._wD(strings.mobileUA);\r\n        }\r\n        // </d>\r\n\r\n        sm2.setupOptions.useHTML5Audio = true;\r\n        sm2.setupOptions.preferFlash = false;\r\n\r\n        if (is_iDevice) {\r\n\r\n          // no flash here.\r\n          sm2.ignoreFlash = true;\r\n\r\n        } else if ((isAndroid && !ua.match(/android\\s2\\.3/i)) || !isAndroid) {\r\n\r\n          /**\r\n           * Android devices tend to work better with a single audio instance, specifically for chained playback of sounds in sequence.\r\n           * Common use case: exiting sound onfinish() -> createSound() -> play()\r\n           * Presuming similar restrictions for other mobile, non-Android, non-iOS devices.\r\n           */\r\n\r\n          // <d>\r\n          sm2._wD(strings.globalHTML5);\r\n          // </d>\r\n\r\n          useGlobalHTML5Audio = true;\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    // special case 1: \"Late setup\". SM2 loaded normally, but user didn't assign flash URL eg., setup({url:...}) before SM2 init. Treat as delayed init.\r\n\r\n    if (options) {\r\n\r\n      if (noURL && didDCLoaded && options.url !== _undefined) {\r\n        sm2.beginDelayedInit();\r\n      }\r\n\r\n      // special case 2: If lazy-loading SM2 (DOMContentLoaded has already happened) and user calls setup() with url: parameter, try to init ASAP.\r\n\r\n      if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') {\r\n        setTimeout(domContentLoaded, 1);\r\n      }\r\n\r\n    }\r\n\r\n    didSetup = true;\r\n\r\n    return sm2;\r\n\r\n  };\r\n\r\n  this.ok = function() {\r\n\r\n    return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5));\r\n\r\n  };\r\n\r\n  this.supported = this.ok; // legacy\r\n\r\n  this.getMovie = function(movie_id) {\r\n\r\n    // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version\r\n    return id(movie_id) || doc[movie_id] || window[movie_id];\r\n\r\n  };\r\n\r\n  /**\r\n   * Creates a SMSound sound object instance. Can also be overloaded, e.g., createSound('mySound', '/some.mp3');\r\n   *\r\n   * @param {object} oOptions Sound options (at minimum, url parameter is required.)\r\n   * @return {object} SMSound The new SMSound object.\r\n   */\r\n\r\n  this.createSound = function(oOptions, _url) {\r\n\r\n    var cs, cs_string, options, oSound = null;\r\n\r\n    // <d>\r\n    cs = sm + '.createSound(): ';\r\n    cs_string = cs + str(!didInit ? 'notReady' : 'notOK');\r\n    // </d>\r\n\r\n    if (!didInit || !sm2.ok()) {\r\n      complain(cs_string);\r\n      return false;\r\n    }\r\n\r\n    if (_url !== _undefined) {\r\n      // function overloading in JS! :) ... assume simple createSound(id, url) use case.\r\n      oOptions = {\r\n        id: oOptions,\r\n        url: _url\r\n      };\r\n    }\r\n\r\n    // inherit from defaultOptions\r\n    options = mixin(oOptions);\r\n\r\n    options.url = parseURL(options.url);\r\n\r\n    // generate an id, if needed.\r\n    if (options.id === _undefined) {\r\n      options.id = sm2.setupOptions.idPrefix + (idCounter++);\r\n    }\r\n\r\n    // <d>\r\n    if (options.id.toString().charAt(0).match(/^[0-9]$/)) {\r\n      sm2._wD(cs + str('badID', options.id), 2);\r\n    }\r\n\r\n    sm2._wD(cs + options.id + (options.url ? ' (' + options.url + ')' : ''), 1);\r\n    // </d>\r\n\r\n    if (idCheck(options.id, true)) {\r\n      sm2._wD(cs + options.id + ' exists', 1);\r\n      return sm2.sounds[options.id];\r\n    }\r\n\r\n    function make() {\r\n\r\n      options = loopFix(options);\r\n      sm2.sounds[options.id] = new SMSound(options);\r\n      sm2.soundIDs.push(options.id);\r\n      return sm2.sounds[options.id];\r\n\r\n    }\r\n\r\n    if (html5OK(options)) {\r\n\r\n      oSound = make();\r\n      // <d>\r\n      if (!sm2.html5Only) {\r\n        sm2._wD(options.id + ': Using HTML5');\r\n      }\r\n      // </d>\r\n      oSound._setup_html5(options);\r\n\r\n    } else {\r\n\r\n      if (sm2.html5Only) {\r\n        sm2._wD(options.id + ': No HTML5 support for this sound, and no Flash. Exiting.');\r\n        return make();\r\n      }\r\n\r\n      // TODO: Move HTML5/flash checks into generic URL parsing/handling function.\r\n\r\n      if (sm2.html5.usingFlash && options.url && options.url.match(/data:/i)) {\r\n        // data: URIs not supported by Flash, either.\r\n        sm2._wD(options.id + ': data: URIs not supported via Flash. Exiting.');\r\n        return make();\r\n      }\r\n\r\n      if (fV > 8) {\r\n        if (options.isMovieStar === null) {\r\n          // attempt to detect MPEG-4 formats\r\n          options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern)));\r\n        }\r\n        // <d>\r\n        if (options.isMovieStar) {\r\n          sm2._wD(cs + 'using MovieStar handling');\r\n          if (options.loops > 1) {\r\n            _wDS('noNSLoop');\r\n          }\r\n        }\r\n        // </d>\r\n      }\r\n\r\n      options = policyFix(options, cs);\r\n      oSound = make();\r\n\r\n      if (fV === 8) {\r\n        flash._createSound(options.id, options.loops || 1, options.usePolicyFile);\r\n      } else {\r\n        flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar ? options.bufferTime : false), options.loops || 1, options.serverURL, options.duration || null, options.autoPlay, true, options.autoLoad, options.usePolicyFile);\r\n        if (!options.serverURL) {\r\n          // We are connected immediately\r\n          oSound.connected = true;\r\n          if (options.onconnect) {\r\n            options.onconnect.apply(oSound);\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!options.serverURL && (options.autoLoad || options.autoPlay)) {\r\n        // call load for non-rtmp streams\r\n        oSound.load(options);\r\n      }\r\n\r\n    }\r\n\r\n    // rtmp will play in onconnect\r\n    if (!options.serverURL && options.autoPlay) {\r\n      oSound.play();\r\n    }\r\n\r\n    return oSound;\r\n\r\n  };\r\n\r\n  /**\r\n   * Destroys a SMSound sound object instance.\r\n   *\r\n   * @param {string} sID The ID of the sound to destroy\r\n   */\r\n\r\n  this.destroySound = function(sID, _bFromSound) {\r\n\r\n    // explicitly destroy a sound before normal page unload, etc.\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    var oS = sm2.sounds[sID], i;\r\n\r\n    oS.stop();\r\n\r\n    // Disable all callbacks after stop(), when the sound is being destroyed\r\n    oS._iO = {};\r\n\r\n    oS.unload();\r\n\r\n    for (i = 0; i < sm2.soundIDs.length; i++) {\r\n      if (sm2.soundIDs[i] === sID) {\r\n        sm2.soundIDs.splice(i, 1);\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (!_bFromSound) {\r\n      // ignore if being called from SMSound instance\r\n      oS.destruct(true);\r\n    }\r\n\r\n    oS = null;\r\n    delete sm2.sounds[sID];\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the load() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {object} oOptions Optional: Sound options\r\n   */\r\n\r\n  this.load = function(sID, oOptions) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].load(oOptions);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the unload() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   */\r\n\r\n  this.unload = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].unload();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the onPosition() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nPosition The position to watch for\r\n   * @param {function} oMethod The relevant callback to fire\r\n   * @param {object} oScope Optional: The scope to apply the callback to\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.onPosition = function(sID, nPosition, oMethod, oScope) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].onposition(nPosition, oMethod, oScope);\r\n\r\n  };\r\n\r\n  // legacy/backwards-compability: lower-case method name\r\n  this.onposition = this.onPosition;\r\n\r\n  /**\r\n   * Calls the clearOnPosition() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nPosition The position to watch for\r\n   * @param {function} oMethod Optional: The relevant callback to fire\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.clearOnPosition = function(sID, nPosition, oMethod) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].clearOnPosition(nPosition, oMethod);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the play() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {object} oOptions Optional: Sound options\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.play = function(sID, oOptions) {\r\n\r\n    var result = null,\r\n        // legacy function-overloading use case: play('mySound', '/path/to/some.mp3');\r\n        overloaded = (oOptions && !(oOptions instanceof Object));\r\n\r\n    if (!didInit || !sm2.ok()) {\r\n      complain(sm + '.play(): ' + str(!didInit ? 'notReady' : 'notOK'));\r\n      return false;\r\n    }\r\n\r\n    if (!idCheck(sID, overloaded)) {\r\n\r\n      // no sound found for the given ID. Bail.\r\n      if (!overloaded) return false;\r\n\r\n      if (overloaded) {\r\n        oOptions = {\r\n          url: oOptions\r\n        };\r\n      }\r\n\r\n      if (oOptions && oOptions.url) {\r\n        // overloading use case, create+play: .play('someID', {url:'/path/to.mp3'});\r\n        sm2._wD(sm + '.play(): Attempting to create \"' + sID + '\"', 1);\r\n        oOptions.id = sID;\r\n        result = sm2.createSound(oOptions).play();\r\n      }\r\n\r\n    } else if (overloaded) {\r\n\r\n      // existing sound object case\r\n      oOptions = {\r\n        url: oOptions\r\n      };\r\n\r\n    }\r\n\r\n    if (result === null) {\r\n      // default case\r\n      result = sm2.sounds[sID].play(oOptions);\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  // just for convenience\r\n  this.start = this.play;\r\n\r\n  /**\r\n   * Calls the setPlaybackRate() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setPlaybackRate = function(sID, rate, allowOverride) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setPlaybackRate(rate, allowOverride);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the setPosition() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nMsecOffset Position (milliseconds)\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setPosition = function(sID, nMsecOffset) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setPosition(nMsecOffset);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the stop() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.stop = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    sm2._wD(sm + '.stop(' + sID + ')', 1);\r\n\r\n    return sm2.sounds[sID].stop();\r\n\r\n  };\r\n\r\n  /**\r\n   * Stops all currently-playing sounds.\r\n   */\r\n\r\n  this.stopAll = function() {\r\n\r\n    var oSound;\r\n    sm2._wD(sm + '.stopAll()', 1);\r\n\r\n    for (oSound in sm2.sounds) {\r\n      if (sm2.sounds.hasOwnProperty(oSound)) {\r\n        // apply only to sound objects\r\n        sm2.sounds[oSound].stop();\r\n      }\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the pause() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.pause = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].pause();\r\n\r\n  };\r\n\r\n  /**\r\n   * Pauses all currently-playing sounds.\r\n   */\r\n\r\n  this.pauseAll = function() {\r\n\r\n    var i;\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      sm2.sounds[sm2.soundIDs[i]].pause();\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the resume() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.resume = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].resume();\r\n\r\n  };\r\n\r\n  /**\r\n   * Resumes all currently-paused sounds.\r\n   */\r\n\r\n  this.resumeAll = function() {\r\n\r\n    var i;\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      sm2.sounds[sm2.soundIDs[i]].resume();\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the togglePause() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.togglePause = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].togglePause();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the setPan() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nPan The pan value (-100 to 100)\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setPan = function(sID, nPan) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setPan(nPan);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the setVolume() method of a SMSound object by ID\r\n   * Overloaded case: pass only volume argument eg., setVolume(50) to apply to all sounds.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @param {number} nVol The volume value (0 to 100)\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.setVolume = function(sID, nVol) {\r\n\r\n    // setVolume(50) function overloading case - apply to all sounds\r\n\r\n    var i, j;\r\n\r\n    if (sID !== _undefined && !isNaN(sID) && nVol === _undefined) {\r\n      for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n        sm2.sounds[sm2.soundIDs[i]].setVolume(sID);\r\n      }\r\n      return false;\r\n    }\r\n\r\n    // setVolume('mySound', 50) case\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].setVolume(nVol);\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the mute() method of either a single SMSound object by ID, or all sound objects.\r\n   *\r\n   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n   */\r\n\r\n  this.mute = function(sID) {\r\n\r\n    var i = 0;\r\n\r\n    if (sID instanceof String) {\r\n      sID = null;\r\n    }\r\n\r\n    if (!sID) {\r\n\r\n      sm2._wD(sm + '.mute(): Muting all sounds');\r\n      for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n        sm2.sounds[sm2.soundIDs[i]].mute();\r\n      }\r\n      sm2.muted = true;\r\n\r\n    } else {\r\n\r\n      if (!idCheck(sID)) return false;\r\n\r\n      sm2._wD(sm + '.mute(): Muting \"' + sID + '\"');\r\n      return sm2.sounds[sID].mute();\r\n\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Mutes all sounds.\r\n   */\r\n\r\n  this.muteAll = function() {\r\n\r\n    sm2.mute();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the unmute() method of either a single SMSound object by ID, or all sound objects.\r\n   *\r\n   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)\r\n   */\r\n\r\n  this.unmute = function(sID) {\r\n\r\n    var i;\r\n\r\n    if (sID instanceof String) {\r\n      sID = null;\r\n    }\r\n\r\n    if (!sID) {\r\n\r\n      sm2._wD(sm + '.unmute(): Unmuting all sounds');\r\n      for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n        sm2.sounds[sm2.soundIDs[i]].unmute();\r\n      }\r\n      sm2.muted = false;\r\n\r\n    } else {\r\n\r\n      if (!idCheck(sID)) return false;\r\n\r\n      sm2._wD(sm + '.unmute(): Unmuting \"' + sID + '\"');\r\n\r\n      return sm2.sounds[sID].unmute();\r\n\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Unmutes all sounds.\r\n   */\r\n\r\n  this.unmuteAll = function() {\r\n\r\n    sm2.unmute();\r\n\r\n  };\r\n\r\n  /**\r\n   * Calls the toggleMute() method of a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.toggleMute = function(sID) {\r\n\r\n    if (!idCheck(sID)) return false;\r\n\r\n    return sm2.sounds[sID].toggleMute();\r\n\r\n  };\r\n\r\n  /**\r\n   * Retrieves the memory used by the flash plugin.\r\n   *\r\n   * @return {number} The amount of memory in use\r\n   */\r\n\r\n  this.getMemoryUse = function() {\r\n\r\n    // flash-only\r\n    var ram = 0;\r\n\r\n    if (flash && fV !== 8) {\r\n      ram = parseInt(flash._getMemoryUse(), 10);\r\n    }\r\n\r\n    return ram;\r\n\r\n  };\r\n\r\n  /**\r\n   * Undocumented: NOPs soundManager and all SMSound objects.\r\n   */\r\n\r\n  this.disable = function(bNoDisable) {\r\n\r\n    // destroy all functions\r\n    var i;\r\n\r\n    if (bNoDisable === _undefined) {\r\n      bNoDisable = false;\r\n    }\r\n\r\n    // already disabled?\r\n    if (disabled) return false;\r\n\r\n    disabled = true;\r\n\r\n    _wDS('shutdown', 1);\r\n\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      disableObject(sm2.sounds[sm2.soundIDs[i]]);\r\n    }\r\n\r\n    disableObject(sm2);\r\n\r\n    // fire \"complete\", despite fail\r\n    initComplete(bNoDisable);\r\n\r\n    event.remove(window, 'load', initUserOnload);\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  /**\r\n   * Determines playability of a MIME type, eg. 'audio/mp3'.\r\n   */\r\n\r\n  this.canPlayMIME = function(sMIME) {\r\n\r\n    var result;\r\n\r\n    if (sm2.hasHTML5) {\r\n      result = html5CanPlay({\r\n        type: sMIME\r\n      });\r\n    }\r\n\r\n    if (!result && needsFlash) {\r\n      // if flash 9, test netStream (movieStar) types as well.\r\n      result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); // TODO: make less \"weird\" (per JSLint)\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Determines playability of a URL based on audio support.\r\n   *\r\n   * @param {string} sURL The URL to test\r\n   * @return {boolean} URL playability\r\n   */\r\n\r\n  this.canPlayURL = function(sURL) {\r\n\r\n    var result;\r\n\r\n    if (sm2.hasHTML5) {\r\n      result = html5CanPlay({\r\n        url: sURL\r\n      });\r\n    }\r\n\r\n    if (!result && needsFlash) {\r\n      result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null);\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Determines playability of an HTML DOM &lt;a&gt; object (or similar object literal) based on audio support.\r\n   *\r\n   * @param {object} oLink an HTML DOM &lt;a&gt; object or object literal including href and/or type attributes\r\n   * @return {boolean} URL playability\r\n   */\r\n\r\n  this.canPlayLink = function(oLink) {\r\n\r\n    if (oLink.type !== _undefined && oLink.type && sm2.canPlayMIME(oLink.type)) return true;\r\n\r\n    return sm2.canPlayURL(oLink.href);\r\n\r\n  };\r\n\r\n  /**\r\n   * Retrieves a SMSound object by ID.\r\n   *\r\n   * @param {string} sID The ID of the sound\r\n   * @return {SMSound} The SMSound object\r\n   */\r\n\r\n  this.getSoundById = function(sID, _suppressDebug) {\r\n\r\n    if (!sID) return null;\r\n\r\n    var result = sm2.sounds[sID];\r\n\r\n    // <d>\r\n    if (!result && !_suppressDebug) {\r\n      sm2._wD(sm + '.getSoundById(): Sound \"' + sID + '\" not found.', 2);\r\n    }\r\n    // </d>\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Queues a callback for execution when SoundManager has successfully initialized.\r\n   *\r\n   * @param {function} oMethod The callback method to fire\r\n   * @param {object} oScope Optional: The scope to apply to the callback\r\n   */\r\n\r\n  this.onready = function(oMethod, oScope) {\r\n\r\n    var sType = 'onready',\r\n        result = false;\r\n\r\n    if (typeof oMethod === 'function') {\r\n\r\n      // <d>\r\n      if (didInit) {\r\n        sm2._wD(str('queue', sType));\r\n      }\r\n      // </d>\r\n\r\n      if (!oScope) {\r\n        oScope = window;\r\n      }\r\n\r\n      addOnEvent(sType, oMethod, oScope);\r\n      processOnEvents();\r\n\r\n      result = true;\r\n\r\n    } else {\r\n\r\n      throw str('needFunction', sType);\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Queues a callback for execution when SoundManager has failed to initialize.\r\n   *\r\n   * @param {function} oMethod The callback method to fire\r\n   * @param {object} oScope Optional: The scope to apply to the callback\r\n   */\r\n\r\n  this.ontimeout = function(oMethod, oScope) {\r\n\r\n    var sType = 'ontimeout',\r\n        result = false;\r\n\r\n    if (typeof oMethod === 'function') {\r\n\r\n      // <d>\r\n      if (didInit) {\r\n        sm2._wD(str('queue', sType));\r\n      }\r\n      // </d>\r\n\r\n      if (!oScope) {\r\n        oScope = window;\r\n      }\r\n\r\n      addOnEvent(sType, oMethod, oScope);\r\n      processOnEvents({ type: sType });\r\n\r\n      result = true;\r\n\r\n    } else {\r\n\r\n      throw str('needFunction', sType);\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * Writes console.log()-style debug output to a console or in-browser element.\r\n   * Applies when debugMode = true\r\n   *\r\n   * @param {string} sText The console message\r\n   * @param {object} nType Optional log level (number), or object. Number case: Log type/style where 0 = 'info', 1 = 'warn', 2 = 'error'. Object case: Object to be dumped.\r\n   */\r\n\r\n  this._writeDebug = function(sText, sTypeOrObject) {\r\n\r\n    // pseudo-private console.log()-style output\r\n    // <d>\r\n\r\n    var sDID = 'soundmanager-debug', o, oItem;\r\n\r\n    if (!sm2.setupOptions.debugMode) return false;\r\n\r\n    if (hasConsole && sm2.useConsole) {\r\n      if (sTypeOrObject && typeof sTypeOrObject === 'object') {\r\n        // object passed; dump to console.\r\n        console.log(sText, sTypeOrObject);\r\n      } else if (debugLevels[sTypeOrObject] !== _undefined) {\r\n        console[debugLevels[sTypeOrObject]](sText);\r\n      } else {\r\n        console.log(sText);\r\n      }\r\n      if (sm2.consoleOnly) return true;\r\n    }\r\n\r\n    o = id(sDID);\r\n\r\n    if (!o) return false;\r\n\r\n    oItem = doc.createElement('div');\r\n\r\n    if (++wdCount % 2 === 0) {\r\n      oItem.className = 'sm2-alt';\r\n    }\r\n\r\n    if (sTypeOrObject === _undefined) {\r\n      sTypeOrObject = 0;\r\n    } else {\r\n      sTypeOrObject = parseInt(sTypeOrObject, 10);\r\n    }\r\n\r\n    oItem.appendChild(doc.createTextNode(sText));\r\n\r\n    if (sTypeOrObject) {\r\n      if (sTypeOrObject >= 2) {\r\n        oItem.style.fontWeight = 'bold';\r\n      }\r\n      if (sTypeOrObject === 3) {\r\n        oItem.style.color = '#ff3333';\r\n      }\r\n    }\r\n\r\n    // top-to-bottom\r\n    // o.appendChild(oItem);\r\n\r\n    // bottom-to-top\r\n    o.insertBefore(oItem, o.firstChild);\r\n\r\n    o = null;\r\n    // </d>\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  // <d>\r\n  // last-resort debugging option\r\n  if (wl.indexOf('sm2-debug=alert') !== -1) {\r\n    this._writeDebug = function(sText) {\r\n      window.alert(sText);\r\n    };\r\n  }\r\n  // </d>\r\n\r\n  // alias\r\n  this._wD = this._writeDebug;\r\n\r\n  /**\r\n   * Provides debug / state information on all SMSound objects.\r\n   */\r\n\r\n  this._debug = function() {\r\n\r\n    // <d>\r\n    var i, j;\r\n    _wDS('currentObj', 1);\r\n\r\n    for (i = 0, j = sm2.soundIDs.length; i < j; i++) {\r\n      sm2.sounds[sm2.soundIDs[i]]._debug();\r\n    }\r\n    // </d>\r\n\r\n  };\r\n\r\n  /**\r\n   * Restarts and re-initializes the SoundManager instance.\r\n   *\r\n   * @param {boolean} resetEvents Optional: When true, removes all registered onready and ontimeout event callbacks.\r\n   * @param {boolean} excludeInit Options: When true, does not call beginDelayedInit() (which would restart SM2).\r\n   * @return {object} soundManager The soundManager instance.\r\n   */\r\n\r\n  this.reboot = function(resetEvents, excludeInit) {\r\n\r\n    // reset some (or all) state, and re-init unless otherwise specified.\r\n\r\n    // <d>\r\n    if (sm2.soundIDs.length) {\r\n      sm2._wD('Destroying ' + sm2.soundIDs.length + ' SMSound object' + (sm2.soundIDs.length !== 1 ? 's' : '') + '...');\r\n    }\r\n    // </d>\r\n\r\n    var i, j, k;\r\n\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n      sm2.sounds[sm2.soundIDs[i]].destruct();\r\n    }\r\n\r\n    // trash ze flash (remove from the DOM)\r\n\r\n    if (flash) {\r\n\r\n      try {\r\n\r\n        if (isIE) {\r\n          oRemovedHTML = flash.innerHTML;\r\n        }\r\n\r\n        oRemoved = flash.parentNode.removeChild(flash);\r\n\r\n      } catch(e) {\r\n\r\n        // Remove failed? May be due to flash blockers silently removing the SWF object/embed node from the DOM. Warn and continue.\r\n\r\n        _wDS('badRemove', 2);\r\n\r\n      }\r\n\r\n    }\r\n\r\n    // actually, force recreate of movie.\r\n\r\n    oRemovedHTML = oRemoved = needsFlash = flash = null;\r\n\r\n    sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false;\r\n\r\n    sm2.soundIDs = [];\r\n    sm2.sounds = {};\r\n\r\n    idCounter = 0;\r\n    didSetup = false;\r\n\r\n    if (!resetEvents) {\r\n      // reset callbacks for onready, ontimeout etc. so that they will fire again on re-init\r\n      for (i in on_queue) {\r\n        if (on_queue.hasOwnProperty(i)) {\r\n          for (j = 0, k = on_queue[i].length; j < k; j++) {\r\n            on_queue[i][j].fired = false;\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      // remove all callbacks entirely\r\n      on_queue = [];\r\n    }\r\n\r\n    // <d>\r\n    if (!excludeInit) {\r\n      sm2._wD(sm + ': Rebooting...');\r\n    }\r\n    // </d>\r\n\r\n    // reset HTML5 and flash canPlay test results\r\n\r\n    sm2.html5 = {\r\n      usingFlash: null\r\n    };\r\n\r\n    sm2.flash = {};\r\n\r\n    // reset device-specific HTML/flash mode switches\r\n\r\n    sm2.html5Only = false;\r\n    sm2.ignoreFlash = false;\r\n\r\n    window.setTimeout(function() {\r\n\r\n      // by default, re-init\r\n\r\n      if (!excludeInit) {\r\n        sm2.beginDelayedInit();\r\n      }\r\n\r\n    }, 20);\r\n\r\n    return sm2;\r\n\r\n  };\r\n\r\n  this.reset = function() {\r\n\r\n    /**\r\n     * Shuts down and restores the SoundManager instance to its original loaded state, without an explicit reboot. All onready/ontimeout handlers are removed.\r\n     * After this call, SM2 may be re-initialized via soundManager.beginDelayedInit().\r\n     * @return {object} soundManager The soundManager instance.\r\n     */\r\n\r\n    _wDS('reset');\r\n\r\n    return sm2.reboot(true, true);\r\n\r\n  };\r\n\r\n  /**\r\n   * Undocumented: Determines the SM2 flash movie's load progress.\r\n   *\r\n   * @return {number or null} Percent loaded, or if invalid/unsupported, null.\r\n   */\r\n\r\n  this.getMoviePercent = function() {\r\n\r\n    /**\r\n     * Interesting syntax notes...\r\n     * Flash/ExternalInterface (ActiveX/NPAPI) bridge methods are not typeof \"function\" nor instanceof Function, but are still valid.\r\n     * Furthermore, using (flash && flash.PercentLoaded) causes IE to throw \"object doesn't support this property or method\".\r\n     * Thus, 'in' syntax must be used.\r\n     */\r\n\r\n    return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null);\r\n\r\n  };\r\n\r\n  /**\r\n   * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload().\r\n   */\r\n\r\n  this.beginDelayedInit = function() {\r\n\r\n    windowLoaded = true;\r\n    domContentLoaded();\r\n\r\n    setTimeout(function() {\r\n\r\n      if (initPending) return false;\r\n\r\n      createMovie();\r\n      initMovie();\r\n      initPending = true;\r\n\r\n      return true;\r\n\r\n    }, 20);\r\n\r\n    delayWaitForEI();\r\n\r\n  };\r\n\r\n  /**\r\n   * Destroys the SoundManager instance and all SMSound instances.\r\n   */\r\n\r\n  this.destruct = function() {\r\n\r\n    sm2._wD(sm + '.destruct()');\r\n    sm2.disable(true);\r\n\r\n  };\r\n\r\n  /**\r\n   * SMSound() (sound object) constructor\r\n   * ------------------------------------\r\n   *\r\n   * @param {object} oOptions Sound options (id and url are required attributes)\r\n   * @return {SMSound} The new SMSound object\r\n   */\r\n\r\n  SMSound = function(oOptions) {\r\n\r\n    var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted;\r\n\r\n    lastHTML5State = {\r\n      // tracks duration + position (time)\r\n      duration: null,\r\n      time: null\r\n    };\r\n\r\n    this.id = oOptions.id;\r\n\r\n    // legacy\r\n    this.sID = this.id;\r\n\r\n    this.url = oOptions.url;\r\n    this.options = mixin(oOptions);\r\n\r\n    // per-play-instance-specific options\r\n    this.instanceOptions = this.options;\r\n\r\n    // short alias\r\n    this._iO = this.instanceOptions;\r\n\r\n    // assign property defaults\r\n    this.pan = this.options.pan;\r\n    this.volume = this.options.volume;\r\n\r\n    // whether or not this object is using HTML5\r\n    this.isHTML5 = false;\r\n\r\n    // internal HTML5 Audio() object reference\r\n    this._a = null;\r\n\r\n    // for flash 8 special-case createSound() without url, followed by load/play with url case\r\n    urlOmitted = (!this.url);\r\n\r\n    /**\r\n     * SMSound() public methods\r\n     * ------------------------\r\n     */\r\n\r\n    this.id3 = {};\r\n\r\n    /**\r\n     * Writes SMSound object parameters to debug console\r\n     */\r\n\r\n    this._debug = function() {\r\n\r\n      // <d>\r\n      sm2._wD(s.id + ': Merged options:', s.options);\r\n      // </d>\r\n\r\n    };\r\n\r\n    /**\r\n     * Begins loading a sound per its *url*.\r\n     *\r\n     * @param {object} options Optional: Sound options\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.load = function(options) {\r\n\r\n      var oSound = null, instanceOptions;\r\n\r\n      if (options !== _undefined) {\r\n        s._iO = mixin(options, s.options);\r\n      } else {\r\n        options = s.options;\r\n        s._iO = options;\r\n        if (lastURL && lastURL !== s.url) {\r\n          _wDS('manURL');\r\n          s._iO.url = s.url;\r\n          s.url = null;\r\n        }\r\n      }\r\n\r\n      if (!s._iO.url) {\r\n        s._iO.url = s.url;\r\n      }\r\n\r\n      s._iO.url = parseURL(s._iO.url);\r\n\r\n      // ensure we're in sync\r\n      s.instanceOptions = s._iO;\r\n\r\n      // local shortcut\r\n      instanceOptions = s._iO;\r\n\r\n      sm2._wD(s.id + ': load (' + instanceOptions.url + ')');\r\n\r\n      if (!instanceOptions.url && !s.url) {\r\n        sm2._wD(s.id + ': load(): url is unassigned. Exiting.', 2);\r\n        return s;\r\n      }\r\n\r\n      // <d>\r\n      if (!s.isHTML5 && fV === 8 && !s.url && !instanceOptions.autoPlay) {\r\n        // flash 8 load() -> play() won't work before onload has fired.\r\n        sm2._wD(s.id + ': Flash 8 load() limitation: Wait for onload() before calling play().', 1);\r\n      }\r\n      // </d>\r\n\r\n      if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) {\r\n        _wDS('onURL', 1);\r\n        // if loaded and an onload() exists, fire immediately.\r\n        if (s.readyState === 3 && instanceOptions.onload) {\r\n          // assume success based on truthy duration.\r\n          wrapCallback(s, function() {\r\n            instanceOptions.onload.apply(s, [(!!s.duration)]);\r\n          });\r\n        }\r\n        return s;\r\n      }\r\n\r\n      // reset a few state properties\r\n\r\n      s.loaded = false;\r\n      s.readyState = 1;\r\n      s.playState = 0;\r\n      s.id3 = {};\r\n\r\n      // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio.\r\n\r\n      if (html5OK(instanceOptions)) {\r\n\r\n        oSound = s._setup_html5(instanceOptions);\r\n\r\n        if (!oSound._called_load) {\r\n\r\n          s._html5_canplay = false;\r\n\r\n          // TODO: review called_load / html5_canplay logic\r\n\r\n          // if url provided directly to load(), assign it here.\r\n\r\n          if (s.url !== instanceOptions.url) {\r\n\r\n            sm2._wD(_wDS('manURL') + ': ' + instanceOptions.url);\r\n\r\n            s._a.src = instanceOptions.url;\r\n\r\n            // TODO: review / re-apply all relevant options (volume, loop, onposition etc.)\r\n\r\n            // reset position for new URL\r\n            s.setPosition(0);\r\n\r\n          }\r\n\r\n          // given explicit load call, try to preload.\r\n\r\n          // early HTML5 implementation (non-standard)\r\n          s._a.autobuffer = 'auto';\r\n\r\n          // standard property, values: none / metadata / auto\r\n          // reference: http://msdn.microsoft.com/en-us/library/ie/ff974759%28v=vs.85%29.aspx\r\n          s._a.preload = 'auto';\r\n\r\n          s._a._called_load = true;\r\n\r\n        } else {\r\n\r\n          sm2._wD(s.id + ': Ignoring request to load again');\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        if (sm2.html5Only) {\r\n          sm2._wD(s.id + ': No flash support. Exiting.');\r\n          return s;\r\n        }\r\n\r\n        if (s._iO.url && s._iO.url.match(/data:/i)) {\r\n          // data: URIs not supported by Flash, either.\r\n          sm2._wD(s.id + ': data: URIs not supported via Flash. Exiting.');\r\n          return s;\r\n        }\r\n\r\n        try {\r\n          s.isHTML5 = false;\r\n          s._iO = policyFix(loopFix(instanceOptions));\r\n          // if we have \"position\", disable auto-play as we'll be seeking to that position at onload().\r\n          if (s._iO.autoPlay && (s._iO.position || s._iO.from)) {\r\n            sm2._wD(s.id + ': Disabling autoPlay because of non-zero offset case');\r\n            s._iO.autoPlay = false;\r\n          }\r\n          // re-assign local shortcut\r\n          instanceOptions = s._iO;\r\n          if (fV === 8) {\r\n            flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile);\r\n          } else {\r\n            flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops || 1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile);\r\n          }\r\n        } catch(e) {\r\n          _wDS('smError', 2);\r\n          debugTS('onload', false);\r\n          catchError({\r\n            type: 'SMSOUND_LOAD_JS_EXCEPTION',\r\n            fatal: true\r\n          });\r\n        }\r\n\r\n      }\r\n\r\n      // after all of this, ensure sound url is up to date.\r\n      s.url = instanceOptions.url;\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Unloads a sound, canceling any open HTTP requests.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.unload = function() {\r\n\r\n      // Flash 8/AS2 can't \"close\" a stream - fake it by loading an empty URL\r\n      // Flash 9/AS3: Close stream, preventing further load\r\n      // HTML5: Most UAs will use empty URL\r\n\r\n      if (s.readyState !== 0) {\r\n\r\n        sm2._wD(s.id + ': unload()');\r\n\r\n        if (!s.isHTML5) {\r\n\r\n          if (fV === 8) {\r\n            flash._unload(s.id, emptyURL);\r\n          } else {\r\n            flash._unload(s.id);\r\n          }\r\n\r\n        } else {\r\n\r\n          stop_html5_timer();\r\n\r\n          if (s._a) {\r\n\r\n            s._a.pause();\r\n\r\n            // update empty URL, too\r\n            lastURL = html5Unload(s._a);\r\n\r\n          }\r\n\r\n        }\r\n\r\n        // reset load/status flags\r\n        resetProperties();\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Unloads and destroys a sound.\r\n     */\r\n\r\n    this.destruct = function(_bFromSM) {\r\n\r\n      sm2._wD(s.id + ': Destruct');\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        // kill sound within Flash\r\n        // Disable the onfailure handler\r\n        s._iO.onfailure = null;\r\n        flash._destroySound(s.id);\r\n\r\n      } else {\r\n\r\n        stop_html5_timer();\r\n\r\n        if (s._a) {\r\n          s._a.pause();\r\n          html5Unload(s._a);\r\n          if (!useGlobalHTML5Audio) {\r\n            remove_html5_events();\r\n          }\r\n          // break obvious circular reference\r\n          s._a._s = null;\r\n          s._a = null;\r\n        }\r\n\r\n      }\r\n\r\n      if (!_bFromSM) {\r\n        // ensure deletion from controller\r\n        sm2.destroySound(s.id, true);\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * Begins playing a sound.\r\n     *\r\n     * @param {object} options Optional: Sound options\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.play = function(options, _updatePlayState) {\r\n\r\n      var fN, allowMulti, a, onready,\r\n          audioClone, onended, oncanplay,\r\n          startOK = true;\r\n\r\n      // <d>\r\n      fN = s.id + ': play(): ';\r\n      // </d>\r\n\r\n      // default to true\r\n      _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState);\r\n\r\n      if (!options) {\r\n        options = {};\r\n      }\r\n\r\n      // first, use local URL (if specified)\r\n      if (s.url) {\r\n        s._iO.url = s.url;\r\n      }\r\n\r\n      // mix in any options defined at createSound()\r\n      s._iO = mixin(s._iO, s.options);\r\n\r\n      // mix in any options specific to this method\r\n      s._iO = mixin(options, s._iO);\r\n\r\n      s._iO.url = parseURL(s._iO.url);\r\n\r\n      s.instanceOptions = s._iO;\r\n\r\n      // RTMP-only\r\n      if (!s.isHTML5 && s._iO.serverURL && !s.connected) {\r\n        if (!s.getAutoPlay()) {\r\n          sm2._wD(fN + ' Netstream not connected yet - setting autoPlay');\r\n          s.setAutoPlay(true);\r\n        }\r\n        // play will be called in onconnect()\r\n        return s;\r\n      }\r\n\r\n      if (html5OK(s._iO)) {\r\n        s._setup_html5(s._iO);\r\n        start_html5_timer();\r\n      }\r\n\r\n      if (s.playState === 1 && !s.paused) {\r\n\r\n        allowMulti = s._iO.multiShot;\r\n\r\n        if (!allowMulti) {\r\n\r\n          sm2._wD(fN + 'Already playing (one-shot)', 1);\r\n\r\n          if (s.isHTML5) {\r\n            // go back to original position.\r\n            s.setPosition(s._iO.position);\r\n          }\r\n\r\n          return s;\r\n\r\n        }\r\n\r\n        sm2._wD(fN + 'Already playing (multi-shot)', 1);\r\n\r\n      }\r\n\r\n      // edge case: play() with explicit URL parameter\r\n      if (options.url && options.url !== s.url) {\r\n\r\n        // special case for createSound() followed by load() / play() with url; avoid double-load case.\r\n        if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) {\r\n\r\n          urlOmitted = false;\r\n\r\n        } else {\r\n\r\n          // load using merged options\r\n          s.load(s._iO);\r\n\r\n        }\r\n\r\n      }\r\n\r\n      if (!s.loaded) {\r\n\r\n        if (s.readyState === 0) {\r\n\r\n          sm2._wD(fN + 'Attempting to load');\r\n\r\n          // try to get this sound playing ASAP\r\n          if (!s.isHTML5 && !sm2.html5Only) {\r\n\r\n            // flash: assign directly because setAutoPlay() increments the instanceCount\r\n            s._iO.autoPlay = true;\r\n            s.load(s._iO);\r\n\r\n          } else if (s.isHTML5) {\r\n\r\n            // iOS needs this when recycling sounds, loading a new URL on an existing object.\r\n            s.load(s._iO);\r\n\r\n          } else {\r\n\r\n            sm2._wD(fN + 'Unsupported type. Exiting.');\r\n\r\n            return s;\r\n\r\n          }\r\n\r\n          // HTML5 hack - re-set instanceOptions?\r\n          s.instanceOptions = s._iO;\r\n\r\n        } else if (s.readyState === 2) {\r\n\r\n          sm2._wD(fN + 'Could not load - exiting', 2);\r\n\r\n          return s;\r\n\r\n        } else {\r\n\r\n          sm2._wD(fN + 'Loading - attempting to play...');\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        // \"play()\"\r\n        sm2._wD(fN.substr(0, fN.lastIndexOf(':')));\r\n\r\n      }\r\n\r\n      if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) {\r\n        // flash 9 needs a position reset if play() is called while at the end of a sound.\r\n        sm2._wD(fN + 'Sound at end, resetting to position: 0');\r\n        options.position = 0;\r\n      }\r\n\r\n      /**\r\n       * Streams will pause when their buffer is full if they are being loaded.\r\n       * In this case paused is true, but the song hasn't started playing yet.\r\n       * If we just call resume() the onplay() callback will never be called.\r\n       * So only call resume() if the position is > 0.\r\n       * Another reason is because options like volume won't have been applied yet.\r\n       * For normal sounds, just resume.\r\n       */\r\n\r\n      if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) {\r\n\r\n        // https://gist.github.com/37b17df75cc4d7a90bf6\r\n        sm2._wD(fN + 'Resuming from paused state', 1);\r\n        s.resume();\r\n\r\n      } else {\r\n\r\n        s._iO = mixin(options, s._iO);\r\n\r\n        /**\r\n         * Preload in the event of play() with position under Flash,\r\n         * or from/to parameters and non-RTMP case\r\n         */\r\n        if (((!s.isHTML5 && s._iO.position !== null && s._iO.position > 0) || (s._iO.from !== null && s._iO.from > 0) || s._iO.to !== null) && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) {\r\n\r\n          onready = function() {\r\n            // sound \"canplay\" or onload()\r\n            // re-apply position/from/to to instance options, and start playback\r\n            s._iO = mixin(options, s._iO);\r\n            s.play(s._iO);\r\n          };\r\n\r\n          // HTML5 needs to at least have \"canplay\" fired before seeking.\r\n          if (s.isHTML5 && !s._html5_canplay) {\r\n\r\n            // this hasn't been loaded yet. load it first, and then do this again.\r\n            sm2._wD(fN + 'Beginning load for non-zero offset case');\r\n\r\n            s.load({\r\n              // note: custom HTML5-only event added for from/to implementation.\r\n              _oncanplay: onready\r\n            });\r\n\r\n          } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) {\r\n\r\n            // to be safe, preload the whole thing in Flash.\r\n\r\n            sm2._wD(fN + 'Preloading for non-zero offset case');\r\n\r\n            s.load({\r\n              onload: onready\r\n            });\r\n\r\n          }\r\n\r\n          // otherwise, we're ready to go. re-apply local options, and continue\r\n\r\n          s._iO = applyFromTo();\r\n\r\n        }\r\n\r\n        // sm2._wD(fN + 'Starting to play');\r\n\r\n        // increment instance counter, where enabled + supported\r\n        if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) {\r\n          s.instanceCount++;\r\n        }\r\n\r\n        // if first play and onposition parameters exist, apply them now\r\n        if (s._iO.onposition && s.playState === 0) {\r\n          attachOnPosition(s);\r\n        }\r\n\r\n        s.playState = 1;\r\n        s.paused = false;\r\n\r\n        s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0);\r\n\r\n        if (!s.isHTML5) {\r\n          s._iO = policyFix(loopFix(s._iO));\r\n        }\r\n\r\n        if (s._iO.onplay && _updatePlayState) {\r\n          s._iO.onplay.apply(s);\r\n          onplay_called = true;\r\n        }\r\n\r\n        s.setVolume(s._iO.volume, true);\r\n        s.setPan(s._iO.pan, true);\r\n\r\n        if (s._iO.playbackRate !== 1) {\r\n          s.setPlaybackRate(s._iO.playbackRate);\r\n        }\r\n\r\n        if (!s.isHTML5) {\r\n\r\n          startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false);\r\n\r\n          if (fV === 9 && !startOK) {\r\n            // edge case: no sound hardware, or 32-channel flash ceiling hit.\r\n            // applies only to Flash 9, non-NetStream/MovieStar sounds.\r\n            // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29\r\n            sm2._wD(fN + 'No sound hardware, or 32-sound ceiling hit', 2);\r\n            if (s._iO.onplayerror) {\r\n              s._iO.onplayerror.apply(s);\r\n            }\r\n\r\n          }\r\n\r\n        } else if (s.instanceCount < 2) {\r\n\r\n            // HTML5 single-instance case\r\n\r\n            start_html5_timer();\r\n\r\n            a = s._setup_html5();\r\n\r\n            s.setPosition(s._iO.position);\r\n\r\n            a.play();\r\n\r\n          } else {\r\n\r\n            // HTML5 multi-shot case\r\n\r\n            sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...');\r\n\r\n            audioClone = new Audio(s._iO.url);\r\n\r\n            onended = function() {\r\n              event.remove(audioClone, 'ended', onended);\r\n              s._onfinish(s);\r\n              // cleanup\r\n              html5Unload(audioClone);\r\n              audioClone = null;\r\n            };\r\n\r\n            oncanplay = function() {\r\n              event.remove(audioClone, 'canplay', oncanplay);\r\n              try {\r\n                audioClone.currentTime = s._iO.position / msecScale;\r\n              } catch(err) {\r\n                complain(s.id + ': multiShot play() failed to apply position of ' + (s._iO.position / msecScale));\r\n              }\r\n              audioClone.play();\r\n            };\r\n\r\n            event.add(audioClone, 'ended', onended);\r\n\r\n            // apply volume to clones, too\r\n            if (s._iO.volume !== _undefined) {\r\n              audioClone.volume = Math.max(0, Math.min(1, s._iO.volume / 100));\r\n            }\r\n\r\n            // playing multiple muted sounds? if you do this, you're weird ;) - but let's cover it.\r\n            if (s.muted) {\r\n              audioClone.muted = true;\r\n            }\r\n\r\n            if (s._iO.position) {\r\n              // HTML5 audio can't seek before onplay() event has fired.\r\n              // wait for canplay, then seek to position and start playback.\r\n              event.add(audioClone, 'canplay', oncanplay);\r\n            } else {\r\n              // begin playback at currentTime: 0\r\n              audioClone.play();\r\n            }\r\n\r\n          }\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    // just for convenience\r\n    this.start = this.play;\r\n\r\n    /**\r\n     * Stops playing a sound (and optionally, all sounds)\r\n     *\r\n     * @param {boolean} bAll Optional: Whether to stop all sounds\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.stop = function(bAll) {\r\n\r\n      var instanceOptions = s._iO,\r\n          originalPosition;\r\n\r\n      if (s.playState === 1) {\r\n\r\n        sm2._wD(s.id + ': stop()');\r\n\r\n        s._onbufferchange(0);\r\n        s._resetOnPosition(0);\r\n        s.paused = false;\r\n\r\n        if (!s.isHTML5) {\r\n          s.playState = 0;\r\n        }\r\n\r\n        // remove onPosition listeners, if any\r\n        detachOnPosition();\r\n\r\n        // and \"to\" position, if set\r\n        if (instanceOptions.to) {\r\n          s.clearOnPosition(instanceOptions.to);\r\n        }\r\n\r\n        if (!s.isHTML5) {\r\n\r\n          flash._stop(s.id, bAll);\r\n\r\n          // hack for netStream: just unload\r\n          if (instanceOptions.serverURL) {\r\n            s.unload();\r\n          }\r\n\r\n        } else if (s._a) {\r\n\r\n            originalPosition = s.position;\r\n\r\n            // act like Flash, though\r\n            s.setPosition(0);\r\n\r\n            // hack: reflect old position for onstop() (also like Flash)\r\n            s.position = originalPosition;\r\n\r\n            // html5 has no stop()\r\n            // NOTE: pausing means iOS requires interaction to resume.\r\n            s._a.pause();\r\n\r\n            s.playState = 0;\r\n\r\n            // and update UI\r\n            s._onTimer();\r\n\r\n            stop_html5_timer();\r\n\r\n          }\r\n\r\n        s.instanceCount = 0;\r\n        s._iO = {};\r\n\r\n        if (instanceOptions.onstop) {\r\n          instanceOptions.onstop.apply(s);\r\n        }\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Undocumented/internal: Sets autoPlay for RTMP.\r\n     *\r\n     * @param {boolean} autoPlay state\r\n     */\r\n\r\n    this.setAutoPlay = function(autoPlay) {\r\n\r\n      sm2._wD(s.id + ': Autoplay turned ' + (autoPlay ? 'on' : 'off'));\r\n      s._iO.autoPlay = autoPlay;\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setAutoPlay(s.id, autoPlay);\r\n        if (autoPlay) {\r\n          // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)\r\n          if (!s.instanceCount && s.readyState === 1) {\r\n            s.instanceCount++;\r\n            sm2._wD(s.id + ': Incremented instance count to ' + s.instanceCount);\r\n          }\r\n        }\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * Undocumented/internal: Returns the autoPlay boolean.\r\n     *\r\n     * @return {boolean} The current autoPlay value\r\n     */\r\n\r\n    this.getAutoPlay = function() {\r\n\r\n      return s._iO.autoPlay;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the playback rate of a sound (HTML5-only.)\r\n     *\r\n     * @param {number} playbackRate (+/-)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setPlaybackRate = function(playbackRate) {\r\n\r\n      // Per Mozilla, limit acceptable values to prevent playback from stopping (unless allowOverride is truthy.)\r\n      // https://developer.mozilla.org/en-US/Apps/Build/Audio_and_video_delivery/WebAudio_playbackRate_explained\r\n      var normalizedRate = Math.max(0.5, Math.min(4, playbackRate));\r\n\r\n      // <d>\r\n      if (normalizedRate !== playbackRate) {\r\n        sm2._wD(s.id + ': setPlaybackRate(' + playbackRate + '): limiting rate to ' + normalizedRate, 2);\r\n      }\r\n      // </d>\r\n\r\n      if (s.isHTML5) {\r\n        try {\r\n          s._iO.playbackRate = normalizedRate;\r\n          s._a.playbackRate = normalizedRate;\r\n        } catch(e) {\r\n          sm2._wD(s.id + ': setPlaybackRate(' + normalizedRate + ') failed: ' + e.message, 2);\r\n        }\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the position of a sound.\r\n     *\r\n     * @param {number} nMsecOffset Position (milliseconds)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setPosition = function(nMsecOffset) {\r\n\r\n      if (nMsecOffset === _undefined) {\r\n        nMsecOffset = 0;\r\n      }\r\n\r\n      var position, position1K,\r\n          // Use the duration from the instance options, if we don't have a track duration yet.\r\n          // position >= 0 and <= current available (loaded) duration\r\n          offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0)));\r\n\r\n      s.position = offset;\r\n      position1K = s.position / msecScale;\r\n      s._resetOnPosition(s.position);\r\n      s._iO.position = offset;\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        position = (fV === 9 ? s.position : position1K);\r\n\r\n        if (s.readyState && s.readyState !== 2) {\r\n          // if paused or not playing, will not resume (by playing)\r\n          flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot);\r\n        }\r\n\r\n      } else if (s._a) {\r\n\r\n        // Set the position in the canplay handler if the sound is not ready yet\r\n        if (s._html5_canplay) {\r\n\r\n          if (s._a.currentTime.toFixed(3) !== position1K.toFixed(3)) {\r\n\r\n            /**\r\n             * DOM/JS errors/exceptions to watch out for:\r\n             * if seek is beyond (loaded?) position, \"DOM exception 11\"\r\n             * \"INDEX_SIZE_ERR\": DOM exception 1\r\n             */\r\n            sm2._wD(s.id + ': setPosition(' + position1K + ')');\r\n\r\n            try {\r\n              s._a.currentTime = position1K;\r\n              if (s.playState === 0 || s.paused) {\r\n                // allow seek without auto-play/resume\r\n                s._a.pause();\r\n              }\r\n            } catch(e) {\r\n              sm2._wD(s.id + ': setPosition(' + position1K + ') failed: ' + e.message, 2);\r\n            }\r\n\r\n          }\r\n\r\n        } else if (position1K) {\r\n\r\n          // warn on non-zero seek attempts\r\n          sm2._wD(s.id + ': setPosition(' + position1K + '): Cannot seek yet, sound not ready', 2);\r\n          return s;\r\n\r\n        }\r\n\r\n        if (s.paused) {\r\n\r\n          // if paused, refresh UI right away by forcing update\r\n          s._onTimer(true);\r\n\r\n        }\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Pauses sound playback.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.pause = function(_bCallFlash) {\r\n\r\n      if (s.paused || (s.playState === 0 && s.readyState !== 1)) return s;\r\n\r\n      sm2._wD(s.id + ': pause()');\r\n      s.paused = true;\r\n\r\n      if (!s.isHTML5) {\r\n        if (_bCallFlash || _bCallFlash === _undefined) {\r\n          flash._pause(s.id, s._iO.multiShot);\r\n        }\r\n      } else {\r\n        s._setup_html5().pause();\r\n        stop_html5_timer();\r\n      }\r\n\r\n      if (s._iO.onpause) {\r\n        s._iO.onpause.apply(s);\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Resumes sound playback.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    /**\r\n     * When auto-loaded streams pause on buffer full they have a playState of 0.\r\n     * We need to make sure that the playState is set to 1 when these streams \"resume\".\r\n     * When a paused stream is resumed, we need to trigger the onplay() callback if it\r\n     * hasn't been called already. In this case since the sound is being played for the\r\n     * first time, I think it's more appropriate to call onplay() rather than onresume().\r\n     */\r\n\r\n    this.resume = function() {\r\n\r\n      var instanceOptions = s._iO;\r\n\r\n      if (!s.paused) return s;\r\n\r\n      sm2._wD(s.id + ': resume()');\r\n      s.paused = false;\r\n      s.playState = 1;\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        if (instanceOptions.isMovieStar && !instanceOptions.serverURL) {\r\n          // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.\r\n          s.setPosition(s.position);\r\n        }\r\n\r\n        // flash method is toggle-based (pause/resume)\r\n        flash._pause(s.id, instanceOptions.multiShot);\r\n\r\n      } else {\r\n\r\n        s._setup_html5().play();\r\n        start_html5_timer();\r\n\r\n      }\r\n\r\n      if (!onplay_called && instanceOptions.onplay) {\r\n\r\n        instanceOptions.onplay.apply(s);\r\n        onplay_called = true;\r\n\r\n      } else if (instanceOptions.onresume) {\r\n\r\n        instanceOptions.onresume.apply(s);\r\n\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Toggles sound playback.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.togglePause = function() {\r\n\r\n      sm2._wD(s.id + ': togglePause()');\r\n\r\n      if (s.playState === 0) {\r\n        s.play({\r\n          position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale)\r\n        });\r\n        return s;\r\n      }\r\n\r\n      if (s.paused) {\r\n        s.resume();\r\n      } else {\r\n        s.pause();\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the panning (L-R) effect.\r\n     *\r\n     * @param {number} nPan The pan value (-100 to 100)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setPan = function(nPan, bInstanceOnly) {\r\n\r\n      if (nPan === _undefined) {\r\n        nPan = 0;\r\n      }\r\n\r\n      if (bInstanceOnly === _undefined) {\r\n        bInstanceOnly = false;\r\n      }\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setPan(s.id, nPan);\r\n      } // else { no HTML5 pan? }\r\n\r\n      s._iO.pan = nPan;\r\n\r\n      if (!bInstanceOnly) {\r\n        s.pan = nPan;\r\n        s.options.pan = nPan;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Sets the volume.\r\n     *\r\n     * @param {number} nVol The volume value (0 to 100)\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.setVolume = function(nVol, _bInstanceOnly) {\r\n\r\n      /**\r\n       * Note: Setting volume has no effect on iOS \"special snowflake\" devices.\r\n       * Hardware volume control overrides software, and volume\r\n       * will always return 1 per Apple docs. (iOS 4 + 5.)\r\n       * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html\r\n       */\r\n\r\n      if (nVol === _undefined) {\r\n        nVol = 100;\r\n      }\r\n\r\n      if (_bInstanceOnly === _undefined) {\r\n        _bInstanceOnly = false;\r\n      }\r\n\r\n      if (!s.isHTML5) {\r\n\r\n        flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted ? 0 : nVol);\r\n\r\n      } else if (s._a) {\r\n\r\n        if (sm2.muted && !s.muted) {\r\n          s.muted = true;\r\n          s._a.muted = true;\r\n        }\r\n\r\n        // valid range for native HTML5 Audio(): 0-1\r\n        s._a.volume = Math.max(0, Math.min(1, nVol / 100));\r\n\r\n      }\r\n\r\n      s._iO.volume = nVol;\r\n\r\n      if (!_bInstanceOnly) {\r\n        s.volume = nVol;\r\n        s.options.volume = nVol;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Mutes the sound.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.mute = function() {\r\n\r\n      s.muted = true;\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setVolume(s.id, 0);\r\n      } else if (s._a) {\r\n        s._a.muted = true;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Unmutes the sound.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.unmute = function() {\r\n\r\n      s.muted = false;\r\n      var hasIO = (s._iO.volume !== _undefined);\r\n\r\n      if (!s.isHTML5) {\r\n        flash._setVolume(s.id, hasIO ? s._iO.volume : s.options.volume);\r\n      } else if (s._a) {\r\n        s._a.muted = false;\r\n      }\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    /**\r\n     * Toggles the muted state of a sound.\r\n     *\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.toggleMute = function() {\r\n\r\n      return (s.muted ? s.unmute() : s.mute());\r\n\r\n    };\r\n\r\n    /**\r\n     * Registers a callback to be fired when a sound reaches a given position during playback.\r\n     *\r\n     * @param {number} nPosition The position to watch for\r\n     * @param {function} oMethod The relevant callback to fire\r\n     * @param {object} oScope Optional: The scope to apply the callback to\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.onPosition = function(nPosition, oMethod, oScope) {\r\n\r\n      // TODO: basic dupe checking?\r\n\r\n      onPositionItems.push({\r\n        position: parseInt(nPosition, 10),\r\n        method: oMethod,\r\n        scope: (oScope !== _undefined ? oScope : s),\r\n        fired: false\r\n      });\r\n\r\n      return s;\r\n\r\n    };\r\n\r\n    // legacy/backwards-compability: lower-case method name\r\n    this.onposition = this.onPosition;\r\n\r\n    /**\r\n     * Removes registered callback(s) from a sound, by position and/or callback.\r\n     *\r\n     * @param {number} nPosition The position to clear callback(s) for\r\n     * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position\r\n     * @return {SMSound} The SMSound object\r\n     */\r\n\r\n    this.clearOnPosition = function(nPosition, oMethod) {\r\n\r\n      var i;\r\n\r\n      nPosition = parseInt(nPosition, 10);\r\n\r\n      if (isNaN(nPosition)) {\r\n        // safety check\r\n        return;\r\n      }\r\n\r\n      for (i = 0; i < onPositionItems.length; i++) {\r\n\r\n        if (nPosition === onPositionItems[i].position) {\r\n          // remove this item if no method was specified, or, if the method matches\r\n\r\n          if (!oMethod || (oMethod === onPositionItems[i].method)) {\r\n\r\n            if (onPositionItems[i].fired) {\r\n              // decrement \"fired\" counter, too\r\n              onPositionFired--;\r\n            }\r\n\r\n            onPositionItems.splice(i, 1);\r\n\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    this._processOnPosition = function() {\r\n\r\n      var i, item, j = onPositionItems.length;\r\n\r\n      if (!j || !s.playState || onPositionFired >= j) return false;\r\n\r\n      for (i = j - 1; i >= 0; i--) {\r\n\r\n        item = onPositionItems[i];\r\n\r\n        if (!item.fired && s.position >= item.position) {\r\n\r\n          item.fired = true;\r\n          onPositionFired++;\r\n          item.method.apply(item.scope, [item.position]);\r\n\r\n          //  reset j -- onPositionItems.length can be changed in the item callback above... occasionally breaking the loop.\r\n          j = onPositionItems.length;\r\n\r\n        }\r\n\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    this._resetOnPosition = function(nPosition) {\r\n\r\n      // reset \"fired\" for items interested in this position\r\n      var i, item, j = onPositionItems.length;\r\n\r\n      if (!j) return false;\r\n\r\n      for (i = j - 1; i >= 0; i--) {\r\n\r\n        item = onPositionItems[i];\r\n\r\n        if (item.fired && nPosition <= item.position) {\r\n          item.fired = false;\r\n          onPositionFired--;\r\n        }\r\n\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    /**\r\n     * SMSound() private internals\r\n     * --------------------------------\r\n     */\r\n\r\n    applyFromTo = function() {\r\n\r\n      var instanceOptions = s._iO,\r\n          f = instanceOptions.from,\r\n          t = instanceOptions.to,\r\n          start, end;\r\n\r\n      end = function() {\r\n\r\n        // end has been reached.\r\n        sm2._wD(s.id + ': \"To\" time of ' + t + ' reached.');\r\n\r\n        // detach listener\r\n        s.clearOnPosition(t, end);\r\n\r\n        // stop should clear this, too\r\n        s.stop();\r\n\r\n      };\r\n\r\n      start = function() {\r\n\r\n        sm2._wD(s.id + ': Playing \"from\" ' + f);\r\n\r\n        // add listener for end\r\n        if (t !== null && !isNaN(t)) {\r\n          s.onPosition(t, end);\r\n        }\r\n\r\n      };\r\n\r\n      if (f !== null && !isNaN(f)) {\r\n\r\n        // apply to instance options, guaranteeing correct start position.\r\n        instanceOptions.position = f;\r\n\r\n        // multiShot timing can't be tracked, so prevent that.\r\n        instanceOptions.multiShot = false;\r\n\r\n        start();\r\n\r\n      }\r\n\r\n      // return updated instanceOptions including starting position\r\n      return instanceOptions;\r\n\r\n    };\r\n\r\n    attachOnPosition = function() {\r\n\r\n      var item,\r\n          op = s._iO.onposition;\r\n\r\n      // attach onposition things, if any, now.\r\n\r\n      if (op) {\r\n\r\n        for (item in op) {\r\n          if (op.hasOwnProperty(item)) {\r\n            s.onPosition(parseInt(item, 10), op[item]);\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    detachOnPosition = function() {\r\n\r\n      var item,\r\n          op = s._iO.onposition;\r\n\r\n      // detach any onposition()-style listeners.\r\n\r\n      if (op) {\r\n\r\n        for (item in op) {\r\n          if (op.hasOwnProperty(item)) {\r\n            s.clearOnPosition(parseInt(item, 10));\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    start_html5_timer = function() {\r\n\r\n      if (s.isHTML5) {\r\n        startTimer(s);\r\n      }\r\n\r\n    };\r\n\r\n    stop_html5_timer = function() {\r\n\r\n      if (s.isHTML5) {\r\n        stopTimer(s);\r\n      }\r\n\r\n    };\r\n\r\n    resetProperties = function(retainPosition) {\r\n\r\n      if (!retainPosition) {\r\n        onPositionItems = [];\r\n        onPositionFired = 0;\r\n      }\r\n\r\n      onplay_called = false;\r\n\r\n      s._hasTimer = null;\r\n      s._a = null;\r\n      s._html5_canplay = false;\r\n      s.bytesLoaded = null;\r\n      s.bytesTotal = null;\r\n      s.duration = (s._iO && s._iO.duration ? s._iO.duration : null);\r\n      s.durationEstimate = null;\r\n      s.buffered = [];\r\n\r\n      // legacy: 1D array\r\n      s.eqData = [];\r\n\r\n      s.eqData.left = [];\r\n      s.eqData.right = [];\r\n\r\n      s.failures = 0;\r\n      s.isBuffering = false;\r\n      s.instanceOptions = {};\r\n      s.instanceCount = 0;\r\n      s.loaded = false;\r\n      s.metadata = {};\r\n\r\n      // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success\r\n      s.readyState = 0;\r\n\r\n      s.muted = false;\r\n      s.paused = false;\r\n\r\n      s.peakData = {\r\n        left: 0,\r\n        right: 0\r\n      };\r\n\r\n      s.waveformData = {\r\n        left: [],\r\n        right: []\r\n      };\r\n\r\n      s.playState = 0;\r\n      s.position = null;\r\n\r\n      s.id3 = {};\r\n\r\n    };\r\n\r\n    resetProperties();\r\n\r\n    /**\r\n     * Pseudo-private SMSound internals\r\n     * --------------------------------\r\n     */\r\n\r\n    this._onTimer = function(bForce) {\r\n\r\n      /**\r\n       * HTML5-only _whileplaying() etc.\r\n       * called from both HTML5 native events, and polling/interval-based timers\r\n       * mimics flash and fires only when time/duration change, so as to be polling-friendly\r\n       */\r\n\r\n      var duration, isNew = false, time, x = {};\r\n\r\n      if (s._hasTimer || bForce) {\r\n\r\n        // TODO: May not need to track readyState (1 = loading)\r\n\r\n        if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) {\r\n\r\n          duration = s._get_html5_duration();\r\n\r\n          if (duration !== lastHTML5State.duration) {\r\n\r\n            lastHTML5State.duration = duration;\r\n            s.duration = duration;\r\n            isNew = true;\r\n\r\n          }\r\n\r\n          // TODO: investigate why this goes wack if not set/re-set each time.\r\n          s.durationEstimate = s.duration;\r\n\r\n          time = (s._a.currentTime * msecScale || 0);\r\n\r\n          if (time !== lastHTML5State.time) {\r\n\r\n            lastHTML5State.time = time;\r\n            isNew = true;\r\n\r\n          }\r\n\r\n          if (isNew || bForce) {\r\n\r\n            s._whileplaying(time, x, x, x, x);\r\n\r\n          }\r\n\r\n        }/* else {\r\n\r\n          // sm2._wD('_onTimer: Warn for \"'+s.id+'\": '+(!s._a?'Could not find element. ':'')+(s.playState === 0?'playState bad, 0?':'playState = '+s.playState+', OK'));\r\n\r\n          return false;\r\n\r\n        }*/\r\n\r\n      }\r\n\r\n      return isNew;\r\n\r\n    };\r\n\r\n    this._get_html5_duration = function() {\r\n\r\n      var instanceOptions = s._iO,\r\n          // if audio object exists, use its duration - else, instance option duration (if provided - it's a hack, really, and should be retired) OR null\r\n          d = (s._a && s._a.duration ? s._a.duration * msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)),\r\n          result = (d && !isNaN(d) && d !== Infinity ? d : null);\r\n\r\n      return result;\r\n\r\n    };\r\n\r\n    this._apply_loop = function(a, nLoops) {\r\n\r\n      /**\r\n       * boolean instead of \"loop\", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop\r\n       * note that loop is either off or infinite under HTML5, unlike Flash which allows arbitrary loop counts to be specified.\r\n       */\r\n\r\n      // <d>\r\n      if (!a.loop && nLoops > 1) {\r\n        sm2._wD('Note: Native HTML5 looping is infinite.', 1);\r\n      }\r\n      // </d>\r\n\r\n      a.loop = (nLoops > 1 ? 'loop' : '');\r\n\r\n    };\r\n\r\n    this._setup_html5 = function(options) {\r\n\r\n      var instanceOptions = mixin(s._iO, options),\r\n          a = useGlobalHTML5Audio ? globalHTML5Audio : s._a,\r\n          dURL = decodeURI(instanceOptions.url),\r\n          sameURL;\r\n\r\n      /**\r\n       * \"First things first, I, Poppa...\" (reset the previous state of the old sound, if playing)\r\n       * Fixes case with devices that can only play one sound at a time\r\n       * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state\r\n       */\r\n\r\n      if (useGlobalHTML5Audio) {\r\n\r\n        if (dURL === decodeURI(lastGlobalHTML5URL)) {\r\n          // global HTML5 audio: re-use of URL\r\n          sameURL = true;\r\n        }\r\n\r\n      } else if (dURL === decodeURI(lastURL)) {\r\n\r\n        // options URL is the same as the \"last\" URL, and we used (loaded) it\r\n        sameURL = true;\r\n\r\n      }\r\n\r\n      if (a) {\r\n\r\n        if (a._s) {\r\n\r\n          if (useGlobalHTML5Audio) {\r\n\r\n            if (a._s && a._s.playState && !sameURL) {\r\n\r\n              // global HTML5 audio case, and loading a new URL. stop the currently-playing one.\r\n              a._s.stop();\r\n\r\n            }\r\n\r\n          } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) {\r\n\r\n            // non-global HTML5 reuse case: same url, ignore request\r\n            s._apply_loop(a, instanceOptions.loops);\r\n\r\n            return a;\r\n\r\n          }\r\n\r\n        }\r\n\r\n        if (!sameURL) {\r\n\r\n          // don't retain onPosition() stuff with new URLs.\r\n\r\n          if (lastURL) {\r\n            resetProperties(false);\r\n          }\r\n\r\n          // assign new HTML5 URL\r\n\r\n          a.src = instanceOptions.url;\r\n\r\n          s.url = instanceOptions.url;\r\n\r\n          lastURL = instanceOptions.url;\r\n\r\n          lastGlobalHTML5URL = instanceOptions.url;\r\n\r\n          a._called_load = false;\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n          s._a = new Audio(instanceOptions.url);\r\n          s._a.load();\r\n\r\n        } else {\r\n\r\n          // null for stupid Opera 9.64 case\r\n          s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio());\r\n\r\n        }\r\n\r\n        // assign local reference\r\n        a = s._a;\r\n\r\n        a._called_load = false;\r\n\r\n        if (useGlobalHTML5Audio) {\r\n\r\n          globalHTML5Audio = a;\r\n\r\n        }\r\n\r\n      }\r\n\r\n      s.isHTML5 = true;\r\n\r\n      // store a ref on the track\r\n      s._a = a;\r\n\r\n      // store a ref on the audio\r\n      a._s = s;\r\n\r\n      add_html5_events();\r\n\r\n      s._apply_loop(a, instanceOptions.loops);\r\n\r\n      if (instanceOptions.autoLoad || instanceOptions.autoPlay) {\r\n\r\n        s.load();\r\n\r\n      } else {\r\n\r\n        // early HTML5 implementation (non-standard)\r\n        a.autobuffer = false;\r\n\r\n        // standard ('none' is also an option.)\r\n        a.preload = 'auto';\r\n\r\n      }\r\n\r\n      return a;\r\n\r\n    };\r\n\r\n    add_html5_events = function() {\r\n\r\n      if (s._a._added_events) return false;\r\n\r\n      var f;\r\n\r\n      function add(oEvt, oFn, bCapture) {\r\n        return s._a ? s._a.addEventListener(oEvt, oFn, bCapture || false) : null;\r\n      }\r\n\r\n      s._a._added_events = true;\r\n\r\n      for (f in html5_events) {\r\n        if (html5_events.hasOwnProperty(f)) {\r\n          add(f, html5_events[f]);\r\n        }\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    remove_html5_events = function() {\r\n\r\n      // Remove event listeners\r\n\r\n      var f;\r\n\r\n      function remove(oEvt, oFn, bCapture) {\r\n        return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture || false) : null);\r\n      }\r\n\r\n      sm2._wD(s.id + ': Removing event listeners');\r\n      s._a._added_events = false;\r\n\r\n      for (f in html5_events) {\r\n        if (html5_events.hasOwnProperty(f)) {\r\n          remove(f, html5_events[f]);\r\n        }\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * Pseudo-private event internals\r\n     * ------------------------------\r\n     */\r\n\r\n    this._onload = function(nSuccess) {\r\n\r\n      var fN,\r\n          // check for duration to prevent false positives from flash 8 when loading from cache.\r\n          loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration);\r\n\r\n      // <d>\r\n      fN = s.id + ': ';\r\n      sm2._wD(fN + (loadOK ? 'onload()' : 'Failed to load / invalid sound?' + (!s.duration ? ' Zero-length duration reported.' : ' -') + ' (' + s.url + ')'), (loadOK ? 1 : 2));\r\n\r\n      if (!loadOK && !s.isHTML5) {\r\n        if (sm2.sandbox.noRemote === true) {\r\n          sm2._wD(fN + str('noNet'), 1);\r\n        }\r\n        if (sm2.sandbox.noLocal === true) {\r\n          sm2._wD(fN + str('noLocal'), 1);\r\n        }\r\n      }\r\n      // </d>\r\n\r\n      s.loaded = loadOK;\r\n      s.readyState = (loadOK ? 3 : 2);\r\n      s._onbufferchange(0);\r\n\r\n      if (!loadOK && !s.isHTML5) {\r\n        // note: no error code from Flash.\r\n        s._onerror();\r\n      }\r\n\r\n      if (s._iO.onload) {\r\n        wrapCallback(s, function() {\r\n          s._iO.onload.apply(s, [loadOK]);\r\n        });\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    this._onerror = function(errorCode, description) {\r\n\r\n      // https://html.spec.whatwg.org/multipage/embedded-content.html#error-codes\r\n      if (s._iO.onerror) {\r\n        wrapCallback(s, function() {\r\n          s._iO.onerror.apply(s, [errorCode, description]);\r\n        });\r\n      }\r\n\r\n    };\r\n\r\n    this._onbufferchange = function(nIsBuffering) {\r\n\r\n      // ignore if not playing\r\n      if (s.playState === 0) return false;\r\n\r\n      if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) return false;\r\n\r\n      s.isBuffering = (nIsBuffering === 1);\r\n\r\n      if (s._iO.onbufferchange) {\r\n        sm2._wD(s.id + ': Buffer state change: ' + nIsBuffering);\r\n        s._iO.onbufferchange.apply(s, [nIsBuffering]);\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    /**\r\n     * Playback may have stopped due to buffering, or related reason.\r\n     * This state can be encountered on iOS < 6 when auto-play is blocked.\r\n     */\r\n\r\n    this._onsuspend = function() {\r\n\r\n      if (s._iO.onsuspend) {\r\n        sm2._wD(s.id + ': Playback suspended');\r\n        s._iO.onsuspend.apply(s);\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    /**\r\n     * flash 9/movieStar + RTMP-only method, should fire only once at most\r\n     * at this point we just recreate failed sounds rather than trying to reconnect\r\n     */\r\n\r\n    this._onfailure = function(msg, level, code) {\r\n\r\n      s.failures++;\r\n      sm2._wD(s.id + ': Failure (' + s.failures + '): ' + msg);\r\n\r\n      if (s._iO.onfailure && s.failures === 1) {\r\n        s._iO.onfailure(msg, level, code);\r\n      } else {\r\n        sm2._wD(s.id + ': Ignoring failure');\r\n      }\r\n\r\n    };\r\n\r\n    /**\r\n     * flash 9/movieStar + RTMP-only method for unhandled warnings/exceptions from Flash\r\n     * e.g., RTMP \"method missing\" warning (non-fatal) for getStreamLength on server\r\n     */\r\n\r\n    this._onwarning = function(msg, level, code) {\r\n\r\n      if (s._iO.onwarning) {\r\n        s._iO.onwarning(msg, level, code);\r\n      }\r\n\r\n    };\r\n\r\n    this._onfinish = function() {\r\n\r\n      // store local copy before it gets trashed...\r\n      var io_onfinish = s._iO.onfinish;\r\n\r\n      s._onbufferchange(0);\r\n      s._resetOnPosition(0);\r\n\r\n      // reset some state items\r\n      if (s.instanceCount) {\r\n\r\n        s.instanceCount--;\r\n\r\n        if (!s.instanceCount) {\r\n\r\n          // remove onPosition listeners, if any\r\n          detachOnPosition();\r\n\r\n          // reset instance options\r\n          s.playState = 0;\r\n          s.paused = false;\r\n          s.instanceCount = 0;\r\n          s.instanceOptions = {};\r\n          s._iO = {};\r\n          stop_html5_timer();\r\n\r\n          // reset position, too\r\n          if (s.isHTML5) {\r\n            s.position = 0;\r\n          }\r\n\r\n        }\r\n\r\n        if (!s.instanceCount || s._iO.multiShotEvents) {\r\n          // fire onfinish for last, or every instance\r\n          if (io_onfinish) {\r\n            sm2._wD(s.id + ': onfinish()');\r\n            wrapCallback(s, function() {\r\n              io_onfinish.apply(s);\r\n            });\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {\r\n\r\n      var instanceOptions = s._iO;\r\n\r\n      s.bytesLoaded = nBytesLoaded;\r\n      s.bytesTotal = nBytesTotal;\r\n      s.duration = Math.floor(nDuration);\r\n      s.bufferLength = nBufferLength;\r\n\r\n      if (!s.isHTML5 && !instanceOptions.isMovieStar) {\r\n\r\n        if (instanceOptions.duration) {\r\n          // use duration from options, if specified and larger. nobody should be specifying duration in options, actually, and it should be retired.\r\n          s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration;\r\n        } else {\r\n          s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10);\r\n        }\r\n\r\n      } else {\r\n\r\n        s.durationEstimate = s.duration;\r\n\r\n      }\r\n\r\n      // for flash, reflect sequential-load-style buffering\r\n      if (!s.isHTML5) {\r\n        s.buffered = [{\r\n          start: 0,\r\n          end: s.duration\r\n        }];\r\n      }\r\n\r\n      // allow whileloading to fire even if \"load\" fired under HTML5, due to HTTP range/partials\r\n      if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) {\r\n        instanceOptions.whileloading.apply(s);\r\n      }\r\n\r\n    };\r\n\r\n    this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {\r\n\r\n      var instanceOptions = s._iO,\r\n          eqLeft;\r\n\r\n      // flash safety net\r\n      if (isNaN(nPosition) || nPosition === null) return false;\r\n\r\n      // Safari HTML5 play() may return small -ve values when starting from position: 0, eg. -50.120396875. Unexpected/invalid per W3, I think. Normalize to 0.\r\n      s.position = Math.max(0, nPosition);\r\n\r\n      s._processOnPosition();\r\n\r\n      if (!s.isHTML5 && fV > 8) {\r\n\r\n        if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) {\r\n          s.peakData = {\r\n            left: oPeakData.leftPeak,\r\n            right: oPeakData.rightPeak\r\n          };\r\n        }\r\n\r\n        if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) {\r\n          s.waveformData = {\r\n            left: oWaveformDataLeft.split(','),\r\n            right: oWaveformDataRight.split(',')\r\n          };\r\n        }\r\n\r\n        if (instanceOptions.useEQData) {\r\n          if (oEQData !== _undefined && oEQData && oEQData.leftEQ) {\r\n            eqLeft = oEQData.leftEQ.split(',');\r\n            s.eqData = eqLeft;\r\n            s.eqData.left = eqLeft;\r\n            if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) {\r\n              s.eqData.right = oEQData.rightEQ.split(',');\r\n            }\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n      if (s.playState === 1) {\r\n\r\n        // special case/hack: ensure buffering is false if loading from cache (and not yet started)\r\n        if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) {\r\n          s._onbufferchange(0);\r\n        }\r\n\r\n        if (instanceOptions.whileplaying) {\r\n          // flash may call after actual finish\r\n          instanceOptions.whileplaying.apply(s);\r\n        }\r\n\r\n      }\r\n\r\n      return true;\r\n\r\n    };\r\n\r\n    this._oncaptiondata = function(oData) {\r\n\r\n      /**\r\n       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n       *\r\n       * @param {object} oData\r\n       */\r\n\r\n      sm2._wD(s.id + ': Caption data received.');\r\n\r\n      s.captiondata = oData;\r\n\r\n      if (s._iO.oncaptiondata) {\r\n        s._iO.oncaptiondata.apply(s, [oData]);\r\n      }\r\n\r\n    };\r\n\r\n    this._onmetadata = function(oMDProps, oMDData) {\r\n\r\n      /**\r\n       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature\r\n       * RTMP may include song title, MovieStar content may include encoding info\r\n       *\r\n       * @param {array} oMDProps (names)\r\n       * @param {array} oMDData (values)\r\n       */\r\n\r\n      sm2._wD(s.id + ': Metadata received.');\r\n\r\n      var oData = {}, i, j;\r\n\r\n      for (i = 0, j = oMDProps.length; i < j; i++) {\r\n        oData[oMDProps[i]] = oMDData[i];\r\n      }\r\n\r\n      s.metadata = oData;\r\n\r\n      if (s._iO.onmetadata) {\r\n        s._iO.onmetadata.call(s, s.metadata);\r\n      }\r\n\r\n    };\r\n\r\n    this._onid3 = function(oID3Props, oID3Data) {\r\n\r\n      /**\r\n       * internal: flash 8 + flash 9 ID3 feature\r\n       * may include artist, song title etc.\r\n       *\r\n       * @param {array} oID3Props (names)\r\n       * @param {array} oID3Data (values)\r\n       */\r\n\r\n      sm2._wD(s.id + ': ID3 data received.');\r\n\r\n      var oData = [], i, j;\r\n\r\n      for (i = 0, j = oID3Props.length; i < j; i++) {\r\n        oData[oID3Props[i]] = oID3Data[i];\r\n      }\r\n\r\n      s.id3 = mixin(s.id3, oData);\r\n\r\n      if (s._iO.onid3) {\r\n        s._iO.onid3.apply(s);\r\n      }\r\n\r\n    };\r\n\r\n    // flash/RTMP-only\r\n\r\n    this._onconnect = function(bSuccess) {\r\n\r\n      bSuccess = (bSuccess === 1);\r\n      sm2._wD(s.id + ': ' + (bSuccess ? 'Connected.' : 'Failed to connect? - ' + s.url), (bSuccess ? 1 : 2));\r\n      s.connected = bSuccess;\r\n\r\n      if (bSuccess) {\r\n\r\n        s.failures = 0;\r\n\r\n        if (idCheck(s.id)) {\r\n          if (s.getAutoPlay()) {\r\n            // only update the play state if auto playing\r\n            s.play(_undefined, s.getAutoPlay());\r\n          } else if (s._iO.autoLoad) {\r\n            s.load();\r\n          }\r\n        }\r\n\r\n        if (s._iO.onconnect) {\r\n          s._iO.onconnect.apply(s, [bSuccess]);\r\n        }\r\n\r\n      }\r\n\r\n    };\r\n\r\n    this._ondataerror = function(sError) {\r\n\r\n      // flash 9 wave/eq data handler\r\n      // hack: called at start, and end from flash at/after onfinish()\r\n      if (s.playState > 0) {\r\n        sm2._wD(s.id + ': Data error: ' + sError);\r\n        if (s._iO.ondataerror) {\r\n          s._iO.ondataerror.apply(s);\r\n        }\r\n      }\r\n\r\n    };\r\n\r\n    // <d>\r\n    this._debug();\r\n    // </d>\r\n\r\n  }; // SMSound()\r\n\r\n  /**\r\n   * Private SoundManager internals\r\n   * ------------------------------\r\n   */\r\n\r\n  getDocument = function() {\r\n\r\n    return (doc.body || doc.getElementsByTagName('div')[0]);\r\n\r\n  };\r\n\r\n  id = function(sID) {\r\n\r\n    return doc.getElementById(sID);\r\n\r\n  };\r\n\r\n  mixin = function(oMain, oAdd) {\r\n\r\n    // non-destructive merge\r\n    var o1 = (oMain || {}), o2, o;\r\n\r\n    // if unspecified, o2 is the default options object\r\n    o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd);\r\n\r\n    for (o in o2) {\r\n\r\n      if (o2.hasOwnProperty(o) && o1[o] === _undefined) {\r\n\r\n        if (typeof o2[o] !== 'object' || o2[o] === null) {\r\n\r\n          // assign directly\r\n          o1[o] = o2[o];\r\n\r\n        } else {\r\n\r\n          // recurse through o2\r\n          o1[o] = mixin(o1[o], o2[o]);\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return o1;\r\n\r\n  };\r\n\r\n  wrapCallback = function(oSound, callback) {\r\n\r\n    /**\r\n     * 03/03/2013: Fix for Flash Player 11.6.602.171 + Flash 8 (flashVersion = 8) SWF issue\r\n     * setTimeout() fix for certain SMSound callbacks like onload() and onfinish(), where subsequent calls like play() and load() fail when Flash Player 11.6.602.171 is installed, and using soundManager with flashVersion = 8 (which is the default).\r\n     * Not sure of exact cause. Suspect race condition and/or invalid (NaN-style) position argument trickling down to the next JS -> Flash _start() call, in the play() case.\r\n     * Fix: setTimeout() to yield, plus safer null / NaN checking on position argument provided to Flash.\r\n     * https://getsatisfaction.com/schillmania/topics/recent_chrome_update_seems_to_have_broken_my_sm2_audio_player\r\n     */\r\n    if (!oSound.isHTML5 && fV === 8) {\r\n      window.setTimeout(callback, 0);\r\n    } else {\r\n      callback();\r\n    }\r\n\r\n  };\r\n\r\n  // additional soundManager properties that soundManager.setup() will accept\r\n\r\n  extraOptions = {\r\n    onready: 1,\r\n    ontimeout: 1,\r\n    defaultOptions: 1,\r\n    flash9Options: 1,\r\n    movieStarOptions: 1\r\n  };\r\n\r\n  assign = function(o, oParent) {\r\n\r\n    /**\r\n     * recursive assignment of properties, soundManager.setup() helper\r\n     * allows property assignment based on whitelist\r\n     */\r\n\r\n    var i,\r\n        result = true,\r\n        hasParent = (oParent !== _undefined),\r\n        setupOptions = sm2.setupOptions,\r\n        bonusOptions = extraOptions;\r\n\r\n    // <d>\r\n\r\n    // if soundManager.setup() called, show accepted parameters.\r\n\r\n    if (o === _undefined) {\r\n\r\n      result = [];\r\n\r\n      for (i in setupOptions) {\r\n\r\n        if (setupOptions.hasOwnProperty(i)) {\r\n          result.push(i);\r\n        }\r\n\r\n      }\r\n\r\n      for (i in bonusOptions) {\r\n\r\n        if (bonusOptions.hasOwnProperty(i)) {\r\n\r\n          if (typeof sm2[i] === 'object') {\r\n            result.push(i + ': {...}');\r\n          } else if (sm2[i] instanceof Function) {\r\n            result.push(i + ': function() {...}');\r\n          } else {\r\n            result.push(i);\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n      sm2._wD(str('setup', result.join(', ')));\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    // </d>\r\n\r\n    for (i in o) {\r\n\r\n      if (o.hasOwnProperty(i)) {\r\n\r\n        // if not an {object} we want to recurse through...\r\n\r\n        if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) {\r\n\r\n          // check \"allowed\" options\r\n\r\n          if (hasParent && bonusOptions[oParent] !== _undefined) {\r\n\r\n            // valid recursive / nested object option, eg., { defaultOptions: { volume: 50 } }\r\n            sm2[oParent][i] = o[i];\r\n\r\n          } else if (setupOptions[i] !== _undefined) {\r\n\r\n            // special case: assign to setupOptions object, which soundManager property references\r\n            sm2.setupOptions[i] = o[i];\r\n\r\n            // assign directly to soundManager, too\r\n            sm2[i] = o[i];\r\n\r\n          } else if (bonusOptions[i] === _undefined) {\r\n\r\n            // invalid or disallowed parameter. complain.\r\n            complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n            result = false;\r\n\r\n          } else if (sm2[i] instanceof Function) {\r\n\r\n            /**\r\n             * valid extraOptions (bonusOptions) parameter.\r\n             * is it a method, like onready/ontimeout? call it.\r\n             * multiple parameters should be in an array, eg. soundManager.setup({onready: [myHandler, myScope]});\r\n             */\r\n            sm2[i].apply(sm2, (o[i] instanceof Array ? o[i] : [o[i]]));\r\n\r\n          } else {\r\n\r\n            // good old-fashioned direct assignment\r\n            sm2[i] = o[i];\r\n\r\n          }\r\n\r\n        } else if (bonusOptions[i] === _undefined) {\r\n\r\n          // recursion case, eg., { defaultOptions: { ... } }\r\n\r\n          // invalid or disallowed parameter. complain.\r\n          complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);\r\n\r\n          result = false;\r\n\r\n        } else {\r\n\r\n          // recurse through object\r\n          return assign(o[i], i);\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  function preferFlashCheck(kind) {\r\n\r\n    // whether flash should play a given type\r\n    return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind]));\r\n\r\n  }\r\n\r\n  /**\r\n   * Internal DOM2-level event helpers\r\n   * ---------------------------------\r\n   */\r\n\r\n  event = (function() {\r\n\r\n    // normalize event methods\r\n    var old = (window.attachEvent),\r\n    evt = {\r\n      add: (old ? 'attachEvent' : 'addEventListener'),\r\n      remove: (old ? 'detachEvent' : 'removeEventListener')\r\n    };\r\n\r\n    // normalize \"on\" event prefix, optional capture argument\r\n    function getArgs(oArgs) {\r\n\r\n      var args = slice.call(oArgs),\r\n          len = args.length;\r\n\r\n      if (old) {\r\n        // prefix\r\n        args[1] = 'on' + args[1];\r\n        if (len > 3) {\r\n          // no capture\r\n          args.pop();\r\n        }\r\n      } else if (len === 3) {\r\n        args.push(false);\r\n      }\r\n\r\n      return args;\r\n\r\n    }\r\n\r\n    function apply(args, sType) {\r\n\r\n      // normalize and call the event method, with the proper arguments\r\n      var element = args.shift(),\r\n          method = [evt[sType]];\r\n\r\n      if (old) {\r\n        // old IE can't do apply().\r\n        element[method](args[0], args[1]);\r\n      } else {\r\n        element[method].apply(element, args);\r\n      }\r\n\r\n    }\r\n\r\n    function add() {\r\n      apply(getArgs(arguments), 'add');\r\n    }\r\n\r\n    function remove() {\r\n      apply(getArgs(arguments), 'remove');\r\n    }\r\n\r\n    return {\r\n      add: add,\r\n      remove: remove\r\n    };\r\n\r\n  }());\r\n\r\n  /**\r\n   * Internal HTML5 event handling\r\n   * -----------------------------\r\n   */\r\n\r\n  function html5_event(oFn) {\r\n\r\n    // wrap html5 event handlers so we don't call them on destroyed and/or unloaded sounds\r\n\r\n    return function(e) {\r\n\r\n      var s = this._s,\r\n          result;\r\n\r\n      if (!s || !s._a) {\r\n        // <d>\r\n        if (s && s.id) {\r\n          sm2._wD(s.id + ': Ignoring ' + e.type);\r\n        } else {\r\n          sm2._wD(h5 + 'Ignoring ' + e.type);\r\n        }\r\n        // </d>\r\n        result = null;\r\n      } else {\r\n        result = oFn.call(this, e);\r\n      }\r\n\r\n      return result;\r\n\r\n    };\r\n\r\n  }\r\n\r\n  html5_events = {\r\n\r\n    // HTML5 event-name-to-handler map\r\n\r\n    abort: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': abort');\r\n\r\n    }),\r\n\r\n    // enough has loaded to play\r\n\r\n    canplay: html5_event(function() {\r\n\r\n      var s = this._s,\r\n          position1K;\r\n\r\n      if (s._html5_canplay) {\r\n        // this event has already fired. ignore.\r\n        return;\r\n      }\r\n\r\n      s._html5_canplay = true;\r\n      sm2._wD(s.id + ': canplay');\r\n      s._onbufferchange(0);\r\n\r\n      // position according to instance options\r\n      position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position / msecScale : null);\r\n\r\n      // set the position if position was provided before the sound loaded\r\n      if (this.currentTime !== position1K) {\r\n        sm2._wD(s.id + ': canplay: Setting position to ' + position1K);\r\n        try {\r\n          this.currentTime = position1K;\r\n        } catch(ee) {\r\n          sm2._wD(s.id + ': canplay: Setting position of ' + position1K + ' failed: ' + ee.message, 2);\r\n        }\r\n      }\r\n\r\n      // hack for HTML5 from/to case\r\n      if (s._iO._oncanplay) {\r\n        s._iO._oncanplay();\r\n      }\r\n\r\n    }),\r\n\r\n    canplaythrough: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      if (!s.loaded) {\r\n        s._onbufferchange(0);\r\n        s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration());\r\n        s._onload(true);\r\n      }\r\n\r\n    }),\r\n\r\n    durationchange: html5_event(function() {\r\n\r\n      // durationchange may fire at various times, probably the safest way to capture accurate/final duration.\r\n\r\n      var s = this._s,\r\n          duration;\r\n\r\n      duration = s._get_html5_duration();\r\n\r\n      if (!isNaN(duration) && duration !== s.duration) {\r\n\r\n        sm2._wD(this._s.id + ': durationchange (' + duration + ')' + (s.duration ? ', previously ' + s.duration : ''));\r\n\r\n        s.durationEstimate = s.duration = duration;\r\n\r\n      }\r\n\r\n    }),\r\n\r\n    // TODO: Reserved for potential use\r\n    /*\r\n    emptied: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': emptied');\r\n\r\n    }),\r\n    */\r\n\r\n    ended: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      sm2._wD(s.id + ': ended');\r\n\r\n      s._onfinish();\r\n\r\n    }),\r\n\r\n    error: html5_event(function() {\r\n\r\n      var description = (html5ErrorCodes[this.error.code] || null);\r\n      sm2._wD(this._s.id + ': HTML5 error, code ' + this.error.code + (description ? ' (' + description + ')' : ''));\r\n      this._s._onload(false);\r\n      this._s._onerror(this.error.code, description);\r\n\r\n    }),\r\n\r\n    loadeddata: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      sm2._wD(s.id + ': loadeddata');\r\n\r\n      // safari seems to nicely report progress events, eventually totalling 100%\r\n      if (!s._loaded && !isSafari) {\r\n        s.duration = s._get_html5_duration();\r\n      }\r\n\r\n    }),\r\n\r\n    loadedmetadata: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': loadedmetadata');\r\n\r\n    }),\r\n\r\n    loadstart: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': loadstart');\r\n      // assume buffering at first\r\n      this._s._onbufferchange(1);\r\n\r\n    }),\r\n\r\n    play: html5_event(function() {\r\n\r\n      // sm2._wD(this._s.id + ': play()');\r\n      // once play starts, no buffering\r\n      this._s._onbufferchange(0);\r\n\r\n    }),\r\n\r\n    playing: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': playing ' + String.fromCharCode(9835));\r\n      // once play starts, no buffering\r\n      this._s._onbufferchange(0);\r\n\r\n    }),\r\n\r\n    progress: html5_event(function(e) {\r\n\r\n      // note: can fire repeatedly after \"loaded\" event, due to use of HTTP range/partials\r\n\r\n      var s = this._s,\r\n          i, j, progStr, buffered = 0,\r\n          isProgress = (e.type === 'progress'),\r\n          ranges = e.target.buffered,\r\n          // firefox 3.6 implements e.loaded/total (bytes)\r\n          loaded = (e.loaded || 0),\r\n          total = (e.total || 1);\r\n\r\n      // reset the \"buffered\" (loaded byte ranges) array\r\n      s.buffered = [];\r\n\r\n      if (ranges && ranges.length) {\r\n\r\n        // if loaded is 0, try TimeRanges implementation as % of load\r\n        // https://developer.mozilla.org/en/DOM/TimeRanges\r\n\r\n        // re-build \"buffered\" array\r\n        // HTML5 returns seconds. SM2 API uses msec for setPosition() etc., whether Flash or HTML5.\r\n        for (i = 0, j = ranges.length; i < j; i++) {\r\n          s.buffered.push({\r\n            start: ranges.start(i) * msecScale,\r\n            end: ranges.end(i) * msecScale\r\n          });\r\n        }\r\n\r\n        // use the last value locally\r\n        buffered = (ranges.end(0) - ranges.start(0)) * msecScale;\r\n\r\n        // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges\r\n        loaded = Math.min(1, buffered / (e.target.duration * msecScale));\r\n\r\n        // <d>\r\n        if (isProgress && ranges.length > 1) {\r\n          progStr = [];\r\n          j = ranges.length;\r\n          for (i = 0; i < j; i++) {\r\n            progStr.push((e.target.buffered.start(i) * msecScale) + '-' + (e.target.buffered.end(i) * msecScale));\r\n          }\r\n          sm2._wD(this._s.id + ': progress, timeRanges: ' + progStr.join(', '));\r\n        }\r\n\r\n        if (isProgress && !isNaN(loaded)) {\r\n          sm2._wD(this._s.id + ': progress, ' + Math.floor(loaded * 100) + '% loaded');\r\n        }\r\n        // </d>\r\n\r\n      }\r\n\r\n      if (!isNaN(loaded)) {\r\n\r\n        // TODO: prevent calls with duplicate values.\r\n        s._whileloading(loaded, total, s._get_html5_duration());\r\n        if (loaded && total && loaded === total) {\r\n          // in case \"onload\" doesn't fire (eg. gecko 1.9.2)\r\n          html5_events.canplaythrough.call(this, e);\r\n        }\r\n\r\n      }\r\n\r\n    }),\r\n\r\n    ratechange: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': ratechange');\r\n\r\n    }),\r\n\r\n    suspend: html5_event(function(e) {\r\n\r\n      // download paused/stopped, may have finished (eg. onload)\r\n      var s = this._s;\r\n\r\n      sm2._wD(this._s.id + ': suspend');\r\n      html5_events.progress.call(this, e);\r\n      s._onsuspend();\r\n\r\n    }),\r\n\r\n    stalled: html5_event(function() {\r\n\r\n      sm2._wD(this._s.id + ': stalled');\r\n\r\n    }),\r\n\r\n    timeupdate: html5_event(function() {\r\n\r\n      this._s._onTimer();\r\n\r\n    }),\r\n\r\n    waiting: html5_event(function() {\r\n\r\n      var s = this._s;\r\n\r\n      // see also: seeking\r\n      sm2._wD(this._s.id + ': waiting');\r\n\r\n      // playback faster than download rate, etc.\r\n      s._onbufferchange(1);\r\n\r\n    })\r\n\r\n  };\r\n\r\n  html5OK = function(iO) {\r\n\r\n    // playability test based on URL or MIME type\r\n\r\n    var result;\r\n\r\n    if (!iO || (!iO.type && !iO.url && !iO.serverURL)) {\r\n\r\n      // nothing to check\r\n      result = false;\r\n\r\n    } else if (iO.serverURL || (iO.type && preferFlashCheck(iO.type))) {\r\n\r\n      // RTMP, or preferring flash\r\n      result = false;\r\n\r\n    } else {\r\n\r\n      // Use type, if specified. Pass data: URIs to HTML5. If HTML5-only mode, no other options, so just give 'er\r\n      result = ((iO.type ? html5CanPlay({ type: iO.type }) : html5CanPlay({ url: iO.url }) || sm2.html5Only || iO.url.match(/data:/i)));\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  html5Unload = function(oAudio) {\r\n\r\n    /**\r\n     * Internal method: Unload media, and cancel any current/pending network requests.\r\n     * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download.\r\n     * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media\r\n     * However, Firefox has been seen loading a relative URL from '' and thus requesting the hosting page on unload.\r\n     * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL.\r\n     */\r\n\r\n    var url;\r\n\r\n    if (oAudio) {\r\n\r\n      // Firefox and Chrome accept short WAVe data: URIs. Chome dislikes audio/wav, but accepts audio/wav for data: MIME.\r\n      // Desktop Safari complains / fails on data: URI, so it gets about:blank.\r\n      url = (isSafari ? emptyURL : (sm2.html5.canPlayType('audio/wav') ? emptyWAV : emptyURL));\r\n\r\n      oAudio.src = url;\r\n\r\n      // reset some state, too\r\n      if (oAudio._called_unload !== _undefined) {\r\n        oAudio._called_load = false;\r\n      }\r\n\r\n    }\r\n\r\n    if (useGlobalHTML5Audio) {\r\n\r\n      // ensure URL state is trashed, also\r\n      lastGlobalHTML5URL = null;\r\n\r\n    }\r\n\r\n    return url;\r\n\r\n  };\r\n\r\n  html5CanPlay = function(o) {\r\n\r\n    /**\r\n     * Try to find MIME, test and return truthiness\r\n     * o = {\r\n     *  url: '/path/to/an.mp3',\r\n     *  type: 'audio/mp3'\r\n     * }\r\n     */\r\n\r\n    if (!sm2.useHTML5Audio || !sm2.hasHTML5) return false;\r\n\r\n    var url = (o.url || null),\r\n        mime = (o.type || null),\r\n        aF = sm2.audioFormats,\r\n        result,\r\n        offset,\r\n        fileExt,\r\n        item;\r\n\r\n    // account for known cases like audio/mp3\r\n\r\n    if (mime && sm2.html5[mime] !== _undefined) return (sm2.html5[mime] && !preferFlashCheck(mime));\r\n\r\n    if (!html5Ext) {\r\n\r\n      html5Ext = [];\r\n\r\n      for (item in aF) {\r\n\r\n        if (aF.hasOwnProperty(item)) {\r\n\r\n          html5Ext.push(item);\r\n\r\n          if (aF[item].related) {\r\n            html5Ext = html5Ext.concat(aF[item].related);\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n      html5Ext = new RegExp('\\\\.(' + html5Ext.join('|') + ')(\\\\?.*)?$', 'i');\r\n\r\n    }\r\n\r\n    // TODO: Strip URL queries, etc.\r\n    fileExt = (url ? url.toLowerCase().match(html5Ext) : null);\r\n\r\n    if (!fileExt || !fileExt.length) {\r\n\r\n      if (!mime) {\r\n\r\n        result = false;\r\n\r\n      } else {\r\n\r\n        // audio/mp3 -> mp3, result should be known\r\n        offset = mime.indexOf(';');\r\n\r\n        // strip \"audio/X; codecs...\"\r\n        fileExt = (offset !== -1 ? mime.substr(0, offset) : mime).substr(6);\r\n\r\n      }\r\n\r\n    } else {\r\n\r\n      // match the raw extension name - \"mp3\", for example\r\n      fileExt = fileExt[1];\r\n\r\n    }\r\n\r\n    if (fileExt && sm2.html5[fileExt] !== _undefined) {\r\n\r\n      // result known\r\n      result = (sm2.html5[fileExt] && !preferFlashCheck(fileExt));\r\n\r\n    } else {\r\n\r\n      mime = 'audio/' + fileExt;\r\n      result = sm2.html5.canPlayType({ type: mime });\r\n\r\n      sm2.html5[fileExt] = result;\r\n\r\n      // sm2._wD('canPlayType, found result: ' + result);\r\n      result = (result && sm2.html5[mime] && !preferFlashCheck(mime));\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  testHTML5 = function() {\r\n\r\n    /**\r\n     * Internal: Iterates over audioFormats, determining support eg. audio/mp3, audio/mpeg and so on\r\n     * assigns results to html5[] and flash[].\r\n     */\r\n\r\n    if (!sm2.useHTML5Audio || !sm2.hasHTML5) {\r\n\r\n      // without HTML5, we need Flash.\r\n      sm2.html5.usingFlash = true;\r\n      needsFlash = true;\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load \"null\" as a URL. :/\r\n    var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null),\r\n        item, lookup, support = {}, aF, i;\r\n\r\n    function cp(m) {\r\n\r\n      var canPlay, j,\r\n          result = false,\r\n          isOK = false;\r\n\r\n      if (!a || typeof a.canPlayType !== 'function') return result;\r\n\r\n      if (m instanceof Array) {\r\n\r\n        // iterate through all mime types, return any successes\r\n\r\n        for (i = 0, j = m.length; i < j; i++) {\r\n\r\n          if (sm2.html5[m[i]] || a.canPlayType(m[i]).match(sm2.html5Test)) {\r\n\r\n            isOK = true;\r\n            sm2.html5[m[i]] = true;\r\n\r\n            // note flash support, too\r\n            sm2.flash[m[i]] = !!(m[i].match(flashMIME));\r\n\r\n          }\r\n\r\n        }\r\n\r\n        result = isOK;\r\n\r\n      } else {\r\n\r\n        canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);\r\n        result = !!(canPlay && (canPlay.match(sm2.html5Test)));\r\n\r\n      }\r\n\r\n      return result;\r\n\r\n    }\r\n\r\n    // test all registered formats + codecs\r\n\r\n    aF = sm2.audioFormats;\r\n\r\n    for (item in aF) {\r\n\r\n      if (aF.hasOwnProperty(item)) {\r\n\r\n        lookup = 'audio/' + item;\r\n\r\n        support[item] = cp(aF[item].type);\r\n\r\n        // write back generic type too, eg. audio/mp3\r\n        support[lookup] = support[item];\r\n\r\n        // assign flash\r\n        if (item.match(flashMIME)) {\r\n\r\n          sm2.flash[item] = true;\r\n          sm2.flash[lookup] = true;\r\n\r\n        } else {\r\n\r\n          sm2.flash[item] = false;\r\n          sm2.flash[lookup] = false;\r\n\r\n        }\r\n\r\n        // assign result to related formats, too\r\n\r\n        if (aF[item] && aF[item].related) {\r\n\r\n          for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n\r\n            // eg. audio/m4a\r\n            support['audio/' + aF[item].related[i]] = support[item];\r\n            sm2.html5[aF[item].related[i]] = support[item];\r\n            sm2.flash[aF[item].related[i]] = support[item];\r\n\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    support.canPlayType = (a ? cp : null);\r\n    sm2.html5 = mixin(sm2.html5, support);\r\n\r\n    sm2.html5.usingFlash = featureCheck();\r\n    needsFlash = sm2.html5.usingFlash;\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  strings = {\r\n\r\n    // <d>\r\n    notReady: 'Unavailable - wait until onready() has fired.',\r\n    notOK: 'Audio support is not available.',\r\n    domError: sm + 'exception caught while appending SWF to DOM.',\r\n    spcWmode: 'Removing wmode, preventing known SWF loading issue(s)',\r\n    swf404: smc + 'Verify that %s is a valid path.',\r\n    tryDebug: 'Try ' + sm + '.debugFlash = true for more security details (output goes to SWF.)',\r\n    checkSWF: 'See SWF output for more debug info.',\r\n    localFail: smc + 'Non-HTTP page (' + doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',\r\n    waitFocus: smc + 'Special case: Waiting for SWF to load with window focus...',\r\n    waitForever: smc + 'Waiting indefinitely for Flash (will recover if unblocked)...',\r\n    waitSWF: smc + 'Waiting for 100% SWF load...',\r\n    needFunction: smc + 'Function object expected for %s',\r\n    badID: 'Sound ID \"%s\" should be a string, starting with a non-numeric character',\r\n    currentObj: smc + '_debug(): Current sound objects',\r\n    waitOnload: smc + 'Waiting for window.onload()',\r\n    docLoaded: smc + 'Document already loaded',\r\n    onload: smc + 'initComplete(): calling soundManager.onload()',\r\n    onloadOK: sm + '.onload() complete',\r\n    didInit: smc + 'init(): Already called?',\r\n    secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',\r\n    badRemove: smc + 'Failed to remove Flash node.',\r\n    shutdown: sm + '.disable(): Shutting down',\r\n    queue: smc + 'Queueing %s handler',\r\n    smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',\r\n    fbTimeout: 'No flash response, applying .' + swfCSS.swfTimedout + ' CSS...',\r\n    fbLoaded: 'Flash loaded',\r\n    fbHandler: smc + 'flashBlockHandler()',\r\n    manURL: 'SMSound.load(): Using manually-assigned URL',\r\n    onURL: sm + '.load(): current URL already assigned.',\r\n    badFV: sm + '.flashVersion must be 8 or 9. \"%s\" is invalid. Reverting to %s.',\r\n    as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',\r\n    noNSLoop: 'Note: Looping not implemented for MovieStar formats',\r\n    needfl9: 'Note: Switching to flash 9, required for MP4 formats.',\r\n    mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',\r\n    needFlash: smc + 'Fatal error: Flash is needed to play some required formats, but is not available.',\r\n    gotFocus: smc + 'Got window focus.',\r\n    policy: 'Enabling usePolicyFile for data access',\r\n    setup: sm + '.setup(): allowed parameters: %s',\r\n    setupError: sm + '.setup(): \"%s\" cannot be assigned with this method.',\r\n    setupUndef: sm + '.setup(): Could not find option \"%s\"',\r\n    setupLate: sm + '.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().',\r\n    noURL: smc + 'Flash URL required. Call soundManager.setup({url:...}) to get started.',\r\n    sm2Loaded: 'SoundManager 2: Ready. ' + String.fromCharCode(10003),\r\n    reset: sm + '.reset(): Removing event callbacks',\r\n    mobileUA: 'Mobile UA detected, preferring HTML5 by default.',\r\n    globalHTML5: 'Using singleton HTML5 Audio() pattern for this device.',\r\n    ignoreMobile: 'Ignoring mobile restrictions for this device.'\r\n    // </d>\r\n\r\n  };\r\n\r\n  str = function() {\r\n\r\n    // internal string replace helper.\r\n    // arguments: o [,items to replace]\r\n    // <d>\r\n\r\n    var args,\r\n        i, j, o,\r\n        sstr;\r\n\r\n    // real array, please\r\n    args = slice.call(arguments);\r\n\r\n    // first argument\r\n    o = args.shift();\r\n\r\n    sstr = (strings && strings[o] ? strings[o] : '');\r\n\r\n    if (sstr && args && args.length) {\r\n      for (i = 0, j = args.length; i < j; i++) {\r\n        sstr = sstr.replace('%s', args[i]);\r\n      }\r\n    }\r\n\r\n    return sstr;\r\n    // </d>\r\n\r\n  };\r\n\r\n  loopFix = function(sOpt) {\r\n\r\n    // flash 8 requires stream = false for looping to work\r\n    if (fV === 8 && sOpt.loops > 1 && sOpt.stream) {\r\n      _wDS('as2loop');\r\n      sOpt.stream = false;\r\n    }\r\n\r\n    return sOpt;\r\n\r\n  };\r\n\r\n  policyFix = function(sOpt, sPre) {\r\n\r\n    if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {\r\n      sm2._wD((sPre || '') + str('policy'));\r\n      sOpt.usePolicyFile = true;\r\n    }\r\n\r\n    return sOpt;\r\n\r\n  };\r\n\r\n  complain = function(sMsg) {\r\n\r\n    // <d>\r\n    if (hasConsole && console.warn !== _undefined) {\r\n      console.warn(sMsg);\r\n    } else {\r\n      sm2._wD(sMsg);\r\n    }\r\n    // </d>\r\n\r\n  };\r\n\r\n  doNothing = function() {\r\n\r\n    return false;\r\n\r\n  };\r\n\r\n  disableObject = function(o) {\r\n\r\n    var oProp;\r\n\r\n    for (oProp in o) {\r\n      if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {\r\n        o[oProp] = doNothing;\r\n      }\r\n    }\r\n\r\n    oProp = null;\r\n\r\n  };\r\n\r\n  failSafely = function(bNoDisable) {\r\n\r\n    // general failure exception handler\r\n\r\n    if (bNoDisable === _undefined) {\r\n      bNoDisable = false;\r\n    }\r\n\r\n    if (disabled || bNoDisable) {\r\n      sm2.disable(bNoDisable);\r\n    }\r\n\r\n  };\r\n\r\n  normalizeMovieURL = function(movieURL) {\r\n\r\n    var urlParams = null, url;\r\n\r\n    if (movieURL) {\r\n\r\n      if (movieURL.match(/\\.swf(\\?.*)?$/i)) {\r\n\r\n        urlParams = movieURL.substr(movieURL.toLowerCase().lastIndexOf('.swf?') + 4);\r\n\r\n        // assume user knows what they're doing\r\n        if (urlParams) return movieURL;\r\n\r\n      } else if (movieURL.lastIndexOf('/') !== movieURL.length - 1) {\r\n\r\n        // append trailing slash, if needed\r\n        movieURL += '/';\r\n\r\n      }\r\n\r\n    }\r\n\r\n    url = (movieURL && movieURL.lastIndexOf('/') !== -1 ? movieURL.substr(0, movieURL.lastIndexOf('/') + 1) : './') + sm2.movieURL;\r\n\r\n    if (sm2.noSWFCache) {\r\n      url += ('?ts=' + new Date().getTime());\r\n    }\r\n\r\n    return url;\r\n\r\n  };\r\n\r\n  setVersionInfo = function() {\r\n\r\n    // short-hand for internal use\r\n\r\n    fV = parseInt(sm2.flashVersion, 10);\r\n\r\n    if (fV !== 8 && fV !== 9) {\r\n      sm2._wD(str('badFV', fV, defaultFlashVersion));\r\n      sm2.flashVersion = fV = defaultFlashVersion;\r\n    }\r\n\r\n    // debug flash movie, if applicable\r\n\r\n    var isDebug = (sm2.debugMode || sm2.debugFlash ? '_debug.swf' : '.swf');\r\n\r\n    if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) {\r\n      sm2._wD(str('needfl9'));\r\n      sm2.flashVersion = fV = 9;\r\n    }\r\n\r\n    sm2.version = sm2.versionNumber + (sm2.html5Only ? ' (HTML5-only mode)' : (fV === 9 ? ' (AS3/Flash 9)' : ' (AS2/Flash 8)'));\r\n\r\n    // set up default options\r\n    if (fV > 8) {\r\n\r\n      // +flash 9 base options\r\n      sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options);\r\n      sm2.features.buffering = true;\r\n\r\n      // +moviestar support\r\n      sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions);\r\n      sm2.filePatterns.flash9 = new RegExp('\\\\.(mp3|' + netStreamTypes.join('|') + ')(\\\\?.*)?$', 'i');\r\n      sm2.features.movieStar = true;\r\n\r\n    } else {\r\n\r\n      sm2.features.movieStar = false;\r\n\r\n    }\r\n\r\n    // regExp for flash canPlay(), etc.\r\n    sm2.filePattern = sm2.filePatterns[(fV !== 8 ? 'flash9' : 'flash8')];\r\n\r\n    // if applicable, use _debug versions of SWFs\r\n    sm2.movieURL = (fV === 8 ? 'soundmanager2.swf' : 'soundmanager2_flash9.swf').replace('.swf', isDebug);\r\n\r\n    sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8);\r\n\r\n  };\r\n\r\n  setPolling = function(bPolling, bHighPerformance) {\r\n\r\n    if (!flash) {\r\n      return;\r\n    }\r\n\r\n    flash._setPolling(bPolling, bHighPerformance);\r\n\r\n  };\r\n\r\n  initDebug = function() {\r\n\r\n    // starts debug mode, creating output <div> for UAs without console object\r\n\r\n    // allow force of debug mode via URL\r\n    // <d>\r\n    if (sm2.debugURLParam.test(wl)) {\r\n      sm2.setupOptions.debugMode = sm2.debugMode = true;\r\n    }\r\n\r\n    if (id(sm2.debugID)) {\r\n      return;\r\n    }\r\n\r\n    var oD, oDebug, oTarget, oToggle, tmp;\r\n\r\n    if (sm2.debugMode && !id(sm2.debugID) && (!hasConsole || !sm2.useConsole || !sm2.consoleOnly)) {\r\n\r\n      oD = doc.createElement('div');\r\n      oD.id = sm2.debugID + '-toggle';\r\n\r\n      oToggle = {\r\n        position: 'fixed',\r\n        bottom: '0px',\r\n        right: '0px',\r\n        width: '1.2em',\r\n        height: '1.2em',\r\n        lineHeight: '1.2em',\r\n        margin: '2px',\r\n        textAlign: 'center',\r\n        border: '1px solid #999',\r\n        cursor: 'pointer',\r\n        background: '#fff',\r\n        color: '#333',\r\n        zIndex: 10001\r\n      };\r\n\r\n      oD.appendChild(doc.createTextNode('-'));\r\n      oD.onclick = toggleDebug;\r\n      oD.title = 'Toggle SM2 debug console';\r\n\r\n      if (ua.match(/msie 6/i)) {\r\n        oD.style.position = 'absolute';\r\n        oD.style.cursor = 'hand';\r\n      }\r\n\r\n      for (tmp in oToggle) {\r\n        if (oToggle.hasOwnProperty(tmp)) {\r\n          oD.style[tmp] = oToggle[tmp];\r\n        }\r\n      }\r\n\r\n      oDebug = doc.createElement('div');\r\n      oDebug.id = sm2.debugID;\r\n      oDebug.style.display = (sm2.debugMode ? 'block' : 'none');\r\n\r\n      if (sm2.debugMode && !id(oD.id)) {\r\n        try {\r\n          oTarget = getDocument();\r\n          oTarget.appendChild(oD);\r\n        } catch(e2) {\r\n          throw new Error(str('domError') + ' \\n' + e2.toString());\r\n        }\r\n        oTarget.appendChild(oDebug);\r\n      }\r\n\r\n    }\r\n\r\n    oTarget = null;\r\n    // </d>\r\n\r\n  };\r\n\r\n  idCheck = this.getSoundById;\r\n\r\n  // <d>\r\n  _wDS = function(o, errorLevel) {\r\n\r\n    return (!o ? '' : sm2._wD(str(o), errorLevel));\r\n\r\n  };\r\n\r\n  toggleDebug = function() {\r\n\r\n    var o = id(sm2.debugID),\r\n    oT = id(sm2.debugID + '-toggle');\r\n\r\n    if (!o) {\r\n      return;\r\n    }\r\n\r\n    if (debugOpen) {\r\n      // minimize\r\n      oT.innerHTML = '+';\r\n      o.style.display = 'none';\r\n    } else {\r\n      oT.innerHTML = '-';\r\n      o.style.display = 'block';\r\n    }\r\n\r\n    debugOpen = !debugOpen;\r\n\r\n  };\r\n\r\n  debugTS = function(sEventType, bSuccess, sMessage) {\r\n\r\n    // troubleshooter debug hooks\r\n\r\n    if (window.sm2Debugger !== _undefined) {\r\n      try {\r\n        sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);\r\n      } catch(e) {\r\n        // oh well\r\n        return false;\r\n      }\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n  // </d>\r\n\r\n  getSWFCSS = function() {\r\n\r\n    var css = [];\r\n\r\n    if (sm2.debugMode) {\r\n      css.push(swfCSS.sm2Debug);\r\n    }\r\n\r\n    if (sm2.debugFlash) {\r\n      css.push(swfCSS.flashDebug);\r\n    }\r\n\r\n    if (sm2.useHighPerformance) {\r\n      css.push(swfCSS.highPerf);\r\n    }\r\n\r\n    return css.join(' ');\r\n\r\n  };\r\n\r\n  flashBlockHandler = function() {\r\n\r\n    // *possible* flash block situation.\r\n\r\n    var name = str('fbHandler'),\r\n        p = sm2.getMoviePercent(),\r\n        css = swfCSS,\r\n        error = {\r\n          type: 'FLASHBLOCK'\r\n        };\r\n\r\n    if (sm2.html5Only) {\r\n      // no flash, or unused\r\n      return;\r\n    }\r\n\r\n    if (!sm2.ok()) {\r\n\r\n      if (needsFlash) {\r\n        // make the movie more visible, so user can fix\r\n        sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null ? css.swfTimedout : css.swfError);\r\n        sm2._wD(name + ': ' + str('fbTimeout') + (p ? ' (' + str('fbLoaded') + ')' : ''));\r\n      }\r\n\r\n      sm2.didFlashBlock = true;\r\n\r\n      // fire onready(), complain lightly\r\n      processOnEvents({\r\n        type: 'ontimeout',\r\n        ignoreInit: true,\r\n        error: error\r\n      });\r\n\r\n      catchError(error);\r\n\r\n    } else {\r\n\r\n      // SM2 loaded OK (or recovered)\r\n\r\n      // <d>\r\n      if (sm2.didFlashBlock) {\r\n        sm2._wD(name + ': Unblocked');\r\n      }\r\n      // </d>\r\n\r\n      if (sm2.oMC) {\r\n        sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock ? ' ' + css.swfUnblocked : '')].join(' ');\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  addOnEvent = function(sType, oMethod, oScope) {\r\n\r\n    if (on_queue[sType] === _undefined) {\r\n      on_queue[sType] = [];\r\n    }\r\n\r\n    on_queue[sType].push({\r\n      method: oMethod,\r\n      scope: (oScope || null),\r\n      fired: false\r\n    });\r\n\r\n  };\r\n\r\n  processOnEvents = function(oOptions) {\r\n\r\n    // if unspecified, assume OK/error\r\n\r\n    if (!oOptions) {\r\n      oOptions = {\r\n        type: (sm2.ok() ? 'onready' : 'ontimeout')\r\n      };\r\n    }\r\n\r\n    // not ready yet.\r\n    if (!didInit && oOptions && !oOptions.ignoreInit) return false;\r\n\r\n    // invalid case\r\n    if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) return false;\r\n\r\n    var status = {\r\n          success: (oOptions && oOptions.ignoreInit ? sm2.ok() : !disabled)\r\n        },\r\n\r\n        // queue specified by type, or none\r\n        srcQueue = (oOptions && oOptions.type ? on_queue[oOptions.type] || [] : []),\r\n\r\n        queue = [], i, j,\r\n        args = [status],\r\n        canRetry = (needsFlash && !sm2.ok());\r\n\r\n    if (oOptions.error) {\r\n      args[0].error = oOptions.error;\r\n    }\r\n\r\n    for (i = 0, j = srcQueue.length; i < j; i++) {\r\n      if (srcQueue[i].fired !== true) {\r\n        queue.push(srcQueue[i]);\r\n      }\r\n    }\r\n\r\n    if (queue.length) {\r\n\r\n      // sm2._wD(sm + ': Firing ' + queue.length + ' ' + oOptions.type + '() item' + (queue.length === 1 ? '' : 's'));\r\n      for (i = 0, j = queue.length; i < j; i++) {\r\n\r\n        if (queue[i].scope) {\r\n          queue[i].method.apply(queue[i].scope, args);\r\n        } else {\r\n          queue[i].method.apply(this, args);\r\n        }\r\n\r\n        if (!canRetry) {\r\n          // useFlashBlock and SWF timeout case doesn't count here.\r\n          queue[i].fired = true;\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  initUserOnload = function() {\r\n\r\n    window.setTimeout(function() {\r\n\r\n      if (sm2.useFlashBlock) {\r\n        flashBlockHandler();\r\n      }\r\n\r\n      processOnEvents();\r\n\r\n      // call user-defined \"onload\", scoped to window\r\n\r\n      if (typeof sm2.onload === 'function') {\r\n        _wDS('onload', 1);\r\n        sm2.onload.apply(window);\r\n        _wDS('onloadOK', 1);\r\n      }\r\n\r\n      if (sm2.waitForWindowLoad) {\r\n        event.add(window, 'load', initUserOnload);\r\n      }\r\n\r\n    }, 1);\r\n\r\n  };\r\n\r\n  detectFlash = function() {\r\n\r\n    /**\r\n     * Hat tip: Flash Detect library (BSD, (C) 2007) by Carl \"DocYes\" S. Yestrau\r\n     * http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt\r\n     */\r\n\r\n    // this work has already been done.\r\n    if (hasFlash !== _undefined) return hasFlash;\r\n\r\n    var hasPlugin = false, n = navigator, obj, type, types, AX = window.ActiveXObject;\r\n\r\n    // MS Edge 14 throws an \"Unspecified Error\" because n.plugins is inaccessible due to permissions\r\n    var nP;\r\n\r\n    try {\r\n      nP = n.plugins;\r\n    } catch(e) {\r\n      nP = undefined;\r\n    }\r\n\r\n    if (nP && nP.length) {\r\n\r\n      type = 'application/x-shockwave-flash';\r\n      types = n.mimeTypes;\r\n\r\n      if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {\r\n        hasPlugin = true;\r\n      }\r\n\r\n    } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) {\r\n\r\n      // Windows 8 Store Apps (MSAppHost) are weird (compatibility?) and won't complain here, but will barf if Flash/ActiveX object is appended to the DOM.\r\n      try {\r\n        obj = new AX('ShockwaveFlash.ShockwaveFlash');\r\n      } catch(e) {\r\n        // oh well\r\n        obj = null;\r\n      }\r\n\r\n      hasPlugin = (!!obj);\r\n\r\n      // cleanup, because it is ActiveX after all\r\n      obj = null;\r\n\r\n    }\r\n\r\n    hasFlash = hasPlugin;\r\n\r\n    return hasPlugin;\r\n\r\n  };\r\n\r\n  featureCheck = function() {\r\n\r\n    var flashNeeded,\r\n        item,\r\n        formats = sm2.audioFormats,\r\n        // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (original iPad) + iOS4 works.\r\n        isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)\\s/i)));\r\n\r\n    if (isSpecial) {\r\n\r\n      // has Audio(), but is broken; let it load links directly.\r\n      sm2.hasHTML5 = false;\r\n\r\n      // ignore flash case, however\r\n      sm2.html5Only = true;\r\n\r\n      // hide the SWF, if present\r\n      if (sm2.oMC) {\r\n        sm2.oMC.style.display = 'none';\r\n      }\r\n\r\n    } else if (sm2.useHTML5Audio) {\r\n\r\n        if (!sm2.html5 || !sm2.html5.canPlayType) {\r\n          sm2._wD('SoundManager: No HTML5 Audio() support detected.');\r\n          sm2.hasHTML5 = false;\r\n        }\r\n\r\n        // <d>\r\n        if (isBadSafari) {\r\n          sm2._wD(smc + 'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - ' + (!hasFlash ? ' would use flash fallback for MP3/MP4, but none detected.' : 'will use flash fallback for MP3/MP4, if available'), 1);\r\n        }\r\n        // </d>\r\n\r\n      }\r\n\r\n    if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n\r\n      // sort out whether flash is optional, required or can be ignored.\r\n\r\n      // innocent until proven guilty.\r\n      canIgnoreFlash = true;\r\n\r\n      for (item in formats) {\r\n\r\n        if (formats.hasOwnProperty(item)) {\r\n\r\n          if (formats[item].required) {\r\n\r\n            if (!sm2.html5.canPlayType(formats[item].type)) {\r\n\r\n              // 100% HTML5 mode is not possible.\r\n              canIgnoreFlash = false;\r\n              flashNeeded = true;\r\n\r\n            } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) {\r\n\r\n              // flash may be required, or preferred for this format.\r\n              flashNeeded = true;\r\n\r\n            }\r\n\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    // sanity check...\r\n    if (sm2.ignoreFlash) {\r\n      flashNeeded = false;\r\n      canIgnoreFlash = true;\r\n    }\r\n\r\n    sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded);\r\n\r\n    return (!sm2.html5Only);\r\n\r\n  };\r\n\r\n  parseURL = function(url) {\r\n\r\n    /**\r\n     * Internal: Finds and returns the first playable URL (or failing that, the first URL.)\r\n     * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects.\r\n     */\r\n\r\n    var i, j, urlResult = 0, result;\r\n\r\n    if (url instanceof Array) {\r\n\r\n      // find the first good one\r\n      for (i = 0, j = url.length; i < j; i++) {\r\n\r\n        if (url[i] instanceof Object) {\r\n\r\n          // MIME check\r\n          if (sm2.canPlayMIME(url[i].type)) {\r\n            urlResult = i;\r\n            break;\r\n          }\r\n\r\n        } else if (sm2.canPlayURL(url[i])) {\r\n\r\n          // URL string check\r\n          urlResult = i;\r\n          break;\r\n\r\n        }\r\n\r\n      }\r\n\r\n      // normalize to string\r\n      if (url[urlResult].url) {\r\n        url[urlResult] = url[urlResult].url;\r\n      }\r\n\r\n      result = url[urlResult];\r\n\r\n    } else {\r\n\r\n      // single URL case\r\n      result = url;\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n\r\n  startTimer = function(oSound) {\r\n\r\n    /**\r\n     * attach a timer to this sound, and start an interval if needed\r\n     */\r\n\r\n    if (!oSound._hasTimer) {\r\n\r\n      oSound._hasTimer = true;\r\n\r\n      if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n        if (h5IntervalTimer === null && h5TimerCount === 0) {\r\n\r\n          h5IntervalTimer = setInterval(timerExecute, sm2.html5PollingInterval);\r\n\r\n        }\r\n\r\n        h5TimerCount++;\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  stopTimer = function(oSound) {\r\n\r\n    /**\r\n     * detach a timer\r\n     */\r\n\r\n    if (oSound._hasTimer) {\r\n\r\n      oSound._hasTimer = false;\r\n\r\n      if (!mobileHTML5 && sm2.html5PollingInterval) {\r\n\r\n        // interval will stop itself at next execution.\r\n\r\n        h5TimerCount--;\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  timerExecute = function() {\r\n\r\n    /**\r\n     * manual polling for HTML5 progress events, ie., whileplaying()\r\n     * (can achieve greater precision than conservative default HTML5 interval)\r\n     */\r\n\r\n    var i;\r\n\r\n    if (h5IntervalTimer !== null && !h5TimerCount) {\r\n\r\n      // no active timers, stop polling interval.\r\n\r\n      clearInterval(h5IntervalTimer);\r\n\r\n      h5IntervalTimer = null;\r\n\r\n      return;\r\n\r\n    }\r\n\r\n    // check all HTML5 sounds with timers\r\n\r\n    for (i = sm2.soundIDs.length - 1; i >= 0; i--) {\r\n\r\n      if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) {\r\n        sm2.sounds[sm2.soundIDs[i]]._onTimer();\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  catchError = function(options) {\r\n\r\n    options = (options !== _undefined ? options : {});\r\n\r\n    if (typeof sm2.onerror === 'function') {\r\n      sm2.onerror.apply(window, [{\r\n        type: (options.type !== _undefined ? options.type : null)\r\n      }]);\r\n    }\r\n\r\n    if (options.fatal !== _undefined && options.fatal) {\r\n      sm2.disable();\r\n    }\r\n\r\n  };\r\n\r\n  badSafariFix = function() {\r\n\r\n    // special case: \"bad\" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4\r\n    if (!isBadSafari || !detectFlash()) {\r\n      // doesn't apply\r\n      return;\r\n    }\r\n\r\n    var aF = sm2.audioFormats, i, item;\r\n\r\n    for (item in aF) {\r\n\r\n      if (aF.hasOwnProperty(item)) {\r\n\r\n        if (item === 'mp3' || item === 'mp4') {\r\n\r\n          sm2._wD(sm + ': Using flash fallback for ' + item + ' format');\r\n          sm2.html5[item] = false;\r\n\r\n          // assign result to related formats, too\r\n          if (aF[item] && aF[item].related) {\r\n            for (i = aF[item].related.length - 1; i >= 0; i--) {\r\n              sm2.html5[aF[item].related[i]] = false;\r\n            }\r\n          }\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  /**\r\n   * Pseudo-private flash/ExternalInterface methods\r\n   * ----------------------------------------------\r\n   */\r\n\r\n  this._setSandboxType = function(sandboxType) {\r\n\r\n    // <d>\r\n    // Security sandbox according to Flash plugin\r\n    var sb = sm2.sandbox;\r\n\r\n    sb.type = sandboxType;\r\n    sb.description = sb.types[(sb.types[sandboxType] !== _undefined ? sandboxType : 'unknown')];\r\n\r\n    if (sb.type === 'localWithFile') {\r\n\r\n      sb.noRemote = true;\r\n      sb.noLocal = false;\r\n      _wDS('secNote', 2);\r\n\r\n    } else if (sb.type === 'localWithNetwork') {\r\n\r\n      sb.noRemote = false;\r\n      sb.noLocal = true;\r\n\r\n    } else if (sb.type === 'localTrusted') {\r\n\r\n      sb.noRemote = false;\r\n      sb.noLocal = false;\r\n\r\n    }\r\n    // </d>\r\n\r\n  };\r\n\r\n  this._externalInterfaceOK = function(swfVersion) {\r\n\r\n    // flash callback confirming flash loaded, EI working etc.\r\n    // swfVersion: SWF build string\r\n\r\n    if (sm2.swfLoaded) {\r\n      return;\r\n    }\r\n\r\n    var e;\r\n\r\n    debugTS('swf', true);\r\n    debugTS('flashtojs', true);\r\n    sm2.swfLoaded = true;\r\n    tryInitOnFocus = false;\r\n\r\n    if (isBadSafari) {\r\n      badSafariFix();\r\n    }\r\n\r\n    // complain if JS + SWF build/version strings don't match, excluding +DEV builds\r\n    // <d>\r\n    if (!swfVersion || swfVersion.replace(/\\+dev/i, '') !== sm2.versionNumber.replace(/\\+dev/i, '')) {\r\n\r\n      e = sm + ': Fatal: JavaScript file build \"' + sm2.versionNumber + '\" does not match Flash SWF build \"' + swfVersion + '\" at ' + sm2.url + '. Ensure both are up-to-date.';\r\n\r\n      // escape flash -> JS stack so this error fires in window.\r\n      setTimeout(function() {\r\n        throw new Error(e);\r\n      }, 0);\r\n\r\n      // exit, init will fail with timeout\r\n      return;\r\n\r\n    }\r\n    // </d>\r\n\r\n    // IE needs a larger timeout\r\n    setTimeout(init, isIE ? 100 : 1);\r\n\r\n  };\r\n\r\n  /**\r\n   * Private initialization helpers\r\n   * ------------------------------\r\n   */\r\n\r\n  createMovie = function(movieID, movieURL) {\r\n\r\n    // ignore if already connected\r\n    if (didAppend && appendSuccess) return false;\r\n\r\n    function initMsg() {\r\n\r\n      // <d>\r\n\r\n      var options = [],\r\n          title,\r\n          msg = [],\r\n          delimiter = ' + ';\r\n\r\n      title = 'SoundManager ' + sm2.version + (!sm2.html5Only && sm2.useHTML5Audio ? (sm2.hasHTML5 ? ' + HTML5 audio' : ', no HTML5 audio support') : '');\r\n\r\n      if (!sm2.html5Only) {\r\n\r\n        if (sm2.preferFlash) {\r\n          options.push('preferFlash');\r\n        }\r\n\r\n        if (sm2.useHighPerformance) {\r\n          options.push('useHighPerformance');\r\n        }\r\n\r\n        if (sm2.flashPollingInterval) {\r\n          options.push('flashPollingInterval (' + sm2.flashPollingInterval + 'ms)');\r\n        }\r\n\r\n        if (sm2.html5PollingInterval) {\r\n          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n        }\r\n\r\n        if (sm2.wmode) {\r\n          options.push('wmode (' + sm2.wmode + ')');\r\n        }\r\n\r\n        if (sm2.debugFlash) {\r\n          options.push('debugFlash');\r\n        }\r\n\r\n        if (sm2.useFlashBlock) {\r\n          options.push('flashBlock');\r\n        }\r\n\r\n      } else if (sm2.html5PollingInterval) {\r\n          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');\r\n        }\r\n\r\n      if (options.length) {\r\n        msg = msg.concat([options.join(delimiter)]);\r\n      }\r\n\r\n      sm2._wD(title + (msg.length ? delimiter + msg.join(', ') : ''), 1);\r\n\r\n      showSupport();\r\n\r\n      // </d>\r\n\r\n    }\r\n\r\n    if (sm2.html5Only) {\r\n\r\n      // 100% HTML5 mode\r\n      setVersionInfo();\r\n\r\n      initMsg();\r\n      sm2.oMC = id(sm2.movieID);\r\n      init();\r\n\r\n      // prevent multiple init attempts\r\n      didAppend = true;\r\n\r\n      appendSuccess = true;\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    // flash path\r\n    var remoteURL = (movieURL || sm2.url),\r\n    localURL = (sm2.altURL || remoteURL),\r\n    swfTitle = 'JS/Flash audio component (SoundManager 2)',\r\n    oTarget = getDocument(),\r\n    extraClass = getSWFCSS(),\r\n    isRTL = null,\r\n    html = doc.getElementsByTagName('html')[0],\r\n    oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass;\r\n\r\n    isRTL = (html && html.dir && html.dir.match(/rtl/i));\r\n    movieID = (movieID === _undefined ? sm2.id : movieID);\r\n\r\n    function param(name, value) {\r\n      return '<param name=\"' + name + '\" value=\"' + value + '\" />';\r\n    }\r\n\r\n    // safety check for legacy (change to Flash 9 URL)\r\n    setVersionInfo();\r\n    sm2.url = normalizeMovieURL(overHTTP ? remoteURL : localURL);\r\n    movieURL = sm2.url;\r\n\r\n    sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode);\r\n\r\n    if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {\r\n      /**\r\n       * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here\r\n       * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout\r\n       * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)\r\n       */\r\n      messages.push(strings.spcWmode);\r\n      sm2.wmode = null;\r\n    }\r\n\r\n    oEmbed = {\r\n      name: movieID,\r\n      id: movieID,\r\n      src: movieURL,\r\n      quality: 'high',\r\n      allowScriptAccess: sm2.allowScriptAccess,\r\n      bgcolor: sm2.bgColor,\r\n      pluginspage: http + 'www.macromedia.com/go/getflashplayer',\r\n      title: swfTitle,\r\n      type: 'application/x-shockwave-flash',\r\n      wmode: sm2.wmode,\r\n      // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html\r\n      hasPriority: 'true'\r\n    };\r\n\r\n    if (sm2.debugFlash) {\r\n      oEmbed.FlashVars = 'debug=1';\r\n    }\r\n\r\n    if (!sm2.wmode) {\r\n      // don't write empty attribute\r\n      delete oEmbed.wmode;\r\n    }\r\n\r\n    if (isIE) {\r\n\r\n      // IE is \"special\".\r\n      oMovie = doc.createElement('div');\r\n      movieHTML = [\r\n        '<object id=\"' + movieID + '\" data=\"' + movieURL + '\" type=\"' + oEmbed.type + '\" title=\"' + oEmbed.title + '\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\">',\r\n        param('movie', movieURL),\r\n        param('AllowScriptAccess', sm2.allowScriptAccess),\r\n        param('quality', oEmbed.quality),\r\n        (sm2.wmode ? param('wmode', sm2.wmode) : ''),\r\n        param('bgcolor', sm2.bgColor),\r\n        param('hasPriority', 'true'),\r\n        (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),\r\n        '</object>'\r\n      ].join('');\r\n\r\n    } else {\r\n\r\n      oMovie = doc.createElement('embed');\r\n      for (tmp in oEmbed) {\r\n        if (oEmbed.hasOwnProperty(tmp)) {\r\n          oMovie.setAttribute(tmp, oEmbed[tmp]);\r\n        }\r\n      }\r\n\r\n    }\r\n\r\n    initDebug();\r\n    extraClass = getSWFCSS();\r\n    oTarget = getDocument();\r\n\r\n    if (oTarget) {\r\n\r\n      sm2.oMC = (id(sm2.movieID) || doc.createElement('div'));\r\n\r\n      if (!sm2.oMC.id) {\r\n\r\n        sm2.oMC.id = sm2.movieID;\r\n        sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass;\r\n        s = null;\r\n        oEl = null;\r\n\r\n        if (!sm2.useFlashBlock) {\r\n          if (sm2.useHighPerformance) {\r\n            // on-screen at all times\r\n            s = {\r\n              position: 'fixed',\r\n              width: '8px',\r\n              height: '8px',\r\n              // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.\r\n              bottom: '0px',\r\n              left: '0px',\r\n              overflow: 'hidden'\r\n            };\r\n          } else {\r\n            // hide off-screen, lower priority\r\n            s = {\r\n              position: 'absolute',\r\n              width: '6px',\r\n              height: '6px',\r\n              top: '-9999px',\r\n              left: '-9999px'\r\n            };\r\n            if (isRTL) {\r\n              s.left = Math.abs(parseInt(s.left, 10)) + 'px';\r\n            }\r\n          }\r\n        }\r\n\r\n        if (isWebkit) {\r\n          // soundcloud-reported render/crash fix, safari 5\r\n          sm2.oMC.style.zIndex = 10000;\r\n        }\r\n\r\n        if (!sm2.debugFlash) {\r\n          for (x in s) {\r\n            if (s.hasOwnProperty(x)) {\r\n              sm2.oMC.style[x] = s[x];\r\n            }\r\n          }\r\n        }\r\n\r\n        try {\r\n\r\n          if (!isIE) {\r\n            sm2.oMC.appendChild(oMovie);\r\n          }\r\n\r\n          oTarget.appendChild(sm2.oMC);\r\n\r\n          if (isIE) {\r\n            oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n            oEl.className = swfCSS.swfBox;\r\n            oEl.innerHTML = movieHTML;\r\n          }\r\n\r\n          appendSuccess = true;\r\n\r\n        } catch(e) {\r\n\r\n          throw new Error(str('domError') + ' \\n' + e.toString());\r\n\r\n        }\r\n\r\n      } else {\r\n\r\n        // SM2 container is already in the document (eg. flashblock use case)\r\n        sClass = sm2.oMC.className;\r\n        sm2.oMC.className = (sClass ? sClass + ' ' : swfCSS.swfDefault) + (extraClass ? ' ' + extraClass : '');\r\n        sm2.oMC.appendChild(oMovie);\r\n\r\n        if (isIE) {\r\n          oEl = sm2.oMC.appendChild(doc.createElement('div'));\r\n          oEl.className = swfCSS.swfBox;\r\n          oEl.innerHTML = movieHTML;\r\n        }\r\n\r\n        appendSuccess = true;\r\n\r\n      }\r\n\r\n    }\r\n\r\n    didAppend = true;\r\n\r\n    initMsg();\r\n\r\n    // sm2._wD(sm + ': Trying to load ' + movieURL + (!overHTTP && sm2.altURL ? ' (alternate URL)' : ''), 1);\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  initMovie = function() {\r\n\r\n    if (sm2.html5Only) {\r\n      createMovie();\r\n      return false;\r\n    }\r\n\r\n    // attempt to get, or create, movie (may already exist)\r\n    if (flash) return false;\r\n\r\n    if (!sm2.url) {\r\n\r\n      /**\r\n       * Something isn't right - we've reached init, but the soundManager url property has not been set.\r\n       * User has not called setup({url: ...}), or has not set soundManager.url (legacy use case) directly before init time.\r\n       * Notify and exit. If user calls setup() with a url: property, init will be restarted as in the deferred loading case.\r\n       */\r\n\r\n       _wDS('noURL');\r\n       return false;\r\n\r\n    }\r\n\r\n    // inline markup case\r\n    flash = sm2.getMovie(sm2.id);\r\n\r\n    if (!flash) {\r\n\r\n      if (!oRemoved) {\r\n\r\n        // try to create\r\n        createMovie(sm2.id, sm2.url);\r\n\r\n      } else {\r\n\r\n        // try to re-append removed movie after reboot()\r\n        if (!isIE) {\r\n          sm2.oMC.appendChild(oRemoved);\r\n        } else {\r\n          sm2.oMC.innerHTML = oRemovedHTML;\r\n        }\r\n\r\n        oRemoved = null;\r\n        didAppend = true;\r\n\r\n      }\r\n\r\n      flash = sm2.getMovie(sm2.id);\r\n\r\n    }\r\n\r\n    if (typeof sm2.oninitmovie === 'function') {\r\n      setTimeout(sm2.oninitmovie, 1);\r\n    }\r\n\r\n    // <d>\r\n    flushMessages();\r\n    // </d>\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  delayWaitForEI = function() {\r\n\r\n    setTimeout(waitForEI, 1000);\r\n\r\n  };\r\n\r\n  rebootIntoHTML5 = function() {\r\n\r\n    // special case: try for a reboot with preferFlash: false, if 100% HTML5 mode is possible and useFlashBlock is not enabled.\r\n\r\n    window.setTimeout(function() {\r\n\r\n      complain(smc + 'useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...');\r\n\r\n      sm2.setup({\r\n        preferFlash: false\r\n      }).reboot();\r\n\r\n      // if for some reason you want to detect this case, use an ontimeout() callback and look for html5Only and didFlashBlock == true.\r\n      sm2.didFlashBlock = true;\r\n\r\n      sm2.beginDelayedInit();\r\n\r\n    }, 1);\r\n\r\n  };\r\n\r\n  waitForEI = function() {\r\n\r\n    var p,\r\n        loadIncomplete = false;\r\n\r\n    if (!sm2.url) {\r\n      // No SWF url to load (noURL case) - exit for now. Will be retried when url is set.\r\n      return;\r\n    }\r\n\r\n    if (waitingForEI) {\r\n      return;\r\n    }\r\n\r\n    waitingForEI = true;\r\n    event.remove(window, 'load', delayWaitForEI);\r\n\r\n    if (hasFlash && tryInitOnFocus && !isFocused) {\r\n      // Safari won't load flash in background tabs, only when focused.\r\n      _wDS('waitFocus');\r\n      return;\r\n    }\r\n\r\n    if (!didInit) {\r\n      p = sm2.getMoviePercent();\r\n      if (p > 0 && p < 100) {\r\n        loadIncomplete = true;\r\n      }\r\n    }\r\n\r\n    setTimeout(function() {\r\n\r\n      p = sm2.getMoviePercent();\r\n\r\n      if (loadIncomplete) {\r\n        // special case: if movie *partially* loaded, retry until it's 100% before assuming failure.\r\n        waitingForEI = false;\r\n        sm2._wD(str('waitSWF'));\r\n        window.setTimeout(delayWaitForEI, 1);\r\n        return;\r\n      }\r\n\r\n      // <d>\r\n      if (!didInit) {\r\n\r\n        sm2._wD(sm + ': No Flash response within expected time. Likely causes: ' + (p === 0 ? 'SWF load failed, ' : '') + 'Flash blocked or JS-Flash security error.' + (sm2.debugFlash ? ' ' + str('checkSWF') : ''), 2);\r\n\r\n        if (!overHTTP && p) {\r\n\r\n          _wDS('localFail', 2);\r\n\r\n          if (!sm2.debugFlash) {\r\n            _wDS('tryDebug', 2);\r\n          }\r\n\r\n        }\r\n\r\n        if (p === 0) {\r\n\r\n          // if 0 (not null), probably a 404.\r\n          sm2._wD(str('swf404', sm2.url), 1);\r\n\r\n        }\r\n\r\n        debugTS('flashtojs', false, ': Timed out' + (overHTTP ? ' (Check flash security or flash blockers)' : ' (No plugin/missing SWF?)'));\r\n\r\n      }\r\n      // </d>\r\n\r\n      // give up / time-out, depending\r\n\r\n      if (!didInit && okToDisable) {\r\n\r\n        if (p === null) {\r\n\r\n          // SWF failed to report load progress. Possibly blocked.\r\n\r\n          if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) {\r\n\r\n            if (sm2.useFlashBlock) {\r\n\r\n              flashBlockHandler();\r\n\r\n            }\r\n\r\n            _wDS('waitForever');\r\n\r\n          } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n            // no custom flash block handling, but SWF has timed out. Will recover if user unblocks / allows SWF load.\r\n            rebootIntoHTML5();\r\n\r\n          } else {\r\n\r\n            _wDS('waitForever');\r\n\r\n            // fire any regular registered ontimeout() listeners.\r\n            processOnEvents({\r\n              type: 'ontimeout',\r\n              ignoreInit: true,\r\n              error: {\r\n                type: 'INIT_FLASHBLOCK'\r\n              }\r\n            });\r\n\r\n          }\r\n\r\n        } else if (sm2.flashLoadTimeout === 0) {\r\n\r\n          // SWF loaded? Shouldn't be a blocking issue, then.\r\n\r\n          _wDS('waitForever');\r\n\r\n        } else if (!sm2.useFlashBlock && canIgnoreFlash) {\r\n\r\n          rebootIntoHTML5();\r\n\r\n        } else {\r\n\r\n          failSafely(true);\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }, sm2.flashLoadTimeout);\r\n\r\n  };\r\n\r\n  handleFocus = function() {\r\n\r\n    function cleanup() {\r\n      event.remove(window, 'focus', handleFocus);\r\n    }\r\n\r\n    if (isFocused || !tryInitOnFocus) {\r\n      // already focused, or not special Safari background tab case\r\n      cleanup();\r\n      return true;\r\n    }\r\n\r\n    okToDisable = true;\r\n    isFocused = true;\r\n    _wDS('gotFocus');\r\n\r\n    // allow init to restart\r\n    waitingForEI = false;\r\n\r\n    // kick off ExternalInterface timeout, now that the SWF has started\r\n    delayWaitForEI();\r\n\r\n    cleanup();\r\n    return true;\r\n\r\n  };\r\n\r\n  flushMessages = function() {\r\n\r\n    // <d>\r\n\r\n    // SM2 pre-init debug messages\r\n    if (messages.length) {\r\n      sm2._wD('SoundManager 2: ' + messages.join(' '), 1);\r\n      messages = [];\r\n    }\r\n\r\n    // </d>\r\n\r\n  };\r\n\r\n  showSupport = function() {\r\n\r\n    // <d>\r\n\r\n    flushMessages();\r\n\r\n    var item, tests = [];\r\n\r\n    if (sm2.useHTML5Audio && sm2.hasHTML5) {\r\n      for (item in sm2.audioFormats) {\r\n        if (sm2.audioFormats.hasOwnProperty(item)) {\r\n          tests.push(item + ' = ' + sm2.html5[item] + (!sm2.html5[item] && needsFlash && sm2.flash[item] ? ' (using flash)' : (sm2.preferFlash && sm2.flash[item] && needsFlash ? ' (preferring flash)' : (!sm2.html5[item] ? ' (' + (sm2.audioFormats[item].required ? 'required, ' : '') + 'and no flash support)' : ''))));\r\n        }\r\n      }\r\n      sm2._wD('SoundManager 2 HTML5 support: ' + tests.join(', '), 1);\r\n    }\r\n\r\n    // </d>\r\n\r\n  };\r\n\r\n  initComplete = function(bNoDisable) {\r\n\r\n    if (didInit) return false;\r\n\r\n    if (sm2.html5Only) {\r\n      // all good.\r\n      _wDS('sm2Loaded', 1);\r\n      didInit = true;\r\n      initUserOnload();\r\n      debugTS('onload', true);\r\n      return true;\r\n    }\r\n\r\n    var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()),\r\n        result = true,\r\n        error;\r\n\r\n    if (!wasTimeout) {\r\n      didInit = true;\r\n    }\r\n\r\n    error = {\r\n      type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')\r\n    };\r\n\r\n    sm2._wD('SoundManager 2 ' + (disabled ? 'failed to load' : 'loaded') + ' (' + (disabled ? 'Flash security/load error' : 'OK') + ') ' + String.fromCharCode(disabled ? 10006 : 10003), disabled ? 2 : 1);\r\n\r\n    if (disabled || bNoDisable) {\r\n\r\n      if (sm2.useFlashBlock && sm2.oMC) {\r\n        sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null ? swfCSS.swfTimedout : swfCSS.swfError);\r\n      }\r\n\r\n      processOnEvents({\r\n        type: 'ontimeout',\r\n        error: error,\r\n        ignoreInit: true\r\n      });\r\n\r\n      debugTS('onload', false);\r\n      catchError(error);\r\n\r\n      result = false;\r\n\r\n    } else {\r\n\r\n      debugTS('onload', true);\r\n\r\n    }\r\n\r\n    if (!disabled) {\r\n\r\n      if (sm2.waitForWindowLoad && !windowLoaded) {\r\n\r\n        _wDS('waitOnload');\r\n        event.add(window, 'load', initUserOnload);\r\n\r\n      } else {\r\n\r\n        // <d>\r\n        if (sm2.waitForWindowLoad && windowLoaded) {\r\n          _wDS('docLoaded');\r\n        }\r\n        // </d>\r\n\r\n        initUserOnload();\r\n\r\n      }\r\n\r\n    }\r\n\r\n    return result;\r\n\r\n  };\r\n\r\n  /**\r\n   * apply top-level setupOptions object as local properties, eg., this.setupOptions.flashVersion -> this.flashVersion (soundManager.flashVersion)\r\n   * this maintains backward compatibility, and allows properties to be defined separately for use by soundManager.setup().\r\n   */\r\n\r\n  setProperties = function() {\r\n\r\n    var i,\r\n        o = sm2.setupOptions;\r\n\r\n    for (i in o) {\r\n\r\n      if (o.hasOwnProperty(i)) {\r\n\r\n        // assign local property if not already defined\r\n\r\n        if (sm2[i] === _undefined) {\r\n\r\n          sm2[i] = o[i];\r\n\r\n        } else if (sm2[i] !== o[i]) {\r\n\r\n          // legacy support: write manually-assigned property (eg., soundManager.url) back to setupOptions to keep things in sync\r\n          sm2.setupOptions[i] = sm2[i];\r\n\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n\r\n  init = function() {\r\n\r\n    // called after onload()\r\n\r\n    if (didInit) {\r\n      _wDS('didInit');\r\n      return false;\r\n    }\r\n\r\n    function cleanup() {\r\n      event.remove(window, 'load', sm2.beginDelayedInit);\r\n    }\r\n\r\n    if (sm2.html5Only) {\r\n\r\n      if (!didInit) {\r\n        // we don't need no steenking flash!\r\n        cleanup();\r\n        sm2.enabled = true;\r\n        initComplete();\r\n      }\r\n\r\n      return true;\r\n\r\n    }\r\n\r\n    // flash path\r\n    initMovie();\r\n\r\n    try {\r\n\r\n      // attempt to talk to Flash\r\n      flash._externalInterfaceTest(false);\r\n\r\n      /**\r\n       * Apply user-specified polling interval, OR, if \"high performance\" set, faster vs. default polling\r\n       * (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates)\r\n       */\r\n      setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50)));\r\n\r\n      if (!sm2.debugMode) {\r\n        // stop the SWF from making debug output calls to JS\r\n        flash._disableDebug();\r\n      }\r\n\r\n      sm2.enabled = true;\r\n      debugTS('jstoflash', true);\r\n\r\n      if (!sm2.html5Only) {\r\n        // prevent browser from showing cached page state (or rather, restoring \"suspended\" page state) via back button, because flash may be dead\r\n        // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/\r\n        event.add(window, 'unload', doNothing);\r\n      }\r\n\r\n    } catch(e) {\r\n\r\n      sm2._wD('js/flash exception: ' + e.toString());\r\n\r\n      debugTS('jstoflash', false);\r\n\r\n      catchError({\r\n        type: 'JS_TO_FLASH_EXCEPTION',\r\n        fatal: true\r\n      });\r\n\r\n      // don't disable, for reboot()\r\n      failSafely(true);\r\n\r\n      initComplete();\r\n\r\n      return false;\r\n\r\n    }\r\n\r\n    initComplete();\r\n\r\n    // disconnect events\r\n    cleanup();\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  domContentLoaded = function() {\r\n\r\n    if (didDCLoaded) return false;\r\n\r\n    didDCLoaded = true;\r\n\r\n    // assign top-level soundManager properties eg. soundManager.url\r\n    setProperties();\r\n\r\n    initDebug();\r\n\r\n    if (!hasFlash && sm2.hasHTML5) {\r\n\r\n      sm2._wD('SoundManager 2: No Flash detected' + (!sm2.useHTML5Audio ? ', enabling HTML5.' : '. Trying HTML5-only mode.'), 1);\r\n\r\n      sm2.setup({\r\n        useHTML5Audio: true,\r\n        // make sure we aren't preferring flash, either\r\n        // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.\r\n        preferFlash: false\r\n      });\r\n\r\n    }\r\n\r\n    testHTML5();\r\n\r\n    if (!hasFlash && needsFlash) {\r\n\r\n      messages.push(strings.needFlash);\r\n\r\n      // TODO: Fatal here vs. timeout approach, etc.\r\n      // hack: fail sooner.\r\n      sm2.setup({\r\n        flashLoadTimeout: 1\r\n      });\r\n\r\n    }\r\n\r\n    if (doc.removeEventListener) {\r\n      doc.removeEventListener('DOMContentLoaded', domContentLoaded, false);\r\n    }\r\n\r\n    initMovie();\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  domContentLoadedIE = function() {\r\n\r\n    if (doc.readyState === 'complete') {\r\n      domContentLoaded();\r\n      doc.detachEvent('onreadystatechange', domContentLoadedIE);\r\n    }\r\n\r\n    return true;\r\n\r\n  };\r\n\r\n  winOnLoad = function() {\r\n\r\n    // catch edge case of initComplete() firing after window.load()\r\n    windowLoaded = true;\r\n\r\n    // catch case where DOMContentLoaded has been sent, but we're still in doc.readyState = 'interactive'\r\n    domContentLoaded();\r\n\r\n    event.remove(window, 'load', winOnLoad);\r\n\r\n  };\r\n\r\n  // sniff up-front\r\n  detectFlash();\r\n\r\n  // focus and window load, init (primarily flash-driven)\r\n  event.add(window, 'focus', handleFocus);\r\n  event.add(window, 'load', delayWaitForEI);\r\n  event.add(window, 'load', winOnLoad);\r\n\r\n  if (doc.addEventListener) {\r\n\r\n    doc.addEventListener('DOMContentLoaded', domContentLoaded, false);\r\n\r\n  } else if (doc.attachEvent) {\r\n\r\n    doc.attachEvent('onreadystatechange', domContentLoadedIE);\r\n\r\n  } else {\r\n\r\n    // no add/attachevent support - safe to assume no JS -> Flash either\r\n    debugTS('onload', false);\r\n    catchError({\r\n      type: 'NO_DOM2_EVENTS',\r\n      fatal: true\r\n    });\r\n\r\n  }\r\n\r\n} // SoundManager()\r\n\r\n// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading\r\n\r\nif (window.SM2_DEFER === _undefined || !SM2_DEFER) {\r\n  soundManager = new SoundManager();\r\n}\r\n\r\n/**\r\n * SoundManager public interfaces\r\n * ------------------------------\r\n */\r\n\r\nif ( true && module && typeof module.exports === 'object') {\r\n\r\n  /**\r\n   * commonJS module\r\n   */\r\n\r\n  module.exports.SoundManager = SoundManager;\r\n  module.exports.soundManager = soundManager;\r\n\r\n} else if (true) {\r\n\r\n  /**\r\n   * AMD - requireJS\r\n   * basic usage:\r\n   * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n   *   SoundManager.getInstance().setup({\r\n   *     url: '/swf/',\r\n   *     onready: function() { ... }\r\n   *   })\r\n   * });\r\n   *\r\n   * SM2_DEFER usage:\r\n   * window.SM2_DEFER = true;\r\n   * require([\"/path/to/soundmanager2.js\"], function(SoundManager) {\r\n   *   SoundManager.getInstance(function() {\r\n   *     var soundManager = new SoundManager.constructor();\r\n   *     soundManager.setup({\r\n   *       url: '/swf/',\r\n   *       ...\r\n   *     });\r\n   *     ...\r\n   *     soundManager.beginDelayedInit();\r\n   *     return soundManager;\r\n   *   })\r\n   * });\r\n   */\r\n\r\n  !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\r\n    /**\r\n     * Retrieve the global instance of SoundManager.\r\n     * If a global instance does not exist it can be created using a callback.\r\n     *\r\n     * @param {Function} smBuilder Optional: Callback used to create a new SoundManager instance\r\n     * @return {SoundManager} The global SoundManager instance\r\n     */\r\n    function getInstance(smBuilder) {\r\n      if (!window.soundManager && smBuilder instanceof Function) {\r\n        var instance = smBuilder(SoundManager);\r\n        if (instance instanceof SoundManager) {\r\n          window.soundManager = instance;\r\n        }\r\n      }\r\n      return window.soundManager;\r\n    }\r\n    return {\r\n      constructor: SoundManager,\r\n      getInstance: getInstance\r\n    };\r\n  }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n}\r\n\r\n// standard browser case\r\n\r\n// constructor\r\nwindow.SoundManager = SoundManager;\r\n\r\n/**\r\n * note: SM2 requires a window global due to Flash, which makes calls to window.soundManager.\r\n * Flash may not always be needed, but this is not known until async init and SM2 may even \"reboot\" into Flash mode.\r\n */\r\n\r\n// public API, flash callbacks etc.\r\nwindow.soundManager = soundManager;\r\n\r\n}(window));\r\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack:///./jaas-client/node_modules/soundmanager2/script/soundmanager2.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js":
+/*!****************************************************************************!*\
+  !*** ./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js ***!
+  \****************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar isProduction = \"development\" === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n    if (condition) {\n        return;\n    }\n    if (isProduction) {\n        throw new Error(prefix);\n    }\n    throw new Error(prefix + \": \" + (message || ''));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (invariant);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/tiny-invariant/dist/tiny-invariant.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js":
+/*!************************************************************************!*\
+  !*** ./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js ***!
+  \************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nvar isProduction = \"development\" === 'production';\nfunction warning(condition, message) {\n  if (!isProduction) {\n    if (condition) {\n      return;\n    }\n\n    var text = \"Warning: \" + message;\n\n    if (typeof console !== 'undefined') {\n      console.warn(text);\n    }\n\n    try {\n      throw Error(text);\n    } catch (x) {}\n  }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (warning);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/tiny-warning/dist/tiny-warning.esm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/to-array/index.js":
+/*!****************************************************!*\
+  !*** ./jaas-client/node_modules/to-array/index.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = toArray\n\nfunction toArray(list, index) {\n    var array = []\n\n    index = index || 0\n\n    for (var i = index || 0; i < list.length; i++) {\n        array[i - index] = list[i]\n    }\n\n    return array\n}\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/to-array/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/value-equal/esm/value-equal.js":
+/*!*****************************************************************!*\
+  !*** ./jaas-client/node_modules/value-equal/esm/value-equal.js ***!
+  \*****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\nfunction valueOf(obj) {\n  return obj.valueOf ? obj.valueOf() : Object.prototype.valueOf.call(obj);\n}\n\nfunction valueEqual(a, b) {\n  // Test for strict equality first.\n  if (a === b) return true;\n\n  // Otherwise, if either of them == null they are not equal.\n  if (a == null || b == null) return false;\n\n  if (Array.isArray(a)) {\n    return (\n      Array.isArray(b) &&\n      a.length === b.length &&\n      a.every(function(item, index) {\n        return valueEqual(item, b[index]);\n      })\n    );\n  }\n\n  if (typeof a === 'object' || typeof b === 'object') {\n    var aValue = valueOf(a);\n    var bValue = valueOf(b);\n\n    if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);\n\n    return Object.keys(Object.assign({}, a, b)).every(function(key) {\n      return valueEqual(a[key], b[key]);\n    });\n  }\n\n  return false;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (valueEqual);\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/value-equal/esm/value-equal.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/node_modules/yeast/index.js":
+/*!*************************************************!*\
+  !*** ./jaas-client/node_modules/yeast/index.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')\n  , length = 64\n  , map = {}\n  , seed = 0\n  , i = 0\n  , prev;\n\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nfunction encode(num) {\n  var encoded = '';\n\n  do {\n    encoded = alphabet[num % length] + encoded;\n    num = Math.floor(num / length);\n  } while (num > 0);\n\n  return encoded;\n}\n\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nfunction decode(str) {\n  var decoded = 0;\n\n  for (i = 0; i < str.length; i++) {\n    decoded = decoded * length + map[str.charAt(i)];\n  }\n\n  return decoded;\n}\n\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nfunction yeast() {\n  var now = encode(+new Date());\n\n  if (now !== prev) return seed = 0, prev = now;\n  return now +'.'+ encode(seed++);\n}\n\n//\n// Map each character to its index.\n//\nfor (; i < length; i++) map[alphabet[i]] = i;\n\n//\n// Expose the `yeast`, `encode` and `decode` functions.\n//\nyeast.encode = encode;\nyeast.decode = decode;\nmodule.exports = yeast;\n\n\n//# sourceURL=webpack:///./jaas-client/node_modules/yeast/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/App.css":
+/*!*********************************!*\
+  !*** ./jaas-client/src/App.css ***!
+  \*********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var api = __webpack_require__(/*! ../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n            var content = __webpack_require__(/*! !../../node_modules/css-loader/dist/cjs.js!./App.css */ \"./node_modules/css-loader/dist/cjs.js!./jaas-client/src/App.css\");\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};\n\n//# sourceURL=webpack:///./jaas-client/src/App.css?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/App.js":
+/*!********************************!*\
+  !*** ./jaas-client/src/App.js ***!
+  \********************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _App_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./App.css */ \"./jaas-client/src/App.css\");\n/* harmony import */ var _App_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_App_css__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-router-dom */ \"./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var _pages_index_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pages/index.jsx */ \"./jaas-client/src/pages/index.jsx\");\n/* harmony import */ var _pages_jaas_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pages/jaas.jsx */ \"./jaas-client/src/pages/jaas.jsx\");\n/* harmony import */ var _pages_404_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pages/404.jsx */ \"./jaas-client/src/pages/404.jsx\");\n/*\n  Company: Savoir-faire Linux\n  Author: Larbi Gharib <larbi.gharib@savoirfairelinux.com>\n  UI Project inspired from https://scrimba.com/p/pbNpTv/cbZBmfV\n  License: AGPL-3\n*/\n //import logo from './logo.svg';\n\n\n\n\n\n\n\nclass App extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"BrowserRouter\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Switch\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Route\"], {\n      exact: true,\n      path: \"/\",\n      component: _pages_index_jsx__WEBPACK_IMPORTED_MODULE_3__[\"default\"]\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Route\"], {\n      to: \"/Jaas\",\n      component: _pages_jaas_jsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"]\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Route\"], {\n      exact: true,\n      path: \"/404\",\n      component: _pages_404_jsx__WEBPACK_IMPORTED_MODULE_5__[\"default\"]\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__[\"Redirect\"], {\n      to: \"/404\"\n    })));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (App);\n\n//# sourceURL=webpack:///./jaas-client/src/App.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/components/ContactList.js":
+/*!***************************************************!*\
+  !*** ./jaas-client/src/components/ContactList.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nclass ContactList extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"rooms-list\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"ul\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"h3\", null, \"Liste de contacts\")));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ContactList);\n\n//# sourceURL=webpack:///./jaas-client/src/components/ContactList.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/components/Header.js":
+/*!**********************************************!*\
+  !*** ./jaas-client/src/components/Header.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Header; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _material_ui_core_Button__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/core/Button */ \"./jaas-client/node_modules/@material-ui/core/esm/Button/index.js\");\n/* harmony import */ var _material_ui_core_Menu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/core/Menu */ \"./jaas-client/node_modules/@material-ui/core/esm/Menu/index.js\");\n/* harmony import */ var _material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/core/MenuItem */ \"./jaas-client/node_modules/@material-ui/core/esm/MenuItem/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-router-dom */ \"./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js\");\n\n\n\n\n\nfunction Header() {\n  const history = Object(react_router_dom__WEBPACK_IMPORTED_MODULE_4__[\"useHistory\"])();\n  const [anchorEl, setAnchorEl] = react__WEBPACK_IMPORTED_MODULE_0___default.a.useState(null);\n\n  const handleClick = event => {\n    setAnchorEl(event.currentTarget);\n  };\n\n  const handleClose = () => {\n    setAnchorEl(null);\n  };\n\n  const disconnect = () => {\n    let path = `/`;\n    history.push(path);\n  };\n\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Button__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n    \"aria-controls\": \"simple-menu\",\n    \"aria-haspopup\": \"true\",\n    onClick: handleClick\n  }, \"Menu\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Menu__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n    id: \"simple-menu\",\n    anchorEl: anchorEl,\n    keepMounted: true,\n    open: Boolean(anchorEl),\n    onClose: handleClose\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    onClick: handleClose\n  }, \"Profile\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    onClick: handleClose\n  }, \"Mon compte\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_MenuItem__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n    onClick: disconnect\n  }, \"D\\xE9connexion\")));\n}\n\n//# sourceURL=webpack:///./jaas-client/src/components/Header.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/components/Message.js":
+/*!***********************************************!*\
+  !*** ./jaas-client/src/components/Message.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nfunction Message(props) {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n    className: \"message\"\n  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n    className: \"message-username\"\n  }, props.username), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n    className: \"message-text\"\n  }, props.text));\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Message);\n\n//# sourceURL=webpack:///./jaas-client/src/components/Message.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/components/MessageList.js":
+/*!***************************************************!*\
+  !*** ./jaas-client/src/components/MessageList.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Message */ \"./jaas-client/src/components/Message.js\");\n\n\n\nclass MessageList extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"message-list\"\n    }, this.props.messages.map((message, index) => {\n      /*DUMMY_DATA.map((message, index) => {*/\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Message__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n        key: index,\n        username: message.senderId,\n        text: message.text\n      });\n    }));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (MessageList);\n\n//# sourceURL=webpack:///./jaas-client/src/components/MessageList.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/components/NewContactForm.js":
+/*!******************************************************!*\
+  !*** ./jaas-client/src/components/NewContactForm.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nclass NewContactForm extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"new-room-form\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"form\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"input\", {\n      type: \"text\",\n      placeholder: \"Ajouter un contact\",\n      required: true\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"button\", {\n      id: \"create-room-btn\",\n      type: \"submit\"\n    }, \"+\")));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (NewContactForm);\n\n//# sourceURL=webpack:///./jaas-client/src/components/NewContactForm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/components/SendMessageForm.js":
+/*!*******************************************************!*\
+  !*** ./jaas-client/src/components/SendMessageForm.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_input_emoji__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-input-emoji */ \"./jaas-client/node_modules/react-input-emoji/dist/index.es.js\");\n\n\n\nclass SendMessageForm extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  constructor() {\n    super();\n    this.state = {\n      message: ''\n    };\n    this.handleChange = this.handleChange.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n  }\n\n  handleChange(e) {\n    this.setState({\n      message: e\n    });\n  }\n\n  handleSubmit(e) {\n    //e.preventDefault()\n    this.props.sendMessage(this.state.message); //this.props.sendMessage(this.state.message)\n\n    this.setState({\n      message: ''\n    });\n  }\n\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      //onSubmit={this.handleSubmit}\n      className: \"send-message-form\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_input_emoji__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n      disabled: this.props.disabled,\n      onChange: this.handleChange,\n      value: this.state.message,\n      cleanOnEnter: true,\n      onEnter: this.handleSubmit,\n      placeholder: \"\\xC9cris ton message et cliques sur Entrer\",\n      height: \"35\"\n    }));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (SendMessageForm);\n\n//# sourceURL=webpack:///./jaas-client/src/components/SendMessageForm.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/index.css":
+/*!***********************************!*\
+  !*** ./jaas-client/src/index.css ***!
+  \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("var api = __webpack_require__(/*! ../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n            var content = __webpack_require__(/*! !../../node_modules/css-loader/dist/cjs.js!./index.css */ \"./node_modules/css-loader/dist/cjs.js!./jaas-client/src/index.css\");\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};\n\n//# sourceURL=webpack:///./jaas-client/src/index.css?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/index.js":
+/*!**********************************!*\
+  !*** ./jaas-client/src/index.js ***!
+  \**********************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./jaas-client/node_modules/react-dom/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.css */ \"./jaas-client/src/index.css\");\n/* harmony import */ var _index_css__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_index_css__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./App */ \"./jaas-client/src/App.js\");\n/* harmony import */ var _serviceWorker__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./serviceWorker */ \"./jaas-client/src/serviceWorker.js\");\n\n\n\n\n\nreact_dom__WEBPACK_IMPORTED_MODULE_1___default.a.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.StrictMode, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_App__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null)), document.getElementById('root')); // If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\n\n_serviceWorker__WEBPACK_IMPORTED_MODULE_4__[\"unregister\"]();\n\n//# sourceURL=webpack:///./jaas-client/src/index.js?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/pages/404.jsx":
+/*!***************************************!*\
+  !*** ./jaas-client/src/pages/404.jsx ***!
+  \***************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\n\nconst NotFoundPage = () => {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"h3\", null, \"404 Page not found\"));\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (NotFoundPage);\n\n//# sourceURL=webpack:///./jaas-client/src/pages/404.jsx?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/pages/index.jsx":
+/*!*****************************************!*\
+  !*** ./jaas-client/src/pages/index.jsx ***!
+  \*****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _material_ui_core_Avatar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @material-ui/core/Avatar */ \"./jaas-client/node_modules/@material-ui/core/esm/Avatar/index.js\");\n/* harmony import */ var _material_ui_core_Button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @material-ui/core/Button */ \"./jaas-client/node_modules/@material-ui/core/esm/Button/index.js\");\n/* harmony import */ var _material_ui_core_CssBaseline__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @material-ui/core/CssBaseline */ \"./jaas-client/node_modules/@material-ui/core/esm/CssBaseline/index.js\");\n/* harmony import */ var _material_ui_core_TextField__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @material-ui/core/TextField */ \"./jaas-client/node_modules/@material-ui/core/esm/TextField/index.js\");\n/* harmony import */ var _material_ui_core_FormControlLabel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @material-ui/core/FormControlLabel */ \"./jaas-client/node_modules/@material-ui/core/esm/FormControlLabel/index.js\");\n/* harmony import */ var _material_ui_core_Checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @material-ui/core/Checkbox */ \"./jaas-client/node_modules/@material-ui/core/esm/Checkbox/index.js\");\n/* harmony import */ var _material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @material-ui/core/Link */ \"./jaas-client/node_modules/@material-ui/core/esm/Link/index.js\");\n/* harmony import */ var _material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @material-ui/core/Grid */ \"./jaas-client/node_modules/@material-ui/core/esm/Grid/index.js\");\n/* harmony import */ var _material_ui_core_Box__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @material-ui/core/Box */ \"./jaas-client/node_modules/@material-ui/core/esm/Box/index.js\");\n/* harmony import */ var _material_ui_icons_LockOutlined__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @material-ui/icons/LockOutlined */ \"./jaas-client/node_modules/@material-ui/icons/LockOutlined.js\");\n/* harmony import */ var _material_ui_icons_LockOutlined__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_material_ui_icons_LockOutlined__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @material-ui/core/Typography */ \"./jaas-client/node_modules/@material-ui/core/esm/Typography/index.js\");\n/* harmony import */ var _material_ui_core_Container__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @material-ui/core/Container */ \"./jaas-client/node_modules/@material-ui/core/esm/Container/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! react-router-dom */ \"./jaas-client/node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var _material_ui_core_CircularProgress__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @material-ui/core/CircularProgress */ \"./jaas-client/node_modules/@material-ui/core/esm/CircularProgress/index.js\");\n/* harmony import */ var _material_ui_core_DialogTitle__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @material-ui/core/DialogTitle */ \"./jaas-client/node_modules/@material-ui/core/esm/DialogTitle/index.js\");\n/* harmony import */ var _material_ui_core_Dialog__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @material-ui/core/Dialog */ \"./jaas-client/node_modules/@material-ui/core/esm/Dialog/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n //import { makeStyles } from '@material-ui/core/styles';\n\n\n\n\n\n\n\nfunction Copyright() {\n  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n    variant: \"body2\",\n    color: \"textSecondary\",\n    align: \"center\"\n  }, 'Copyright © 2016-', new Date().getFullYear(), ' Savoir-faire Linux Inc. GNU ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n    color: \"inherit\",\n    href: \"https://jami.net/\"\n  }, \"Jami.net\"), ' ', '.');\n}\n/*const useStyles = makeStyles((theme) => ({\n    paper: {\n        marginTop: theme.spacing(8),\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n    },\n    avatar: {\n        margin: theme.spacing(1),\n        backgroundColor: theme.palette.secondary.main,\n    },\n    form: {\n        width: '100%', // Fix IE 11 issue.\n        marginTop: theme.spacing(1),\n    },\n    submit: {\n        margin: theme.spacing(3, 0, 2),\n    },\n}));*/\n\n/*function SignIn() {\n    const classes = useStyles();\n\n\n}*/\n\n/* \n    TODO:\n    Use useState to handle username password and redirect states to render this page to \n    comply with material-ui usage of useStyles\n    Src: https://blog.logrocket.com/a-guide-to-usestate-in-react-ecb9952e406c/\n*/\n\n\nclass SignInPage extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  constructor() {\n    super();\n    this.state = {\n      username: '',\n      password: '',\n      redirect: false,\n      session: null,\n      submitted: false,\n      loading: false,\n      error: false,\n      open: false,\n      errorMessage: ''\n    };\n    this.handleSubmit = this.handleSubmit.bind(this);\n  }\n\n  handleusername(text) {\n    this.setState({\n      username: text.target.value\n    });\n  }\n\n  handlePassword(text) {\n    this.setState({\n      password: text.target.value\n    });\n  }\n\n  handleSubmit(event) {\n    event.preventDefault();\n    let obj = {};\n    obj.username = this.state.username;\n    obj.password = this.state.password;\n    this.setState({\n      submitted: true,\n      loading: true\n    });\n    fetch('/api/login?username=' + obj.username + '&password=' + obj.password, {\n      header: {\n        \"Content-Type\": \"application/json\"\n      },\n      method: \"POST\",\n      credentials: 'same-origin' //body: JSON.stringify({ obj })\n\n    }).then(res => {\n      if (res.status == '200') {\n        this.setState({\n          redirect: true\n        });\n      } else if (res.status == '401') {\n        this.setState({\n          loading: false,\n          error: true,\n          open: true,\n          errorMessage: \"Wrong credentials! Your are not allowed to connect\"\n        });\n      } //this.setState({ session: res });\n\n    }).catch(e => {\n      this.setState({\n        loading: false,\n        error: true,\n        open: true,\n        errorMessage: e.toString()\n      });\n    });\n  }\n\n  render() {\n    if (this.state.redirect) {\n      return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_13__[\"Redirect\"], {\n        to: \"/jaas\"\n      });\n    }\n\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Container__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n      component: \"main\",\n      maxWidth: \"xs\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_CssBaseline__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"\"\n      /*{classes.paper}*/\n\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Typography__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n      component: \"h1\",\n      variant: \"h5\"\n    }, \"Se connecter\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"form\", {\n      className: \"\"\n      /*{classes.form}*/\n      ,\n      onSubmit: this.handleSubmit\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TextField__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      variant: \"outlined\",\n      margin: \"normal\",\n      required: true,\n      fullWidth: true,\n      id: \"username\",\n      label: \"LDAP Savoir-faire Linux\",\n      name: \"username\",\n      autoComplete: \"email\",\n      autoFocus: true,\n      onChange: text => {\n        this.handleusername(text);\n      }\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TextField__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      variant: \"outlined\",\n      margin: \"normal\",\n      required: true,\n      fullWidth: true,\n      name: \"password\",\n      label: \"Mot de passe\",\n      type: \"password\",\n      id: \"password\",\n      autoComplete: \"current-password\",\n      onChange: text => {\n        this.handlePassword(text);\n      }\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_FormControlLabel__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n      control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Checkbox__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n        value: \"remember\",\n        color: \"primary\"\n      }),\n      label: \"Se rapeller de moi\"\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n      type: \"submit\",\n      fullWidth: true,\n      variant: \"contained\",\n      color: \"primary\",\n      className: \"\"\n      /*{classes.submit}*/\n      // onClick={() => { this.login() }}\n\n    }, \"Se connecter\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n      container: true\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n      item: true,\n      xs: true\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n      href: \"#\",\n      variant: \"body2\"\n    }, \"Mot de passe oubli\\xE9 ?\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Grid__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n      item: true\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Link__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n      href: \"#\",\n      variant: \"body2\"\n    }, \"Tu n'as pas de compte? Inscris-toi\"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Box__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n      mt: 8\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Copyright, null)), this.state.submitted && this.state.loading && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_CircularProgress__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n      style: {\n        position: 'relative'\n      },\n      size: 40,\n      top: 10,\n      style: {\n        marginLeft: '50%'\n      }\n    }), this.state.error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Dialog__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n      \"aria-labelledby\": \"simple-dialog-title\",\n      open: this.state.open\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_DialogTitle__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n      id: \"simple-dialog-title\"\n    }, this.state.errorMessage)));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (SignInPage);\n\n//# sourceURL=webpack:///./jaas-client/src/pages/index.jsx?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/pages/jaas.jsx":
+/*!****************************************!*\
+  !*** ./jaas-client/src/pages/jaas.jsx ***!
+  \****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./jaas-client/node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _components_Header__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/Header */ \"./jaas-client/src/components/Header.js\");\n/* harmony import */ var _components_ContactList__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../components/ContactList */ \"./jaas-client/src/components/ContactList.js\");\n/* harmony import */ var _components_MessageList__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../components/MessageList */ \"./jaas-client/src/components/MessageList.js\");\n/* harmony import */ var _components_SendMessageForm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../components/SendMessageForm */ \"./jaas-client/src/components/SendMessageForm.js\");\n/* harmony import */ var _components_NewContactForm__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/NewContactForm */ \"./jaas-client/src/components/NewContactForm.js\");\n/* harmony import */ var react_sound__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-sound */ \"./jaas-client/node_modules/react-sound/lib/index.js\");\n/* harmony import */ var react_sound__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_sound__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! socket.io-client */ \"./jaas-client/node_modules/socket.io-client/lib/index.js\");\n/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(socket_io_client__WEBPACK_IMPORTED_MODULE_7__);\n\n\n\n\n\n\n\n\nvar socket = socket_io_client__WEBPACK_IMPORTED_MODULE_7___default.a.connect('http://localhost:3000');\n\nclass Jaas extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n  constructor() {\n    super();\n    this.state = {\n      messages: [],\n      sound: false\n    };\n    socket.on('connect', () => {\n      console.log(\"Success !\");\n    }); //import io from 'socket.io-client';\n    //this.socket = socketIOClient(ENDPOINT);\n    //this.socket.on(\"FromAPI\", data => {\n    //  this.setState({\n    //    messages: [...this.state.messages, data]\n    //  })\n    //});\n\n    this.sendMessage = this.sendMessage.bind(this);\n  }\n\n  componentDidMount() {\n    socket.on('receivedMessage', data => {\n      var message = {\n        senderId: '65f6674b26e5af6ed0b4e92a13b80ff4bbfdf1e8',\n        text: data\n      };\n      this.setState({\n        messages: [...this.state.messages, message],\n        sound: true\n      });\n    });\n  }\n\n  sendMessage(text) {\n    var data = {\n      senderId: 'Me',\n      destinationId: '65f6674b26e5af6ed0b4e92a13b80ff4bbfdf1e8',\n      text: text\n    };\n    socket.emit(\"SendMessage\", data);\n    console.log(data.text);\n    this.setState({\n      messages: [...this.state.messages, data],\n      sound: false\n    });\n  }\n\n  render() {\n    return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"div\", {\n      className: \"app\"\n    }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_Header__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_ContactList__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_MessageList__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n      messages: this.state.messages\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_SendMessageForm__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n      sendMessage: this.sendMessage\n    }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_NewContactForm__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null), this.state.sound && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_sound__WEBPACK_IMPORTED_MODULE_6___default.a, {\n      url: \"stairs.mp3\"\n      /*https://notificationsounds.com/message-tones/stairs-567*/\n      ,\n      playStatus: react_sound__WEBPACK_IMPORTED_MODULE_6___default.a.status.PLAYING,\n      playFromPosition: 0\n      /* in milliseconds */\n      ,\n      onLoading: this.handleSongLoading,\n      onPlaying: this.handleSongPlaying,\n      onFinishedPlaying: this.handleSongFinishedPlaying\n    }));\n  }\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Jaas);\n\n//# sourceURL=webpack:///./jaas-client/src/pages/jaas.jsx?");
+
+/***/ }),
+
+/***/ "./jaas-client/src/serviceWorker.js":
+/*!******************************************!*\
+  !*** ./jaas-client/src/serviceWorker.js ***!
+  \******************************************/
+/*! exports provided: register, unregister */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"register\", function() { return register; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unregister\", function() { return unregister; });\n// This optional code is used to register a service worker.\n// register() is not called by default.\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\nconst isLocalhost = Boolean(window.location.hostname === 'localhost' || // [::1] is the IPv6 localhost address.\nwindow.location.hostname === '[::1]' || // 127.0.0.0/8 are considered localhost for IPv4.\nwindow.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));\nfunction register(config) {\n  if (false) {}\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker.register(swUrl).then(registration => {\n    registration.onupdatefound = () => {\n      const installingWorker = registration.installing;\n\n      if (installingWorker == null) {\n        return;\n      }\n\n      installingWorker.onstatechange = () => {\n        if (installingWorker.state === 'installed') {\n          if (navigator.serviceWorker.controller) {\n            // At this point, the updated precached content has been fetched,\n            // but the previous service worker will still serve the older\n            // content until all client tabs are closed.\n            console.log('New content is available and will be used when all ' + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'); // Execute callback\n\n            if (config && config.onUpdate) {\n              config.onUpdate(registration);\n            }\n          } else {\n            // At this point, everything has been precached.\n            // It's the perfect time to display a\n            // \"Content is cached for offline use.\" message.\n            console.log('Content is cached for offline use.'); // Execute callback\n\n            if (config && config.onSuccess) {\n              config.onSuccess(registration);\n            }\n          }\n        }\n      };\n    };\n  }).catch(error => {\n    console.error('Error during service worker registration:', error);\n  });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: {\n      'Service-Worker': 'script'\n    }\n  }).then(response => {\n    // Ensure service worker exists, and that we really are getting a JS file.\n    const contentType = response.headers.get('content-type');\n\n    if (response.status === 404 || contentType != null && contentType.indexOf('javascript') === -1) {\n      // No service worker found. Probably a different app. Reload the page.\n      navigator.serviceWorker.ready.then(registration => {\n        registration.unregister().then(() => {\n          window.location.reload();\n        });\n      });\n    } else {\n      // Service worker found. Proceed as normal.\n      registerValidSW(swUrl, config);\n    }\n  }).catch(() => {\n    console.log('No internet connection found. App is running in offline mode.');\n  });\n}\n\nfunction unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    }).catch(error => {\n      console.error(error.message);\n    });\n  }\n}\n\n//# sourceURL=webpack:///./jaas-client/src/serviceWorker.js?");
+
+/***/ }),
+
+/***/ "./node_modules/base64-js/index.js":
+/*!*****************************************!*\
+  !*** ./node_modules/base64-js/index.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(\n      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n    ))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n\n\n//# sourceURL=webpack:///./node_modules/base64-js/index.js?");
+
+/***/ }),
+
+/***/ "./node_modules/buffer/index.js":
+/*!**************************************!*\
+  !*** ./node_modules/buffer/index.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("/* WEBPACK VAR INJECTION */(function(global) {/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n\n\nvar base64 = __webpack_require__(/*! base64-js */ \"./node_modules/base64-js/index.js\")\nvar ieee754 = __webpack_require__(/*! ieee754 */ \"./node_modules/ieee754/index.js\")\nvar isArray = __webpack_require__(/*! isarray */ \"./node_modules/isarray/index.js\")\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./node_modules/buffer/index.js?");
+
+/***/ }),
+
+/***/ "./node_modules/css-loader/dist/cjs.js!./jaas-client/src/App.css":
+/*!***********************************************************************!*\
+  !*** ./node_modules/css-loader/dist/cjs.js!./jaas-client/src/App.css ***!
+  \***********************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \".App {\\n  text-align: center;\\n}\\n\\n.App-logo {\\n  height: 40vmin;\\n  pointer-events: none;\\n}\\n\\n@media (prefers-reduced-motion: no-preference) {\\n  .App-logo {\\n    animation: App-logo-spin infinite 20s linear;\\n  }\\n}\\n\\n.App-header {\\n  background-color: #282c34;\\n  min-height: 100vh;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  font-size: calc(10px + 2vmin);\\n  color: white;\\n}\\n\\n.App-link {\\n  color: #61dafb;\\n}\\n\\n@keyframes App-logo-spin {\\n  from {\\n    transform: rotate(0deg);\\n  }\\n  to {\\n    transform: rotate(360deg);\\n  }\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./jaas-client/src/App.css?./node_modules/css-loader/dist/cjs.js");
+
+/***/ }),
+
+/***/ "./node_modules/css-loader/dist/cjs.js!./jaas-client/src/index.css":
+/*!*************************************************************************!*\
+  !*** ./node_modules/css-loader/dist/cjs.js!./jaas-client/src/index.css ***!
+  \*************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \":root {\\n  --main-color: #1F1F1F;\\n  --secondary-color: white;\\n  --third-color: #2F2F2F;\\n  --main-text-color: #3e5869;\\n  --secondary-text-color: #b0c7d6;\\n  --send-message-form: #F5F5F5;\\n}\\n\\nhtml, body {\\n  height: 100%;\\n  margin: 0;\\n  padding: 0;\\n  font-family: 'Open Sans', sans-serif;\\n  font-weight: 200;\\n  color: #3e5869; \\n}\\n\\n#root {\\n  height: 100%;\\n}\\n\\n.app {\\n  display: grid;\\n  height: 100%;\\n  grid-template-columns: repeat(6, 1fr);\\n  grid-template-rows: 40px 1fr 1fr 1fr 1fr 1fr 60px;\\n  grid-template-areas: \\n      \\\"h h h h h h\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"r m m m m m\\\"\\n      \\\"n s s s s s\\\";\\n}\\n\\n.login {\\n  background-color: var(--main-color);\\n}\\n\\n.header-section {\\n  grid-area: h;\\n}\\n\\n.new-room-form {\\n  grid-area: n;\\n}\\n\\n.rooms-list {\\n  grid-area: r;\\n}\\n\\n.message-list {\\n  grid-area: m;\\n}\\n\\n.send-message-form {\\n  grid-area: s;\\n}\\n\\n/* REST OF CSS */\\n\\n.header-section {\\n  background-color: var(--main-color);\\n\\n}\\n\\n.simple-menu {\\n  color: var(--send-message-form);\\n}\\n\\n.rooms-list {\\n  box-sizing: border-box;\\n  padding: 10px;\\n  background-color: var(--main-color);\\n  overflow: scroll;\\n  height: 100%;\\n}\\n\\n.rooms-list ul {\\n  list-style-type: none;    \\n  padding: 0;\\n  overflow: scoll;\\n}\\n\\n.rooms-list li {\\n  margin: 10px 0;\\n}\\n\\n.rooms-list h3 {\\n  margin: 5px 0;\\n  color: var(--secondary-color);\\n}\\n\\n.rooms-list .room a {\\n  color: var(--secondary-text-color);\\n  font-weight: 600;\\n  text-decoration: none;\\n  \\n}\\n\\n.rooms-list .room.active a {\\n  color: var(--secondary-color);\\n}\\n\\n.new-room-form {\\n  padding: 0 5px;\\n  background: var(--secondary-color);\\n  color: var(--main-text-color);\\n}\\n\\n.new-room-form form {\\n  height: 100%;\\n  display: flex;\\n  justify-content: space-between;\\n  align-items: center;\\n}\\n\\n.new-room-form input {\\n  width: 135px;\\n  background: var(--secondary-color);\\n}\\n\\n.new-room-form button {\\n  background: var(--secondary-color);\\n  color: var(--main-text-color);\\n  border: 0;\\n} \\n\\n.new-room-form input::placeholder {\\n  color: var(--main-text-color);\\n  font-weight: 200;\\n}\\n\\n.new-room-form input:focus {\\n  outline-width: 0;\\n}\\n\\n.new-room-form input {\\n  border: 0;\\n}\\n\\n.new-room-form button {\\n  border: 0;\\n}\\n\\n.message {\\n  margin: 15px 0;\\n}\\n\\n.message .message-username {\\n  font-size: 11px;\\n  font-weight: bold;\\n  color: var(--secondary-color);\\n  opacity: 0.9;\\n  margin-bottom: 6px;\\n}\\n.message .message-text {\\n  background: var(--third-color);\\n  color: var(--secondary-color);\\n  display: inline;\\n  padding: 4px 8px;\\n  border-radius: 8px;\\n}\\n\\n.message-list {\\n  box-sizing: border-box;\\n  padding-left: 6px;\\n  width: 100%;\\n  height: 100%;\\n  overflow: scroll;\\n  background: var(--third-color);\\n}\\n\\n.message-list .join-room {\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n  height: 100%;\\n  font-size: 34px;\\n  font-weight: 300;\\n}\\n\\n.send-message-form {\\n  background: var(--send-message-form);\\n  display: flex;\\n}\\n\\n.send-message-form input {\\n  width: 100%;\\n  padding: 15px 10px;\\n  margin: 0;\\n  border-style: none;\\n  background: var(--send-message-form);\\n  font-weight: 200;\\n\\n}\\n\\n.send-message-form input:focus {\\n  outline-width: 0;\\n}\\n\\n.send-message-form input::placeholder {\\n  color: var(--main-text-color);\\n}\\n\\n.help-text {\\n  position: absolute;\\n  top: 10px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./jaas-client/src/index.css?./node_modules/css-loader/dist/cjs.js");
+
+/***/ }),
+
+/***/ "./node_modules/css-loader/dist/runtime/api.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/css-loader/dist/runtime/api.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (useSourceMap) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = cssWithMappingToString(item, useSourceMap);\n\n      if (item[2]) {\n        return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n      }\n\n      return content;\n    }).join('');\n  }; // import a list of modules into the list\n  // eslint-disable-next-line func-names\n\n\n  list.i = function (modules, mediaQuery, dedupe) {\n    if (typeof modules === 'string') {\n      // eslint-disable-next-line no-param-reassign\n      modules = [[null, modules, '']];\n    }\n\n    var alreadyImportedModules = {};\n\n    if (dedupe) {\n      for (var i = 0; i < this.length; i++) {\n        // eslint-disable-next-line prefer-destructuring\n        var id = this[i][0];\n\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n\n    for (var _i = 0; _i < modules.length; _i++) {\n      var item = [].concat(modules[_i]);\n\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        // eslint-disable-next-line no-continue\n        continue;\n      }\n\n      if (mediaQuery) {\n        if (!item[2]) {\n          item[2] = mediaQuery;\n        } else {\n          item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n        }\n      }\n\n      list.push(item);\n    }\n  };\n\n  return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n  var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring\n\n  var cssMapping = item[3];\n\n  if (!cssMapping) {\n    return content;\n  }\n\n  if (useSourceMap && typeof btoa === 'function') {\n    var sourceMapping = toComment(cssMapping);\n    var sourceURLs = cssMapping.sources.map(function (source) {\n      return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || '').concat(source, \" */\");\n    });\n    return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n  }\n\n  return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n  // eslint-disable-next-line no-undef\n  var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n  var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n  return \"/*# \".concat(data, \" */\");\n}\n\n//# sourceURL=webpack:///./node_modules/css-loader/dist/runtime/api.js?");
+
+/***/ }),
+
+/***/ "./node_modules/ieee754/index.js":
+/*!***************************************!*\
+  !*** ./node_modules/ieee754/index.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n\n//# sourceURL=webpack:///./node_modules/ieee754/index.js?");
+
+/***/ }),
+
+/***/ "./node_modules/isarray/index.js":
+/*!***************************************!*\
+  !*** ./node_modules/isarray/index.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n//# sourceURL=webpack:///./node_modules/isarray/index.js?");
+
+/***/ }),
+
+/***/ "./node_modules/process/browser.js":
+/*!*****************************************!*\
+  !*** ./node_modules/process/browser.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n//# sourceURL=webpack:///./node_modules/process/browser.js?");
+
+/***/ }),
+
+/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
+/*!****************************************************************************!*\
+  !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
+  \****************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+eval("\n\nvar isOldIE = function isOldIE() {\n  var memo;\n  return function memorize() {\n    if (typeof memo === 'undefined') {\n      // Test for IE <= 9 as proposed by Browserhacks\n      // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n      // Tests for existence of standard globals is to allow style-loader\n      // to operate correctly into non-standard environments\n      // @see https://github.com/webpack-contrib/style-loader/issues/177\n      memo = Boolean(window && document && document.all && !window.atob);\n    }\n\n    return memo;\n  };\n}();\n\nvar getTarget = function getTarget() {\n  var memo = {};\n  return function memorize(target) {\n    if (typeof memo[target] === 'undefined') {\n      var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n      if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n        try {\n          // This will throw an exception if access to iframe is blocked\n          // due to cross-origin restrictions\n          styleTarget = styleTarget.contentDocument.head;\n        } catch (e) {\n          // istanbul ignore next\n          styleTarget = null;\n        }\n      }\n\n      memo[target] = styleTarget;\n    }\n\n    return memo[target];\n  };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n  var result = -1;\n\n  for (var i = 0; i < stylesInDom.length; i++) {\n    if (stylesInDom[i].identifier === identifier) {\n      result = i;\n      break;\n    }\n  }\n\n  return result;\n}\n\nfunction modulesToDom(list, options) {\n  var idCountMap = {};\n  var identifiers = [];\n\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i];\n    var id = options.base ? item[0] + options.base : item[0];\n    var count = idCountMap[id] || 0;\n    var identifier = \"\".concat(id, \" \").concat(count);\n    idCountMap[id] = count + 1;\n    var index = getIndexByIdentifier(identifier);\n    var obj = {\n      css: item[1],\n      media: item[2],\n      sourceMap: item[3]\n    };\n\n    if (index !== -1) {\n      stylesInDom[index].references++;\n      stylesInDom[index].updater(obj);\n    } else {\n      stylesInDom.push({\n        identifier: identifier,\n        updater: addStyle(obj, options),\n        references: 1\n      });\n    }\n\n    identifiers.push(identifier);\n  }\n\n  return identifiers;\n}\n\nfunction insertStyleElement(options) {\n  var style = document.createElement('style');\n  var attributes = options.attributes || {};\n\n  if (typeof attributes.nonce === 'undefined') {\n    var nonce =  true ? __webpack_require__.nc : undefined;\n\n    if (nonce) {\n      attributes.nonce = nonce;\n    }\n  }\n\n  Object.keys(attributes).forEach(function (key) {\n    style.setAttribute(key, attributes[key]);\n  });\n\n  if (typeof options.insert === 'function') {\n    options.insert(style);\n  } else {\n    var target = getTarget(options.insert || 'head');\n\n    if (!target) {\n      throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n    }\n\n    target.appendChild(style);\n  }\n\n  return style;\n}\n\nfunction removeStyleElement(style) {\n  // istanbul ignore if\n  if (style.parentNode === null) {\n    return false;\n  }\n\n  style.parentNode.removeChild(style);\n}\n/* istanbul ignore next  */\n\n\nvar replaceText = function replaceText() {\n  var textStore = [];\n  return function replace(index, replacement) {\n    textStore[index] = replacement;\n    return textStore.filter(Boolean).join('\\n');\n  };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n  var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n  /* istanbul ignore if  */\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = replaceText(index, css);\n  } else {\n    var cssNode = document.createTextNode(css);\n    var childNodes = style.childNodes;\n\n    if (childNodes[index]) {\n      style.removeChild(childNodes[index]);\n    }\n\n    if (childNodes.length) {\n      style.insertBefore(cssNode, childNodes[index]);\n    } else {\n      style.appendChild(cssNode);\n    }\n  }\n}\n\nfunction applyToTag(style, options, obj) {\n  var css = obj.css;\n  var media = obj.media;\n  var sourceMap = obj.sourceMap;\n\n  if (media) {\n    style.setAttribute('media', media);\n  } else {\n    style.removeAttribute('media');\n  }\n\n  if (sourceMap && btoa) {\n    css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n  } // For old IE\n\n  /* istanbul ignore if  */\n\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    while (style.firstChild) {\n      style.removeChild(style.firstChild);\n    }\n\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n  var style;\n  var update;\n  var remove;\n\n  if (options.singleton) {\n    var styleIndex = singletonCounter++;\n    style = singleton || (singleton = insertStyleElement(options));\n    update = applyToSingletonTag.bind(null, style, styleIndex, false);\n    remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n  } else {\n    style = insertStyleElement(options);\n    update = applyToTag.bind(null, style, options);\n\n    remove = function remove() {\n      removeStyleElement(style);\n    };\n  }\n\n  update(obj);\n  return function updateStyle(newObj) {\n    if (newObj) {\n      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n        return;\n      }\n\n      update(obj = newObj);\n    } else {\n      remove();\n    }\n  };\n}\n\nmodule.exports = function (list, options) {\n  options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n  // tags it will allow on a page\n\n  if (!options.singleton && typeof options.singleton !== 'boolean') {\n    options.singleton = isOldIE();\n  }\n\n  list = list || [];\n  var lastIdentifiers = modulesToDom(list, options);\n  return function update(newList) {\n    newList = newList || [];\n\n    if (Object.prototype.toString.call(newList) !== '[object Array]') {\n      return;\n    }\n\n    for (var i = 0; i < lastIdentifiers.length; i++) {\n      var identifier = lastIdentifiers[i];\n      var index = getIndexByIdentifier(identifier);\n      stylesInDom[index].references--;\n    }\n\n    var newLastIdentifiers = modulesToDom(newList, options);\n\n    for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n      var _identifier = lastIdentifiers[_i];\n\n      var _index = getIndexByIdentifier(_identifier);\n\n      if (stylesInDom[_index].references === 0) {\n        stylesInDom[_index].updater();\n\n        stylesInDom.splice(_index, 1);\n      }\n    }\n\n    lastIdentifiers = newLastIdentifiers;\n  };\n};\n\n//# sourceURL=webpack:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js?");
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/global.js":
+/*!***********************************!*\
+  !*** (webpack)/buildin/global.js ***!
+  \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack:///(webpack)/buildin/global.js?");
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/module.js":
+/*!***********************************!*\
+  !*** (webpack)/buildin/module.js ***!
+  \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n//# sourceURL=webpack:///(webpack)/buildin/module.js?");
+
+/***/ }),
+
+/***/ 0:
+/*!********************!*\
+  !*** ws (ignored) ***!
+  \********************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/* (ignored) */\n\n//# sourceURL=webpack:///ws_(ignored)?");
+
+/***/ })
+
+/******/ });
\ No newline at end of file
diff --git a/jaas-client/dist/index.html b/jaas-client/dist/index.html
new file mode 100644
index 0000000..eaccd26
--- /dev/null
+++ b/jaas-client/dist/index.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Jass Client</title>
+</head>
+
+<body>
+    <div id="root"></div>
+    <script src="bundle.js"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/jaas-client/package.json b/jaas-client/package.json
new file mode 100644
index 0000000..3d0e3bf
--- /dev/null
+++ b/jaas-client/package.json
@@ -0,0 +1,43 @@
+{
+  "name": "jaas-client",
+  "version": "0.1.0",
+  "private": true,
+  "dependencies": {
+    "@material-ui/core": "^4.10.2",
+    "@material-ui/icons": "^4.9.1",
+    "@material-ui/lab": "^4.0.0-alpha.56",
+    "@testing-library/jest-dom": "^4.2.4",
+    "@testing-library/react": "^9.5.0",
+    "@testing-library/user-event": "^7.2.1",
+    "material-ui": "^0.20.2",
+    "react": "^16.13.1",
+    "react-dom": "^16.13.1",
+    "react-emoji-render": "^1.2.4",
+    "react-input-emoji": "^1.1.7",
+    "react-router-dom": "^5.2.0",
+    "react-scripts": "3.4.1",
+    "react-sound": "^1.2.0",
+    "socket.io-client": "^2.3.0"
+  },
+  "scripts": {
+    "start": "react-scripts start",
+    "build": "react-scripts build",
+    "test": "react-scripts test",
+    "eject": "react-scripts eject"
+  },
+  "eslintConfig": {
+    "extends": "react-app"
+  },
+  "browserslist": {
+    "production": [
+      ">0.2%",
+      "not dead",
+      "not op_mini all"
+    ],
+    "development": [
+      "last 1 chrome version",
+      "last 1 firefox version",
+      "last 1 safari version"
+    ]
+  }
+}
diff --git a/jaas-client/public/Jami-logo-gnu-package_rainbowHD.svg b/jaas-client/public/Jami-logo-gnu-package_rainbowHD.svg
new file mode 100644
index 0000000..89d1d04
--- /dev/null
+++ b/jaas-client/public/Jami-logo-gnu-package_rainbowHD.svg
@@ -0,0 +1 @@
+<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 407.75 185.09"><defs><style>.cls-1,.cls-26{fill:#000747;}.cls-2{fill:url(#linear-gradient);}.cls-3{fill:url(#linear-gradient-2);}.cls-4{fill:url(#linear-gradient-3);}.cls-5{fill:url(#linear-gradient-4);}.cls-6{fill:url(#linear-gradient-5);}.cls-7{fill:url(#linear-gradient-6);}.cls-8{opacity:0.4;fill:url(#linear-gradient-7);}.cls-18,.cls-21,.cls-24,.cls-8{isolation:isolate;}.cls-9{fill:url(#linear-gradient-8);}.cls-10{fill:url(#linear-gradient-9);}.cls-11{fill:url(#linear-gradient-10);}.cls-12{fill:url(#linear-gradient-11);}.cls-13{fill:url(#linear-gradient-12);}.cls-14{fill:url(#linear-gradient-13);}.cls-15{fill:url(#linear-gradient-14);}.cls-16{fill:url(#linear-gradient-15);}.cls-17{fill:url(#linear-gradient-16);}.cls-18,.cls-24{opacity:0.2;}.cls-18{fill:url(#linear-gradient-17);}.cls-19{fill:url(#linear-gradient-18);}.cls-20{fill:url(#linear-gradient-19);}.cls-21{opacity:0.25;fill:url(#linear-gradient-20);}.cls-22{fill:url(#linear-gradient-21);}.cls-23{fill:url(#linear-gradient-22);}.cls-24{fill:url(#linear-gradient-23);}.cls-25{fill:url(#linear-gradient-24);}.cls-26{fill-rule:evenodd;}.cls-27{fill:#e91e63;}.cls-28{fill:#9c27b0;}.cls-29{fill:#3f51b5;}.cls-30{fill:#28b1ed;}.cls-31{fill:#009688;}.cls-32{fill:#4caf50;}.cls-33{fill:#ffc107;}.cls-34{fill:#ff5722;}</style><linearGradient id="linear-gradient" x1="98.88" y1="-258.85" x2="94.29" y2="-253.49" gradientTransform="matrix(1, 0, 0, -1, -38.89, -151.66)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2b3b6a"/><stop offset="1" stop-color="#2b3b6a"/></linearGradient><linearGradient id="linear-gradient-2" x1="138.39" y1="-261.17" x2="138.39" y2="-297.97" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2b3b6a"/><stop offset="0.07" stop-color="#2d4576"/><stop offset="0.22" stop-color="#2e5589"/><stop offset="0.36" stop-color="#2b5e97"/><stop offset="0.5" stop-color="#29629c"/><stop offset="0.64" stop-color="#2b5e97"/><stop offset="0.78" stop-color="#2e5589"/><stop offset="0.93" stop-color="#2d4576"/><stop offset="1" stop-color="#2b3b6a"/></linearGradient><linearGradient id="linear-gradient-3" x1="56.55" y1="-300.74" x2="68.49" y2="-279.48" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#252b59"/><stop offset="0.09" stop-color="#2b3a69"/><stop offset="0.23" stop-color="#2e4a7c"/><stop offset="0.37" stop-color="#2e5487"/><stop offset="0.5" stop-color="#2d578c"/><stop offset="0.63" stop-color="#2e5487"/><stop offset="0.77" stop-color="#2e4a7c"/><stop offset="0.91" stop-color="#2b3a69"/><stop offset="1" stop-color="#252b59"/></linearGradient><linearGradient id="linear-gradient-4" x1="90.72" y1="-228.55" x2="70.95" y2="-205.5" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#181844"/><stop offset="0.03" stop-color="#1e1e4c"/><stop offset="0.14" stop-color="#283261"/><stop offset="0.25" stop-color="#2d4172"/><stop offset="0.36" stop-color="#2e4a7c"/><stop offset="0.5" stop-color="#2e4d7f"/><stop offset="0.62" stop-color="#2d4576"/><stop offset="0.81" stop-color="#273160"/><stop offset="1" stop-color="#181844"/></linearGradient><linearGradient id="linear-gradient-5" x1="129.82" y1="-303.29" x2="114.55" y2="-254.1" xlink:href="#linear-gradient-4"/><linearGradient id="linear-gradient-6" x1="61.49" y1="-261.17" x2="61.49" y2="-297.97" xlink:href="#linear-gradient-2"/><linearGradient id="linear-gradient-7" x1="81.72" y1="-225.03" x2="96.16" y2="-225.03" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-8" x1="100.78" y1="-240.34" x2="100.78" y2="-205.63" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#252b59"/><stop offset="0.5" stop-color="#2d578c"/><stop offset="0.69" stop-color="#2d5588"/><stop offset="0.8" stop-color="#2e4f80"/><stop offset="0.89" stop-color="#2d4474"/><stop offset="0.97" stop-color="#283463"/><stop offset="1" stop-color="#252b59"/></linearGradient><linearGradient id="linear-gradient-9" x1="69.11" y1="-307.72" x2="132.52" y2="-211.87" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2867a2"/><stop offset="0.08" stop-color="#177ebc"/><stop offset="0.17" stop-color="#0e91d1"/><stop offset="0.25" stop-color="#10a2e1"/><stop offset="0.34" stop-color="#18acea"/><stop offset="0.42" stop-color="#24b1ed"/><stop offset="0.5" stop-color="#28b1ed"/><stop offset="0.58" stop-color="#24b1ed"/><stop offset="0.66" stop-color="#18acea"/><stop offset="0.75" stop-color="#10a2e1"/><stop offset="0.83" stop-color="#0e91d1"/><stop offset="0.92" stop-color="#177ebc"/><stop offset="1" stop-color="#2867a2"/></linearGradient><linearGradient id="linear-gradient-10" x1="63.41" y1="-309.65" x2="88.53" y2="-287.16" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2c5d95"/><stop offset="0.08" stop-color="#246eab"/><stop offset="0.18" stop-color="#1b79b9"/><stop offset="0.3" stop-color="#1080c2"/><stop offset="0.5" stop-color="#0e81c5"/><stop offset="0.7" stop-color="#1080c2"/><stop offset="0.82" stop-color="#1b79b9"/><stop offset="0.92" stop-color="#246eab"/><stop offset="1" stop-color="#2c5d95"/></linearGradient><linearGradient id="linear-gradient-11" x1="61.15" y1="-211.2" x2="119.47" y2="-308.39" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2c5d95"/><stop offset="0.02" stop-color="#2a6199"/><stop offset="0.14" stop-color="#1c79b7"/><stop offset="0.26" stop-color="#0a8cca"/><stop offset="0.38" stop-color="#0b97d4"/><stop offset="0.5" stop-color="#0e9ad8"/><stop offset="0.62" stop-color="#0b97d4"/><stop offset="0.74" stop-color="#0a8cca"/><stop offset="0.86" stop-color="#1c79b7"/><stop offset="0.98" stop-color="#2a6199"/><stop offset="1" stop-color="#2c5d95"/></linearGradient><linearGradient id="linear-gradient-12" x1="124.21" y1="-307.82" x2="86.71" y2="-260.59" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2c5d95"/><stop offset="0.03" stop-color="#2a6199"/><stop offset="0.21" stop-color="#1c79b7"/><stop offset="0.38" stop-color="#0a8cca"/><stop offset="0.56" stop-color="#0b97d4"/><stop offset="0.73" stop-color="#0e9ad8"/><stop offset="0.79" stop-color="#0b97d4"/><stop offset="0.86" stop-color="#0a8cca"/><stop offset="0.92" stop-color="#1c79b7"/><stop offset="0.99" stop-color="#2a6199"/><stop offset="1" stop-color="#2c5d95"/></linearGradient><linearGradient id="linear-gradient-13" x1="70.04" y1="-235.01" x2="62.74" y2="-208.73" xlink:href="#linear-gradient-10"/><linearGradient id="linear-gradient-14" x1="152.73" y1="-252.73" x2="38.98" y2="-252.73" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2867a2"/><stop offset="0.01" stop-color="#256ba7"/><stop offset="0.11" stop-color="#0b83c3"/><stop offset="0.21" stop-color="#1797d8"/><stop offset="0.31" stop-color="#25a3e2"/><stop offset="0.41" stop-color="#27abe7"/><stop offset="0.5" stop-color="#2aaeea"/><stop offset="0.59" stop-color="#27abe7"/><stop offset="0.69" stop-color="#25a3e2"/><stop offset="0.79" stop-color="#1797d8"/><stop offset="0.89" stop-color="#0b83c3"/><stop offset="0.99" stop-color="#256ba7"/><stop offset="1" stop-color="#2867a2"/></linearGradient><linearGradient id="linear-gradient-15" x1="120.12" y1="-251.07" x2="152.64" y2="-252.82" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2e5284"/><stop offset="0.01" stop-color="#2e5486"/><stop offset="0.09" stop-color="#29649d"/><stop offset="0.19" stop-color="#236fad"/><stop offset="0.3" stop-color="#1d77b6"/><stop offset="0.5" stop-color="#1c78b9"/><stop offset="0.7" stop-color="#1d77b6"/><stop offset="0.81" stop-color="#236fad"/><stop offset="0.91" stop-color="#29649d"/><stop offset="0.99" stop-color="#2e5486"/><stop offset="1" stop-color="#2e5284"/></linearGradient><linearGradient id="linear-gradient-16" x1="38.89" y1="-251.18" x2="97.55" y2="-251.18" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2867a2"/><stop offset="0.02" stop-color="#256ba7"/><stop offset="0.2" stop-color="#0b83c3"/><stop offset="0.37" stop-color="#1797d8"/><stop offset="0.54" stop-color="#25a3e2"/><stop offset="0.71" stop-color="#27abe7"/><stop offset="0.88" stop-color="#2aaeea"/><stop offset="0.9" stop-color="#27abe7"/><stop offset="0.92" stop-color="#25a3e2"/><stop offset="0.95" stop-color="#1797d8"/><stop offset="0.97" stop-color="#0b83c3"/><stop offset="1" stop-color="#256ba7"/><stop offset="1" stop-color="#2867a2"/></linearGradient><linearGradient id="linear-gradient-17" x1="80.14" y1="-235.95" x2="58.09" y2="-232.85" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-18" x1="102.57" y1="-254.85" x2="40.26" y2="-246.09" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2867a2"/><stop offset="0.04" stop-color="#2174b1"/><stop offset="0.12" stop-color="#0b86c4"/><stop offset="0.21" stop-color="#0a94d2"/><stop offset="0.32" stop-color="#0c9bdb"/><stop offset="0.5" stop-color="#109ede"/><stop offset="0.68" stop-color="#0c9bdb"/><stop offset="0.79" stop-color="#0a94d2"/><stop offset="0.88" stop-color="#0b86c4"/><stop offset="0.96" stop-color="#2174b1"/><stop offset="1" stop-color="#2867a2"/></linearGradient><linearGradient id="linear-gradient-19" x1="131.42" y1="-211.65" x2="101.79" y2="-262.68" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2867a2"/><stop offset="0.12" stop-color="#177ebc"/><stop offset="0.25" stop-color="#0e91d1"/><stop offset="0.38" stop-color="#10a2e1"/><stop offset="0.51" stop-color="#18acea"/><stop offset="0.63" stop-color="#24b1ed"/><stop offset="0.75" stop-color="#28b1ed"/><stop offset="0.79" stop-color="#24b1ed"/><stop offset="0.83" stop-color="#18acea"/><stop offset="0.87" stop-color="#10a2e1"/><stop offset="0.92" stop-color="#0e91d1"/><stop offset="0.96" stop-color="#177ebc"/><stop offset="1" stop-color="#2867a2"/></linearGradient><linearGradient id="linear-gradient-20" x1="135.19" y1="-237.35" x2="124.4" y2="-257.59" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-21" x1="130.49" y1="-212.8" x2="100.77" y2="-268.58" xlink:href="#linear-gradient-18"/><linearGradient id="linear-gradient-22" x1="132.79" y1="-214.06" x2="102.81" y2="-270.32" xlink:href="#linear-gradient-18"/><linearGradient id="linear-gradient-23" x1="84.39" y1="-278.03" x2="92.08" y2="-298.86" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" xlink:href="#linear-gradient"/><linearGradient id="linear-gradient-24" x1="98.99" y1="-256.6" x2="108.04" y2="-312.96" gradientTransform="matrix(1, 0, 0, -1, -8.09, -147.13)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2e5284"/><stop offset="0.02" stop-color="#2c5c92"/><stop offset="0.09" stop-color="#2075b1"/><stop offset="0.16" stop-color="#0b86c4"/><stop offset="0.24" stop-color="#0a94d2"/><stop offset="0.34" stop-color="#0e9cda"/><stop offset="0.5" stop-color="#109ede"/><stop offset="0.67" stop-color="#0c9bdb"/><stop offset="0.78" stop-color="#0a94d2"/><stop offset="0.86" stop-color="#0b86c4"/><stop offset="0.94" stop-color="#2174b1"/><stop offset="1" stop-color="#2c5d95"/></linearGradient></defs><title>Jami-logo-gnu-package_rainbowHD</title><path class="cls-1" d="M218.6,157.7l-1.2-2.6h-5.6l-1.2,2.6H209l4.9-10.7h1.4l5,10.7Zm-6.3-3.9h4.5l-2.3-5.1Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M237.6,152v5a7.76,7.76,0,0,1-1.8.5,15,15,0,0,1-2.2.2,5.43,5.43,0,0,1-2.9-.7,5,5,0,0,1-1.9-1.9,7.31,7.31,0,0,1,0-5.8,5,5,0,0,1,1.9-1.9,6.44,6.44,0,0,1,2.8-.7,7.8,7.8,0,0,1,2.2.3,3.67,3.67,0,0,1,1.7,1l-.6,1.2a5.07,5.07,0,0,0-1.6-.9,4.67,4.67,0,0,0-1.7-.3,3.76,3.76,0,0,0-2.8,1.1,5.7,5.7,0,0,0,.1,6.3,3.5,3.5,0,0,0,2.9,1.1,6.37,6.37,0,0,0,2.4-.4v-3h-2.6V152Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M249,147h1.5v10.7h-1.2l-6.4-8.1v8.1h-1.5V147h1.2l6.4,8.1Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M255.6,156.7a4.13,4.13,0,0,1-1.1-3.3V147h1.6v6.5a3,3,0,0,0,5.1,2.2,3.07,3.07,0,0,0,.7-2.2V147h1.6v6.4a4.86,4.86,0,0,1-1.1,3.3,5,5,0,0,1-3.4,1.1C257.4,157.8,256.3,157.5,255.6,156.7Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M278.7,150.5a3.33,3.33,0,0,1,1.2,1.4,4.64,4.64,0,0,1,.4,2.1,4,4,0,0,1-.4,2,5.26,5.26,0,0,1-1.2,1.4,2.73,2.73,0,0,1-1.8.5,2.93,2.93,0,0,1-1.6-.4,2.13,2.13,0,0,1-1-1.1V161h-1.6v-8.7a13.42,13.42,0,0,0-.1-2.1h1.5l.2,1.4a2.34,2.34,0,0,1,1-1.2,3.06,3.06,0,0,1,1.7-.4A2.62,2.62,0,0,1,278.7,150.5Zm-.5,5.4a3.63,3.63,0,0,0,0-4,1.94,1.94,0,0,0-1.7-.7,2.06,2.06,0,0,0-1.7.7,3.63,3.63,0,0,0,0,4,1.94,1.94,0,0,0,1.7.7A2.06,2.06,0,0,0,278.2,155.9Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M290.8,150.2v7.6h-1.6v-1.3a2,2,0,0,1-1,1,4.19,4.19,0,0,1-1.6.4,3.45,3.45,0,0,1-1.8-.5,3.33,3.33,0,0,1-1.2-1.4,4.48,4.48,0,0,1-.4-2,4.64,4.64,0,0,1,.4-2.1,3.33,3.33,0,0,1,1.2-1.4,3.45,3.45,0,0,1,1.8-.5,2.93,2.93,0,0,1,1.6.4,2.41,2.41,0,0,1,1,1v-1.2Zm-2.2,5.7a3.63,3.63,0,0,0,0-4,1.94,1.94,0,0,0-1.7-.7,2.06,2.06,0,0,0-1.7.7,3.17,3.17,0,0,0-.6,2,3,3,0,0,0,.6,2,2.06,2.06,0,0,0,1.7.7A1.94,1.94,0,0,0,288.6,155.9Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M295.8,157.3a3,3,0,0,1-1.3-1.4,4.55,4.55,0,0,1-.5-2,4.65,4.65,0,0,1,.5-2.1,3.16,3.16,0,0,1,1.4-1.4,4.65,4.65,0,0,1,2.1-.5,4.15,4.15,0,0,1,1.6.3,3.46,3.46,0,0,1,1.2.7l-.5,1.1a3.33,3.33,0,0,0-2.2-.8,2.14,2.14,0,0,0-1.8.7,3.63,3.63,0,0,0,0,4,2.14,2.14,0,0,0,1.8.7,3.72,3.72,0,0,0,2.2-.8l.5,1.1a4,4,0,0,1-1.3.7,4.53,4.53,0,0,1-1.6.3A4.69,4.69,0,0,1,295.8,157.3Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M310.9,157.7h-2l-3.8-3.6v3.6h-1.6v-11h1.6v6.9l3.5-3.4h2l-3.8,3.6Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M320.3,150.2v7.6h-1.6v-1.3a2,2,0,0,1-1,1,4.19,4.19,0,0,1-1.6.4,3.45,3.45,0,0,1-1.8-.5,3.33,3.33,0,0,1-1.2-1.4,4.48,4.48,0,0,1-.4-2,4.64,4.64,0,0,1,.4-2.1,3.33,3.33,0,0,1,1.2-1.4,3.45,3.45,0,0,1,1.8-.5,2.93,2.93,0,0,1,1.6.4,2.41,2.41,0,0,1,1,1v-1.2Zm-2.1,5.7a3.63,3.63,0,0,0,0-4,1.94,1.94,0,0,0-1.7-.7,2.06,2.06,0,0,0-1.7.7,3.17,3.17,0,0,0-.6,2,3,3,0,0,0,.6,2,2.06,2.06,0,0,0,1.7.7A1.94,1.94,0,0,0,318.2,155.9Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M331.3,150.2v7.4a3.57,3.57,0,0,1-.9,2.6,3.93,3.93,0,0,1-2.8.9,5.33,5.33,0,0,1-3.1-.8l.3-1.2c.5.2,1,.4,1.4.6a6.75,6.75,0,0,0,1.4.2,1.92,1.92,0,0,0,2.2-2.2v-1.6a2.41,2.41,0,0,1-1,1,2.93,2.93,0,0,1-1.6.4,3.45,3.45,0,0,1-1.8-.5,3,3,0,0,1-1.2-1.3,5.2,5.2,0,0,1,0-4,3,3,0,0,1,1.2-1.3,3.45,3.45,0,0,1,1.8-.5,2.93,2.93,0,0,1,1.6.4,2,2,0,0,1,1,1v-1.2h1.5Zm-2.2,5.4a3.31,3.31,0,0,0,0-3.8,2.41,2.41,0,0,0-3.4,0,3.31,3.31,0,0,0,0,3.8,2.41,2.41,0,0,0,3.4,0Z" transform="translate(-30.8 -4.52)"/><path class="cls-1" d="M341.7,154H336c.1,1.8.9,2.7,2.5,2.7a4,4,0,0,0,2.5-.9l.5,1.1a5.39,5.39,0,0,1-1.3.7,4.53,4.53,0,0,1-1.6.3,4.19,4.19,0,0,1-3-1,3.5,3.5,0,0,1-1.1-2.9,4.65,4.65,0,0,1,.5-2.1,3.53,3.53,0,0,1,1.3-1.4,4.23,4.23,0,0,1,2-.5,3,3,0,0,1,2.5,1,4,4,0,0,1,.9,2.7v.3Zm-4.9-2.4a2.13,2.13,0,0,0-.7,1.5h4.2a3.39,3.39,0,0,0-.6-1.5,2,2,0,0,0-1.4-.5A2.46,2.46,0,0,0,336.8,151.6Z" transform="translate(-30.8 -4.52)"/><polygon class="cls-2" points="53.9 103.28 61 102.98 57.5 109.68 53.9 103.28"/><path class="cls-3" d="M115.4,109.4c26.1,4.2,29.8,10.7,29.8,10.7v1.2a2.54,2.54,0,0,1-.2.7c-.1.3-2.7,5.7-19.6,9.3Z" transform="translate(-30.8 -4.52)"/><path class="cls-4" d="M49.6,130.4c-5.9,15.7-2.9,20.6-2.7,21a1,1,0,0,0,.4.5,5,5,0,0,0,1.2-.2s10.7-.5,23.2-18.3Z" transform="translate(-30.8 -4.52)"/><path class="cls-5" d="M88.6,70.5C74.3,54.9,67.4,55.8,67,55.8a1.85,1.85,0,0,0-.7.2c-.5.2-1,1.8-1,1.8s-3,8.7,9.1,31.9Z" transform="translate(-30.8 -4.52)"/><path class="cls-6" d="M101.1,130.8c19.4,22.2,26.2,20.9,26.2,20.9a5.85,5.85,0,0,0,1.3.2,1,1,0,0,0,.4-.5c.3-.4,5.8-9.4-12.8-41.8Z" transform="translate(-30.8 -4.52)"/><path class="cls-7" d="M76,134.2c-40-1.7-44.8-11.7-45-12.2a1.45,1.45,0,0,1-.2-.7c.1-.7,1.5-2,1.5-2s10.6-6.5,28.3-10Z" transform="translate(-30.8 -4.52)"/><path class="cls-8" d="M87.5,69.3A162.37,162.37,0,0,0,73.7,86.5h1C77.8,82.6,85.5,72.8,88.1,70Z" transform="translate(-30.8 -4.52)"/><path class="cls-9" d="M103.6,87.3C114.1,62.6,110,57,110,57c-.1-.3-.2-.7-.3-1a6.37,6.37,0,0,0-.7-.2c-.5-.1-11.4-1.5-34.4,30.7Z" transform="translate(-30.8 -4.52)"/><path class="cls-10" d="M87.8,149.3c-14.2,15.4-21,14.5-21.4,14.5a8.86,8.86,0,0,1-1.7-.8L47.4,152c7.3-1.6,16.3-10.2,25.7-21.3Z" transform="translate(-30.8 -4.52)"/><path class="cls-11" d="M88.4,149.9c-14.2,15.4-21,14.5-21.4,14.5a8.86,8.86,0,0,1-1.7-.8L47.4,152c7.3-1.6,16.9-9.6,26.3-20.7Z" transform="translate(-30.8 -4.52)"/><path class="cls-12" d="M50.5,89.9c-6.3-16.2-3.2-21.3-3-21.6a5.26,5.26,0,0,1,1.4-1.2L66.3,56c-1.5,7.1,2.3,18,8.2,30.7Z" transform="translate(-30.8 -4.52)"/><path class="cls-13" d="M87,109.2a188.36,188.36,0,0,0-26,1.9c.3.5,4.3,7.2,7.2,11.7,27.8,42.8,40.8,41.1,41.4,41a8.86,8.86,0,0,0,1.7-.8l17.3-11C116.8,149.4,100.4,130.2,87,109.2Z" transform="translate(-30.8 -4.52)"/><path class="cls-14" d="M49.9,90.5c-6.3-16.2-3.2-21.3-3-21.6a5.26,5.26,0,0,1,1.4-1.2L66.3,56c-1.5,7.1,1.7,18.6,7.6,31.2Z" transform="translate(-30.8 -4.52)"/><path class="cls-15" d="M115.3,111.6c13.5,1.9,24.7,4.7,29.8,9.8V100.8a12.25,12.25,0,0,0-.2-1.9c-.1-.3-2.7-5.6-19-9.1Z" transform="translate(-30.8 -4.52)"/><path class="cls-16" d="M115.3,110.8c13.5,1.9,24.7,5.5,29.8,10.6V100a12.25,12.25,0,0,0-.2-1.9c-.1-.3-2.7-5.6-19-9.1Z" transform="translate(-30.8 -4.52)"/><path class="cls-17" d="M103.1,87c-3-.1-9.5-.4-15.1-.4C36.9,86.6,31.3,98.4,31,99a5.84,5.84,0,0,0-.2,1.9v20.6c5-5,15.9-7.7,29.2-9.7a203.87,203.87,0,0,1,25.9-2h4.8S106.1,87.1,103.1,87Z" transform="translate(-30.8 -4.52)"/><path class="cls-18" d="M73.9,85.4c-10.7.5-18.4,1.3-24.8,3.1l.3.8c.6-.1,1.3-.3,1.9-.4a200.75,200.75,0,0,1,23.1-2.3Z" transform="translate(-30.8 -4.52)"/><path class="cls-19" d="M103.1,86.2c-3-.1-9.5-.4-15.1-.4-51.1,0-56.7,11.8-57,12.4a5.84,5.84,0,0,0-.2,1.9v21.4c5-5,15.9-8.5,29.2-10.5a203.87,203.87,0,0,1,25.9-2h4.8C93,109,106.1,86.4,103.1,86.2Z" transform="translate(-30.8 -4.52)"/><path class="cls-20" d="M88,110.7c13.9-20.9,24.2-42.8,21.7-54.7L127,67a5.26,5.26,0,0,1,1.4,1.2c.3.5,7.1,11.7-20.7,54.5-2,3.2-3.9,6.9-4.6,7.2-4.1-4-12.6-15.6-14.7-18.5A2.77,2.77,0,0,1,88,110.7Z" transform="translate(-30.8 -4.52)"/><path class="cls-21" d="M126.5,89.1a150.56,150.56,0,0,1-11.1,22.4l1.3.2a145.91,145.91,0,0,0,10.9-22.4Z" transform="translate(-30.8 -4.52)"/><path class="cls-22" d="M108.4,123.3c27.8-42.8,21-54,20.7-54.5a5.26,5.26,0,0,0-1.4-1.2L109.7,56c2.5,11.8-7.4,34.6-21.2,55.5A182.06,182.06,0,0,0,103,131.4C104,130.3,106.5,126.2,108.4,123.3Z" transform="translate(-30.8 -4.52)"/><path class="cls-23" d="M102.5,132.1c.1-.1.2-.1.2-.2A201.58,201.58,0,0,1,88,112.2a.52.52,0,0,0-.2.4C87.7,112.6,97.4,127.9,102.5,132.1Z" transform="translate(-30.8 -4.52)"/><path class="cls-24" d="M88,150.3c-.2-.2-10.5-12.3-15.1-19.4l-.8.9A174,174,0,0,0,87.4,151Z" transform="translate(-30.8 -4.52)"/><path class="cls-25" d="M102.7,131.9A201.58,201.58,0,0,1,88,112.2c-.5-.8-1.1-1.6-1.6-2.4a188.36,188.36,0,0,0-26,1.9c.3.5,4.3,7.2,7.2,11.7,27.8,42.8,40.8,41.1,41.4,41a8.86,8.86,0,0,0,1.7-.8L128.6,152C121.3,150.4,111.9,142.6,102.7,131.9Z" transform="translate(-30.8 -4.52)"/><path class="cls-26" d="M201.1,88.5c3.2,0,5.6-.7,7.3-2.3,1.5-1.5,2.3-4,2.3-7.4,0-4-2.3-6-6.8-6q-4.8,0-7.2,2.4c-1.5,1.5-2.3,4.1-2.3,7.5C194.3,86.6,196.6,88.5,201.1,88.5Z" transform="translate(-30.8 -4.52)"/><path id="SVGID" class="cls-1" d="M232.5,122.2a6.77,6.77,0,0,1-5.1,2.3,5.73,5.73,0,0,1-4.1-1.3,3.48,3.48,0,0,1-1.2-2.5,10.31,10.31,0,0,1,.2-2l1-6.1c.7-4,3.2-6,7.3-6,2.2,0,3.6.7,4.2,2Zm-56.6,47.9c-2.7,4.8-5.1,7.2-7.3,7.1s-3.4-1.7-3.3-4.9,1.6-7.1,4.5-11.4,7.5-9,13.9-14.2Q179.8,162.9,175.9,170.1ZM336,122.3a2.77,2.77,0,0,1,.1-.9l4.5-25.5H326.8L322,123.4c0,.2-.1.3-.1.5a7.22,7.22,0,0,1-3.2.8,2.29,2.29,0,0,1-2.6-2.3,2.77,2.77,0,0,1,.1-.9l2-12.1a29.71,29.71,0,0,0,.4-5.4,9.81,9.81,0,0,0-1.6-5.5c-1.6-2.4-5.2-3.6-10.6-3.6a15.18,15.18,0,0,0-13.1,6.9q-1.35-6.9-12-6.9a15.11,15.11,0,0,0-12.4,6l.9-4.8H257l-5,28a9,9,0,0,1-3.5.8,1.86,1.86,0,0,1-2.1-2.1c0-.4.1-.7.1-1L251,96.3H238.6l-.4,2.4c-1.7-2.3-5.2-3.5-10.1-3.5s-9.1,1.4-12.2,4.4a19.89,19.89,0,0,0-5.9,11.7l-1.5,8c-2.2,1.2-4.3,2.5-6.3,3.8.1-.5.2-1,.3-1.6l4.4-25.3H193.1l-6.3,36.4C174,142,165.3,150,160.6,156.5s-7.2,12.7-7.3,18.6a13.66,13.66,0,0,0,3.7,10.3q3.75,3.9,10.2,4.2c8.9.3,16.3-5.8,22-18.1,4.4-9.4,7.9-21.3,10.8-35.9,2.9-2.2,5.8-4.4,8.6-6.4,1.5,4.8,5.7,7.2,12.7,7.2a13.2,13.2,0,0,0,12-6.6q.9,6.6,9.9,6.6a13.94,13.94,0,0,0,7.2-2l-.2,1H264l4.5-25.8a8.15,8.15,0,0,1,6-2.7c2.9,0,4.5,1.3,4.5,3.9a14.15,14.15,0,0,1-.2,2.9L275,135.4h13.8l4.5-25.1A8,8,0,0,1,300,107q4.2,0,4.2,3.9a14.15,14.15,0,0,1-.2,2.9l-1.7,10a22.56,22.56,0,0,0-.3,3.5c0,6.1,3.8,9.3,11.1,9.3a12.53,12.53,0,0,0,5.7-1.3c.1,0,.1-.1.2-.1a18.25,18.25,0,0,0,4-2.7l.3.6c1.4,2.3,4.6,3.4,9.5,3.4a13.45,13.45,0,0,0,8.7-3.1l.4-9.2a7.31,7.31,0,0,1-3.3.8C336.8,124.7,336.1,123.9,336,122.3Z" transform="translate(-30.8 -4.52)"/><path class="cls-26" d="M338,72.8q-4.8,0-7.2,2.4c-1.5,1.5-2.3,4.1-2.3,7.5,0,3.8,2.2,5.9,6.7,5.9,3.3,0,5.8-.7,7.3-2.3s2.3-4,2.3-7.4C344.8,74.9,342.4,72.8,338,72.8Z" transform="translate(-30.8 -4.52)"/><path class="cls-27" d="M336.1,12.28c50.91,0,92.2,31,92.2,69.16h10.25C438.55,39,392.66,4.52,336.1,4.52S233.65,39,233.65,81.44h10.24C243.79,43.3,285.19,12.28,336.1,12.28Z" transform="translate(-30.8 -4.52)"/><path class="cls-28" d="M336.1,20c45.16,0,82,27.59,82,61.49H428.3c0-38.22-41.29-69.16-92.2-69.16s-92.31,30.94-92.31,69.16H254C254,47.54,290.83,20,336.1,20Z" transform="translate(-30.8 -4.52)"/><path class="cls-29" d="M336.1,27.63c39.52,0,71.71,24.15,71.71,53.81h10.25c0-34-36.69-61.49-82-61.49S254,47.46,254,81.44h10.24C264.28,51.78,296.48,27.63,336.1,27.63Z" transform="translate(-30.8 -4.52)"/><path class="cls-30" d="M336.1,35.31c33.87,0,61.47,20.71,61.47,46.13h10.24c0-29.74-32.09-53.81-71.71-53.81s-71.82,24.15-71.82,53.81h10.25C274.53,56,302.12,35.31,336.1,35.31Z" transform="translate(-30.8 -4.52)"/><path class="cls-31" d="M336.1,43c28.23,0,51.22,17.27,51.22,38.46h10.25c0-25.5-27.49-46.13-61.47-46.13s-61.47,20.63-61.47,46.13h10.24C284.77,60.25,307.77,43,336.1,43Z" transform="translate(-30.8 -4.52)"/><path class="cls-32" d="M336.1,50.74c22.58,0,41,13.83,41,30.78h10.24c0-21.27-22.89-38.46-51.22-38.46s-51.23,17.19-51.23,38.46h10.25C295,64.49,313.41,50.74,336.1,50.74Z" transform="translate(-30.8 -4.52)"/><path class="cls-33" d="M336.1,58.41c16.94,0,30.73,10.32,30.73,23h10.25c0-17-18.4-30.78-41-30.78s-41,13.75-41,30.78h10.24C305.26,68.73,319.06,58.41,336.1,58.41Z" transform="translate(-30.8 -4.52)"/><path class="cls-34" d="M336.24,64.68c13,0,23.56,6.21,23.56,16.76h7.85c0-14.07-14.24-23-31.55-23s-31.28,8.89-31.28,23h7.86C312.6,70.89,323.17,64.68,336.24,64.68Z" transform="translate(-30.8 -4.52)"/></svg>
\ No newline at end of file
diff --git a/jaas-client/public/baseline_send_black_18dp.png b/jaas-client/public/baseline_send_black_18dp.png
new file mode 100644
index 0000000..ab56a83
--- /dev/null
+++ b/jaas-client/public/baseline_send_black_18dp.png
Binary files differ
diff --git a/jaas-client/public/deduction.mp3 b/jaas-client/public/deduction.mp3
new file mode 100644
index 0000000..5781101
--- /dev/null
+++ b/jaas-client/public/deduction.mp3
Binary files differ
diff --git a/jaas-client/public/favicon.ico b/jaas-client/public/favicon.ico
new file mode 100644
index 0000000..bcd5dfd
--- /dev/null
+++ b/jaas-client/public/favicon.ico
Binary files differ
diff --git a/jaas-client/public/index.html b/jaas-client/public/index.html
new file mode 100644
index 0000000..d2e2225
--- /dev/null
+++ b/jaas-client/public/index.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="utf-8" />
+  <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
+  <meta name="viewport" content="width=device-width, initial-scale=1" />
+  <meta name="theme-color" content="#000000" />
+  <meta name="description" content="Web site created using create-react-app" />
+  <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
+  <title>Jaas Web Client App</title>
+</head>
+
+<body>
+  <div id="root"></div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/jaas-client/public/logo192.png b/jaas-client/public/logo192.png
new file mode 100644
index 0000000..fc44b0a
--- /dev/null
+++ b/jaas-client/public/logo192.png
Binary files differ
diff --git a/jaas-client/public/logo512.png b/jaas-client/public/logo512.png
new file mode 100644
index 0000000..a4e47a6
--- /dev/null
+++ b/jaas-client/public/logo512.png
Binary files differ
diff --git a/jaas-client/public/manifest.json b/jaas-client/public/manifest.json
new file mode 100644
index 0000000..080d6c7
--- /dev/null
+++ b/jaas-client/public/manifest.json
@@ -0,0 +1,25 @@
+{
+  "short_name": "React App",
+  "name": "Create React App Sample",
+  "icons": [
+    {
+      "src": "favicon.ico",
+      "sizes": "64x64 32x32 24x24 16x16",
+      "type": "image/x-icon"
+    },
+    {
+      "src": "logo192.png",
+      "type": "image/png",
+      "sizes": "192x192"
+    },
+    {
+      "src": "logo512.png",
+      "type": "image/png",
+      "sizes": "512x512"
+    }
+  ],
+  "start_url": ".",
+  "display": "standalone",
+  "theme_color": "#000000",
+  "background_color": "#ffffff"
+}
diff --git a/jaas-client/public/robots.txt b/jaas-client/public/robots.txt
new file mode 100644
index 0000000..e9e57dc
--- /dev/null
+++ b/jaas-client/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/jaas-client/public/stairs.mp3 b/jaas-client/public/stairs.mp3
new file mode 100644
index 0000000..a108abc
--- /dev/null
+++ b/jaas-client/public/stairs.mp3
Binary files differ
diff --git a/jaas-client/src/App.css b/jaas-client/src/App.css
new file mode 100644
index 0000000..74b5e05
--- /dev/null
+++ b/jaas-client/src/App.css
@@ -0,0 +1,38 @@
+.App {
+  text-align: center;
+}
+
+.App-logo {
+  height: 40vmin;
+  pointer-events: none;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+  .App-logo {
+    animation: App-logo-spin infinite 20s linear;
+  }
+}
+
+.App-header {
+  background-color: #282c34;
+  min-height: 100vh;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  font-size: calc(10px + 2vmin);
+  color: white;
+}
+
+.App-link {
+  color: #61dafb;
+}
+
+@keyframes App-logo-spin {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
diff --git a/jaas-client/src/App.js b/jaas-client/src/App.js
new file mode 100644
index 0000000..d1c880b
--- /dev/null
+++ b/jaas-client/src/App.js
@@ -0,0 +1,35 @@
+/*
+  Company: Savoir-faire Linux
+  Author: Larbi Gharib <larbi.gharib@savoirfairelinux.com>
+  UI Project inspired from https://scrimba.com/p/pbNpTv/cbZBmfV
+  License: AGPL-3
+*/
+
+import React from 'react';
+//import logo from './logo.svg';
+import './App.css';
+
+
+import { BrowserRouter as Router, Route, Switch, Link, Redirect } from 'react-router-dom';
+
+import SignInPage from "./pages/index.jsx";
+import Jaas from "./pages/jaas.jsx"
+import NotFoundPage from "./pages/404.jsx"
+
+
+class App extends React.Component {
+
+  render() {
+    return <Router>
+      <Switch>
+        <Route exact path="/" component={SignInPage} />
+        <Route to="/Jaas" component={Jaas} />
+        <Route exact path="/404" component={NotFoundPage} />
+        <Redirect to="/404" />
+      </Switch>
+
+    </Router>
+  }
+}
+
+export default App;
\ No newline at end of file
diff --git a/jaas-client/src/App.test.js b/jaas-client/src/App.test.js
new file mode 100644
index 0000000..4db7ebc
--- /dev/null
+++ b/jaas-client/src/App.test.js
@@ -0,0 +1,9 @@
+import React from 'react';
+import { render } from '@testing-library/react';
+import App from './App';
+
+test('renders learn react link', () => {
+  const { getByText } = render(<App />);
+  const linkElement = getByText(/learn react/i);
+  expect(linkElement).toBeInTheDocument();
+});
diff --git a/jaas-client/src/components/ContactList.js b/jaas-client/src/components/ContactList.js
new file mode 100644
index 0000000..af232a0
--- /dev/null
+++ b/jaas-client/src/components/ContactList.js
@@ -0,0 +1,16 @@
+import React from 'react'
+
+class ContactList extends React.Component {
+    render() {
+
+        return (
+            <div className="rooms-list">
+                <ul>
+                    <h3>Liste de contacts</h3>
+                </ul>
+            </div>
+        )
+    }
+}
+
+export default ContactList
\ No newline at end of file
diff --git a/jaas-client/src/components/Header.js b/jaas-client/src/components/Header.js
new file mode 100644
index 0000000..22a6c74
--- /dev/null
+++ b/jaas-client/src/components/Header.js
@@ -0,0 +1,43 @@
+import React from 'react'
+import Button from '@material-ui/core/Button';
+import Menu from '@material-ui/core/Menu';
+import MenuItem from '@material-ui/core/MenuItem';
+import { useHistory } from "react-router-dom";
+
+export default function Header() {
+    const history = useHistory();
+
+    const [anchorEl, setAnchorEl] = React.useState(null);
+
+    const handleClick = (event) => {
+        setAnchorEl(event.currentTarget);
+    };
+
+    const handleClose = () => {
+        setAnchorEl(null);
+    };
+
+    const disconnect = () => {
+        let path = `/`;
+        history.push(path);
+    }
+
+    return (
+        <div>
+            <Button aria-controls="simple-menu" aria-haspopup="true" onClick={handleClick}>
+                Menu
+      </Button>
+            <Menu
+                id="simple-menu"
+                anchorEl={anchorEl}
+                keepMounted
+                open={Boolean(anchorEl)}
+                onClose={handleClose}
+            >
+                <MenuItem onClick={handleClose}>Profile</MenuItem>
+                <MenuItem onClick={handleClose}>Mon compte</MenuItem>
+                <MenuItem onClick={disconnect}>Déconnexion</MenuItem>
+            </Menu>
+        </div>
+    );
+}
\ No newline at end of file
diff --git a/jaas-client/src/components/Message.js b/jaas-client/src/components/Message.js
new file mode 100644
index 0000000..2e1c086
--- /dev/null
+++ b/jaas-client/src/components/Message.js
@@ -0,0 +1,12 @@
+import React from 'react'
+
+function Message(props) {
+    return (
+        <div className="message">
+            <div className="message-username">{props.username}</div>
+            <div className="message-text">{props.text}</div>
+        </div>
+    )
+}
+
+export default Message
\ No newline at end of file
diff --git a/jaas-client/src/components/MessageList.js b/jaas-client/src/components/MessageList.js
new file mode 100644
index 0000000..08bdbea
--- /dev/null
+++ b/jaas-client/src/components/MessageList.js
@@ -0,0 +1,22 @@
+import React from 'react'
+import Message from './Message'
+
+
+class MessageList extends React.Component {
+    render() {
+        return (
+            <div className="message-list">
+
+                {
+                    this.props.messages.map((message, index) => {
+                        /*DUMMY_DATA.map((message, index) => {*/
+                        return (
+                            <Message key={index} username={message.senderId} text={message.text} />
+                        )
+                    })}
+            </div>
+        )
+    }
+}
+
+export default MessageList
\ No newline at end of file
diff --git a/jaas-client/src/components/NewContactForm.js b/jaas-client/src/components/NewContactForm.js
new file mode 100644
index 0000000..ef590c5
--- /dev/null
+++ b/jaas-client/src/components/NewContactForm.js
@@ -0,0 +1,19 @@
+import React from 'react'
+
+class NewContactForm extends React.Component {
+    render() {
+        return (
+            <div className="new-room-form">
+                <form>
+                    <input
+                        type="text"
+                        placeholder="Ajouter un contact"
+                        required />
+                    <button id="create-room-btn" type="submit">+</button>
+                </form>
+            </div>
+        )
+    }
+}
+
+export default NewContactForm
\ No newline at end of file
diff --git a/jaas-client/src/components/SendMessageForm.js b/jaas-client/src/components/SendMessageForm.js
new file mode 100644
index 0000000..e52635d
--- /dev/null
+++ b/jaas-client/src/components/SendMessageForm.js
@@ -0,0 +1,51 @@
+import React from 'react'
+import InputEmoji from "react-input-emoji";
+
+class SendMessageForm extends React.Component {
+
+    constructor() {
+        super()
+        this.state = {
+            message: ''
+        }
+        this.handleChange = this.handleChange.bind(this)
+        this.handleSubmit = this.handleSubmit.bind(this)
+    }
+
+    handleChange(e) {
+        this.setState({
+            message: e
+        })
+    }
+
+    handleSubmit(e) {
+        //e.preventDefault()
+        this.props.sendMessage(this.state.message)
+        //this.props.sendMessage(this.state.message)
+        this.setState({
+            message: ''
+        })
+
+    }
+
+    render() {
+        return (
+            <div
+                //onSubmit={this.handleSubmit}
+                className="send-message-form">
+                <InputEmoji
+                    disabled={this.props.disabled}
+                    onChange={this.handleChange}
+                    value={this.state.message}
+                    cleanOnEnter
+                    onEnter={this.handleSubmit}
+                    placeholder="Écris ton message et cliques sur Entrer"
+                    height="35"
+                />
+
+            </div>
+        )
+    }
+}
+
+export default SendMessageForm
\ No newline at end of file
diff --git a/jaas-client/src/index.css b/jaas-client/src/index.css
new file mode 100644
index 0000000..062ee6f
--- /dev/null
+++ b/jaas-client/src/index.css
@@ -0,0 +1,211 @@
+:root {
+  --main-color: #1F1F1F;
+  --secondary-color: white;
+  --third-color: #2F2F2F;
+  --main-text-color: #3e5869;
+  --secondary-text-color: #b0c7d6;
+  --send-message-form: #F5F5F5;
+}
+
+html, body {
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  font-family: 'Open Sans', sans-serif;
+  font-weight: 200;
+  color: #3e5869; 
+}
+
+#root {
+  height: 100%;
+}
+
+.app {
+  display: grid;
+  height: 100%;
+  grid-template-columns: repeat(6, 1fr);
+  grid-template-rows: 40px 1fr 1fr 1fr 1fr 1fr 60px;
+  grid-template-areas: 
+      "h h h h h h"
+      "r m m m m m"
+      "r m m m m m"
+      "r m m m m m"
+      "r m m m m m"
+      "r m m m m m"
+      "n s s s s s";
+}
+
+.login {
+  background-color: var(--main-color);
+}
+
+.header-section {
+  grid-area: h;
+}
+
+.new-room-form {
+  grid-area: n;
+}
+
+.rooms-list {
+  grid-area: r;
+}
+
+.message-list {
+  grid-area: m;
+}
+
+.send-message-form {
+  grid-area: s;
+}
+
+/* REST OF CSS */
+
+.header-section {
+  background-color: var(--main-color);
+
+}
+
+.simple-menu {
+  color: var(--send-message-form);
+}
+
+.rooms-list {
+  box-sizing: border-box;
+  padding: 10px;
+  background-color: var(--main-color);
+  overflow: scroll;
+  height: 100%;
+}
+
+.rooms-list ul {
+  list-style-type: none;    
+  padding: 0;
+  overflow: scoll;
+}
+
+.rooms-list li {
+  margin: 10px 0;
+}
+
+.rooms-list h3 {
+  margin: 5px 0;
+  color: var(--secondary-color);
+}
+
+.rooms-list .room a {
+  color: var(--secondary-text-color);
+  font-weight: 600;
+  text-decoration: none;
+  
+}
+
+.rooms-list .room.active a {
+  color: var(--secondary-color);
+}
+
+.new-room-form {
+  padding: 0 5px;
+  background: var(--secondary-color);
+  color: var(--main-text-color);
+}
+
+.new-room-form form {
+  height: 100%;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.new-room-form input {
+  width: 135px;
+  background: var(--secondary-color);
+}
+
+.new-room-form button {
+  background: var(--secondary-color);
+  color: var(--main-text-color);
+  border: 0;
+} 
+
+.new-room-form input::placeholder {
+  color: var(--main-text-color);
+  font-weight: 200;
+}
+
+.new-room-form input:focus {
+  outline-width: 0;
+}
+
+.new-room-form input {
+  border: 0;
+}
+
+.new-room-form button {
+  border: 0;
+}
+
+.message {
+  margin: 15px 0;
+}
+
+.message .message-username {
+  font-size: 11px;
+  font-weight: bold;
+  color: var(--secondary-color);
+  opacity: 0.9;
+  margin-bottom: 6px;
+}
+.message .message-text {
+  background: var(--third-color);
+  color: var(--secondary-color);
+  display: inline;
+  padding: 4px 8px;
+  border-radius: 8px;
+}
+
+.message-list {
+  box-sizing: border-box;
+  padding-left: 6px;
+  width: 100%;
+  height: 100%;
+  overflow: scroll;
+  background: var(--third-color);
+}
+
+.message-list .join-room {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 100%;
+  font-size: 34px;
+  font-weight: 300;
+}
+
+.send-message-form {
+  background: var(--send-message-form);
+  display: flex;
+}
+
+.send-message-form input {
+  width: 100%;
+  padding: 15px 10px;
+  margin: 0;
+  border-style: none;
+  background: var(--send-message-form);
+  font-weight: 200;
+
+}
+
+.send-message-form input:focus {
+  outline-width: 0;
+}
+
+.send-message-form input::placeholder {
+  color: var(--main-text-color);
+}
+
+.help-text {
+  position: absolute;
+  top: 10px;
+}
diff --git a/jaas-client/src/index.js b/jaas-client/src/index.js
new file mode 100644
index 0000000..f5185c1
--- /dev/null
+++ b/jaas-client/src/index.js
@@ -0,0 +1,17 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import './index.css';
+import App from './App';
+import * as serviceWorker from './serviceWorker';
+
+ReactDOM.render(
+  <React.StrictMode>
+    <App />
+  </React.StrictMode>,
+  document.getElementById('root')
+);
+
+// If you want your app to work offline and load faster, you can change
+// unregister() to register() below. Note this comes with some pitfalls.
+// Learn more about service workers: https://bit.ly/CRA-PWA
+serviceWorker.unregister();
diff --git a/jaas-client/src/logo.svg b/jaas-client/src/logo.svg
new file mode 100644
index 0000000..6b60c10
--- /dev/null
+++ b/jaas-client/src/logo.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3">
+    <g fill="#61DAFB">
+        <path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/>
+        <circle cx="420.9" cy="296.5" r="45.7"/>
+        <path d="M520.5 78.1z"/>
+    </g>
+</svg>
diff --git a/jaas-client/src/pages/404.jsx b/jaas-client/src/pages/404.jsx
new file mode 100644
index 0000000..8d0dcb1
--- /dev/null
+++ b/jaas-client/src/pages/404.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+
+
+const NotFoundPage = () => {
+    return (
+        <div>
+            <h3>404 Page not found</h3>
+        </div>
+    )
+}
+
+export default NotFoundPage;
\ No newline at end of file
diff --git a/jaas-client/src/pages/index.jsx b/jaas-client/src/pages/index.jsx
new file mode 100644
index 0000000..ad831b1
--- /dev/null
+++ b/jaas-client/src/pages/index.jsx
@@ -0,0 +1,223 @@
+import React from 'react';
+import Avatar from '@material-ui/core/Avatar';
+import Button from '@material-ui/core/Button';
+import CssBaseline from '@material-ui/core/CssBaseline';
+import TextField from '@material-ui/core/TextField';
+import FormControlLabel from '@material-ui/core/FormControlLabel';
+import Checkbox from '@material-ui/core/Checkbox';
+import Link from '@material-ui/core/Link';
+import Grid from '@material-ui/core/Grid';
+import Box from '@material-ui/core/Box';
+import LockOutlinedIcon from '@material-ui/icons/LockOutlined';
+import Typography from '@material-ui/core/Typography';
+//import { makeStyles } from '@material-ui/core/styles';
+import Container from '@material-ui/core/Container';
+import { Redirect } from 'react-router-dom';
+import CircularProgress from '@material-ui/core/CircularProgress';
+import DialogTitle from '@material-ui/core/DialogTitle';
+import Dialog from '@material-ui/core/Dialog';
+
+
+function Copyright() {
+    return (
+        <Typography variant="body2" color="textSecondary" align="center">
+            {'Copyright © 2016-'}{new Date().getFullYear()}{' Savoir-faire Linux Inc. GNU '}
+            <Link color="inherit" href="https://jami.net/">
+                Jami.net
+        </Link>{' '}
+
+            {'.'}
+        </Typography>
+    );
+}
+
+/*const useStyles = makeStyles((theme) => ({
+    paper: {
+        marginTop: theme.spacing(8),
+        display: 'flex',
+        flexDirection: 'column',
+        alignItems: 'center',
+    },
+    avatar: {
+        margin: theme.spacing(1),
+        backgroundColor: theme.palette.secondary.main,
+    },
+    form: {
+        width: '100%', // Fix IE 11 issue.
+        marginTop: theme.spacing(1),
+    },
+    submit: {
+        margin: theme.spacing(3, 0, 2),
+    },
+}));*/
+
+/*function SignIn() {
+    const classes = useStyles();
+
+
+}*/
+
+/* 
+    TODO:
+    Use useState to handle username password and redirect states to render this page to 
+    comply with material-ui usage of useStyles
+    Src: https://blog.logrocket.com/a-guide-to-usestate-in-react-ecb9952e406c/
+*/
+
+class SignInPage extends React.Component {
+
+    constructor() {
+        super()
+        this.state = {
+            username: '',
+            password: '',
+            redirect: false,
+            session: null,
+            submitted: false,
+            loading: false,
+            error: false,
+            open: false,
+            errorMessage: ''
+        }
+        this.handleSubmit = this.handleSubmit.bind(this);
+    }
+
+    handleusername(text) {
+        this.setState({ username: text.target.value })
+    }
+
+    handlePassword(text) {
+        this.setState({ password: text.target.value })
+    }
+
+    handleSubmit(event) {
+        event.preventDefault();
+        let obj = {}
+        obj.username = this.state.username;
+        obj.password = this.state.password;
+
+        this.setState({
+            submitted: true,
+            loading: true
+        })
+
+        fetch('/api/login?username=' + obj.username + '&password=' + obj.password,
+            {
+                header: {
+                    "Content-Type": "application/json"
+                },
+                method: "POST",
+                credentials: 'same-origin'
+                //body: JSON.stringify({ obj })
+            }
+        ).then((res) => {
+            if (res.status == '200') {
+                this.setState({
+                    redirect: true
+                });
+            } else if (res.status == '401') {
+                this.setState({
+                    loading: false,
+                    error: true,
+                    open: true,
+                    errorMessage: "Wrong credentials! Your are not allowed to connect"
+                })
+            }
+            //this.setState({ session: res });
+        }).catch((e) => {
+            this.setState({
+                loading: false,
+                error: true,
+                open: true,
+                errorMessage: e.toString()
+            })
+        })
+    }
+
+
+    render() {
+        if (this.state.redirect) {
+            return <Redirect to="/jaas" />
+        }
+
+        return (
+            <Container component="main" maxWidth="xs" >
+                <CssBaseline />
+                <div className=""/*{classes.paper}*/>
+                    <Typography component="h1" variant="h5">
+                        Se connecter
+              </Typography>
+                    <form className=""/*{classes.form}*/ onSubmit={this.handleSubmit} >
+                        <TextField
+                            variant="outlined"
+                            margin="normal"
+                            required
+                            fullWidth
+                            id="username"
+                            label="LDAP Savoir-faire Linux"
+                            name="username"
+                            autoComplete="email"
+                            autoFocus
+                            onChange={(text) => { this.handleusername(text) }}
+                        />
+                        <TextField
+                            variant="outlined"
+                            margin="normal"
+                            required
+                            fullWidth
+                            name="password"
+                            label="Mot de passe"
+                            type="password"
+                            id="password"
+                            autoComplete="current-password"
+                            onChange={(text) => { this.handlePassword(text) }}
+                        />
+                        <FormControlLabel
+                            control={<Checkbox value="remember" color="primary" />}
+                            label="Se rapeller de moi"
+                        />
+                        <Button
+                            type="submit"
+                            fullWidth
+                            variant="contained"
+                            color="primary"
+                            className=""/*{classes.submit}*/
+                        // onClick={() => { this.login() }}
+                        >
+                            Se connecter
+                        </Button>
+                        <Grid container>
+                            <Grid item xs>
+                                <Link href="#" variant="body2">
+                                    Mot de passe oublié ?
+                                </Link>
+                            </Grid>
+                            <Grid item>
+                                <Link href="#" variant="body2">
+                                    {"Tu n'as pas de compte? Inscris-toi"}
+                                </Link>
+                            </Grid>
+                        </Grid>
+                    </form>
+                </div>
+                <Box mt={8}>
+                    <Copyright />
+                </Box>
+                {this.state.submitted && this.state.loading && <CircularProgress
+                    style={{ position: 'relative' }}
+                    size={40}
+                    top={10}
+                    style={{ marginLeft: '50%' }}
+                />}
+                {
+                    this.state.error && <Dialog aria-labelledby="simple-dialog-title" open={this.state.open} >
+                        <DialogTitle id="simple-dialog-title">{this.state.errorMessage}</DialogTitle>
+                    </Dialog>
+                }
+            </Container>
+        );
+    }
+}
+
+
+export default SignInPage;
\ No newline at end of file
diff --git a/jaas-client/src/pages/jaas.jsx b/jaas-client/src/pages/jaas.jsx
new file mode 100644
index 0000000..5c8a4aa
--- /dev/null
+++ b/jaas-client/src/pages/jaas.jsx
@@ -0,0 +1,82 @@
+import React from 'react';
+import Header from '../components/Header'
+import ContactList from '../components/ContactList'
+import MessageList from '../components/MessageList'
+import SendMessageForm from '../components/SendMessageForm'
+import NewContactForm from '../components/NewContactForm'
+import Sound from 'react-sound';
+import io from "socket.io-client";
+var socket = io.connect('http://localhost:3000');
+
+class Jaas extends React.Component {
+
+  constructor() {
+    super()
+    this.state = {
+      messages: [],
+      sound: false
+    }
+
+    socket.on('connect', () => {
+      console.log("Success !")
+    })
+
+    //import io from 'socket.io-client';
+
+    //this.socket = socketIOClient(ENDPOINT);
+    //this.socket.on("FromAPI", data => {
+    //  this.setState({
+    //    messages: [...this.state.messages, data]
+    //  })
+    //});
+    this.sendMessage = this.sendMessage.bind(this)
+  }
+
+  componentDidMount() {
+    socket.on('receivedMessage', (data) => {
+      var message = {
+        senderId: '65f6674b26e5af6ed0b4e92a13b80ff4bbfdf1e8',
+        text: data
+      }
+      this.setState({
+        messages: [...this.state.messages, message],
+        sound: true
+      })
+    });
+  }
+
+  sendMessage(text) {
+    var data = {
+      senderId: 'Me',
+      destinationId: '65f6674b26e5af6ed0b4e92a13b80ff4bbfdf1e8',
+      text: text
+    }
+    socket.emit("SendMessage", data);
+    console.log(data.text);
+    this.setState({
+      messages: [...this.state.messages, data],
+      sound: false
+    })
+  }
+  render() {
+    return (
+      <div className="app" >
+        <Header />
+        <ContactList />
+        <MessageList messages={this.state.messages} />
+        <SendMessageForm sendMessage={this.sendMessage} />
+        <NewContactForm />
+        {this.state.sound && <Sound
+          url="stairs.mp3" /*https://notificationsounds.com/message-tones/stairs-567*/
+          playStatus={Sound.status.PLAYING}
+          playFromPosition={0 /* in milliseconds */}
+          onLoading={this.handleSongLoading}
+          onPlaying={this.handleSongPlaying}
+          onFinishedPlaying={this.handleSongFinishedPlaying}
+        />}
+      </div>
+    )
+  }
+}
+
+export default Jaas;
\ No newline at end of file
diff --git a/jaas-client/src/serviceWorker.js b/jaas-client/src/serviceWorker.js
new file mode 100644
index 0000000..b04b771
--- /dev/null
+++ b/jaas-client/src/serviceWorker.js
@@ -0,0 +1,141 @@
+// This optional code is used to register a service worker.
+// register() is not called by default.
+
+// This lets the app load faster on subsequent visits in production, and gives
+// it offline capabilities. However, it also means that developers (and users)
+// will only see deployed updates on subsequent visits to a page, after all the
+// existing tabs open on the page have been closed, since previously cached
+// resources are updated in the background.
+
+// To learn more about the benefits of this model and instructions on how to
+// opt-in, read https://bit.ly/CRA-PWA
+
+const isLocalhost = Boolean(
+  window.location.hostname === 'localhost' ||
+    // [::1] is the IPv6 localhost address.
+    window.location.hostname === '[::1]' ||
+    // 127.0.0.0/8 are considered localhost for IPv4.
+    window.location.hostname.match(
+      /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
+    )
+);
+
+export function register(config) {
+  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
+    // The URL constructor is available in all browsers that support SW.
+    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
+    if (publicUrl.origin !== window.location.origin) {
+      // Our service worker won't work if PUBLIC_URL is on a different origin
+      // from what our page is served on. This might happen if a CDN is used to
+      // serve assets; see https://github.com/facebook/create-react-app/issues/2374
+      return;
+    }
+
+    window.addEventListener('load', () => {
+      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
+
+      if (isLocalhost) {
+        // This is running on localhost. Let's check if a service worker still exists or not.
+        checkValidServiceWorker(swUrl, config);
+
+        // Add some additional logging to localhost, pointing developers to the
+        // service worker/PWA documentation.
+        navigator.serviceWorker.ready.then(() => {
+          console.log(
+            'This web app is being served cache-first by a service ' +
+              'worker. To learn more, visit https://bit.ly/CRA-PWA'
+          );
+        });
+      } else {
+        // Is not localhost. Just register service worker
+        registerValidSW(swUrl, config);
+      }
+    });
+  }
+}
+
+function registerValidSW(swUrl, config) {
+  navigator.serviceWorker
+    .register(swUrl)
+    .then(registration => {
+      registration.onupdatefound = () => {
+        const installingWorker = registration.installing;
+        if (installingWorker == null) {
+          return;
+        }
+        installingWorker.onstatechange = () => {
+          if (installingWorker.state === 'installed') {
+            if (navigator.serviceWorker.controller) {
+              // At this point, the updated precached content has been fetched,
+              // but the previous service worker will still serve the older
+              // content until all client tabs are closed.
+              console.log(
+                'New content is available and will be used when all ' +
+                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
+              );
+
+              // Execute callback
+              if (config && config.onUpdate) {
+                config.onUpdate(registration);
+              }
+            } else {
+              // At this point, everything has been precached.
+              // It's the perfect time to display a
+              // "Content is cached for offline use." message.
+              console.log('Content is cached for offline use.');
+
+              // Execute callback
+              if (config && config.onSuccess) {
+                config.onSuccess(registration);
+              }
+            }
+          }
+        };
+      };
+    })
+    .catch(error => {
+      console.error('Error during service worker registration:', error);
+    });
+}
+
+function checkValidServiceWorker(swUrl, config) {
+  // Check if the service worker can be found. If it can't reload the page.
+  fetch(swUrl, {
+    headers: { 'Service-Worker': 'script' },
+  })
+    .then(response => {
+      // Ensure service worker exists, and that we really are getting a JS file.
+      const contentType = response.headers.get('content-type');
+      if (
+        response.status === 404 ||
+        (contentType != null && contentType.indexOf('javascript') === -1)
+      ) {
+        // No service worker found. Probably a different app. Reload the page.
+        navigator.serviceWorker.ready.then(registration => {
+          registration.unregister().then(() => {
+            window.location.reload();
+          });
+        });
+      } else {
+        // Service worker found. Proceed as normal.
+        registerValidSW(swUrl, config);
+      }
+    })
+    .catch(() => {
+      console.log(
+        'No internet connection found. App is running in offline mode.'
+      );
+    });
+}
+
+export function unregister() {
+  if ('serviceWorker' in navigator) {
+    navigator.serviceWorker.ready
+      .then(registration => {
+        registration.unregister();
+      })
+      .catch(error => {
+        console.error(error.message);
+      });
+  }
+}
diff --git a/jaas-client/src/setupTests.js b/jaas-client/src/setupTests.js
new file mode 100644
index 0000000..74b1a27
--- /dev/null
+++ b/jaas-client/src/setupTests.js
@@ -0,0 +1,5 @@
+// jest-dom adds custom jest matchers for asserting on DOM nodes.
+// allows you to do things like:
+// expect(element).toHaveTextContent(/react/i)
+// learn more: https://github.com/testing-library/jest-dom
+import '@testing-library/jest-dom/extend-expect';
