UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

289 lines (233 loc) 37.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _uploadButton = _interopRequireDefault(require("./upload-button")); var _icons = require("../icons"); var _loadingSpinner = _interopRequireDefault(require("../loading-spinner")); var _utils = require("../../../utils/utils"); var _userGuides = require("../../../constants/user-guides"); var _reactMarkdown = _interopRequireDefault(require("react-markdown")); var _mediaBreakpoints = require("../../../styles/media-breakpoints"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18, _templateObject19; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var FileDrop = typeof document !== "undefined" ? require("react-file-drop") : null; // File.type is not reliable if the OS does not have a // registered mapping for the extension. // NOTE: Shapefiles must be in a compressed format since // it requires multiple files to be present. var defaultValidFileExt = ["csv", "json", "geojson"]; var MESSAGE = " Drag & Drop Your File(s) Here"; var CHROME_MSG = "*Chrome user: Limit file size to 250mb, if need to upload larger file, try Safari"; var DISCLAIMER = ""; var CONFIG_UPLOAD_MESSAGE = "Upload **CSV**, **GeoJson** or saved map **Json**. Read more about [**supported file formats**](".concat(_userGuides.GUIDES_FILE_FORMAT, ")."); var fileIconColor = "#D3D8E0"; var LinkRenderer = function LinkRenderer(props) { return (/*#__PURE__*/_react["default"].createElement("a", { href: props.href, target: "_blank", rel: "noopener noreferrer" }, props.children) ); }; var StyledUploadMessage = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 14px;\n margin-bottom: 12px;\n\n ", "\n"])), function (props) { return props.theme.textColorLT; }, _mediaBreakpoints.media.portable(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n "])))); var WarningMsg = _styledComponents["default"].span(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 10px;\n color: ", ";\n font-weight: 500;\n"])), function (props) { return props.theme.errorColor; }); var PositiveMsg = _styledComponents["default"].span(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-block;\n color: ", ";\n font-weight: 500;\n margin-right: 8px;\n"])), function (props) { return props.theme.primaryBtnActBgd; }); var StyledFileDrop = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: white;\n border-radius: 4px;\n border-style: dashed;\n border-width: 1px;\n border-color: ", ";\n text-align: center;\n width: 100%;\n padding: 48px 8px 0;\n\n .file-upload-or {\n color: ", ";\n padding-right: 4px;\n }\n\n ", ";\n"])), function (props) { return props.theme.subtextColorLT; }, function (props) { return props.theme.linkBtnColor; }, _mediaBreakpoints.media.portable(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 16px 4px 0;\n "])))); var MsgWrapper = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 20px;\n height: 36px;\n"])), function (props) { return props.theme.modalTitleColor; }); var StyledDragNDropIcon = _styledComponents["default"].div(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n margin-bottom: 48px;\n\n ", ";\n ", ";\n"])), fileIconColor, _mediaBreakpoints.media.portable(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _mediaBreakpoints.media.palm(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "])))); var StyledFileTypeFow = _styledComponents["default"].div(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n ", ";\n ", ";\n"])), _mediaBreakpoints.media.portable(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _mediaBreakpoints.media.palm(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "])))); var StyledFileUpload = _styledComponents["default"].div(_templateObject14 || (_templateObject14 = (0, _taggedTemplateLiteral2["default"])(["\n .filter-upload__input {\n visibility: hidden;\n height: 0;\n position: absolute;\n }\n\n .file-drop {\n position: relative;\n }\n"]))); var StyledMessage = _styledComponents["default"].div(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: center;\n align-items: center;\n margin-bottom: 32px;\n\n .loading-action {\n margin-right: 10px;\n }\n .loading-spinner {\n margin-left: 10px;\n }\n"]))); var StyledDragFileWrapper = _styledComponents["default"].div(_templateObject16 || (_templateObject16 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 32px;\n ", ";\n ", "\n"])), _mediaBreakpoints.media.portable(_templateObject17 || (_templateObject17 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n "]))), _mediaBreakpoints.media.portable(_templateObject18 || (_templateObject18 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "])))); var StyledDisclaimer = (0, _styledComponents["default"])(StyledMessage)(_templateObject19 || (_templateObject19 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0 auto;\n"]))); var FileUpload = exports["default"] = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(FileUpload, _Component); var _super = _createSuper(FileUpload); function FileUpload() { var _this; (0, _classCallCheck2["default"])(this, FileUpload); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", { dragOver: false, fileLoading: false, files: [], errorFiles: [] }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "frame", (0, _react.createRef)()); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isValidFileType", function (filename) { var validFileExt = _this.props.validFileExt; var fileExt = validFileExt.find(function (ext) { return filename.endsWith(ext); }); return Boolean(fileExt); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleFileInput", function (files, e) { if (e) { e.stopPropagation(); } var nextState = { files: [], errorFiles: [], dragOver: false }; for (var i = 0; i < files.length; i++) { var file = files[i]; if (file && _this._isValidFileType(file.name)) { nextState.files.push(file); } else { nextState.errorFiles.push(file.name); } } _this.setState(nextState, function () { return nextState.files.length ? _this.props.onFileUpload(nextState.files) : null; }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleDragState", function (newState) { _this.setState({ dragOver: newState }); }); return _this; } (0, _createClass2["default"])(FileUpload, [{ key: "_renderMessage", value: function _renderMessage() { var _this$state = this.state, errorFiles = _this$state.errorFiles, files = _this$state.files; if (errorFiles.length) { return (/*#__PURE__*/_react["default"].createElement(WarningMsg, null, "File ".concat(errorFiles.join(", "), " is not supported.")) ); } else if (this.props.fileLoading && files.length) { return (/*#__PURE__*/_react["default"].createElement(StyledMessage, { className: "file-uploader__message" }, /*#__PURE__*/_react["default"].createElement("div", { className: "loading-action" }, "Uploading"), /*#__PURE__*/_react["default"].createElement("div", null, files.map(function (f, i) { return (/*#__PURE__*/_react["default"].createElement(PositiveMsg, { key: i }, f.name) ); }), "..."), /*#__PURE__*/_react["default"].createElement("div", { className: "loading-spinner" }, /*#__PURE__*/_react["default"].createElement(_loadingSpinner["default"], { size: 20 }))) ); } return null; } }, { key: "render", value: function render() { var _this2 = this; var _this$state2 = this.state, dragOver = _this$state2.dragOver, files = _this$state2.files; var validFileExt = this.props.validFileExt; return (/*#__PURE__*/_react["default"].createElement(StyledFileUpload, { className: "file-uploader", ref: this.frame }, /*#__PURE__*/_react["default"].createElement("input", { className: "filter-upload__input", type: "file", onChange: this._onChange }), FileDrop ? /*#__PURE__*/_react["default"].createElement(FileDrop, { frame: this.frame.current || document, targetAlwaysVisible: true, onDragOver: function onDragOver() { return _this2._toggleDragState(true); }, onDragLeave: function onDragLeave() { return _this2._toggleDragState(false); }, onDrop: this._handleFileInput }, /*#__PURE__*/_react["default"].createElement(StyledUploadMessage, { className: "file-upload__message" }, /*#__PURE__*/_react["default"].createElement(_reactMarkdown["default"], { source: CONFIG_UPLOAD_MESSAGE, renderers: { link: LinkRenderer } })), /*#__PURE__*/_react["default"].createElement(StyledFileDrop, { dragOver: dragOver }, /*#__PURE__*/_react["default"].createElement("div", { style: { opacity: dragOver ? 0.5 : 1 } }, /*#__PURE__*/_react["default"].createElement(StyledDragNDropIcon, null, /*#__PURE__*/_react["default"].createElement(StyledFileTypeFow, { className: "file-type-row" }, validFileExt.map(function (ext) { return (/*#__PURE__*/_react["default"].createElement(_icons.FileType, { key: ext, ext: ext, height: "50px", fontSize: "9px" }) ); })), /*#__PURE__*/_react["default"].createElement(_icons.DragNDrop, { height: "44px" })), /*#__PURE__*/_react["default"].createElement("div", null, this._renderMessage())), !files.length ? /*#__PURE__*/_react["default"].createElement(StyledDragFileWrapper, null, /*#__PURE__*/_react["default"].createElement(MsgWrapper, null, MESSAGE), /*#__PURE__*/_react["default"].createElement("span", { className: "file-upload-or" }, "or"), /*#__PURE__*/_react["default"].createElement(_uploadButton["default"], { onUpload: this._handleFileInput }, "browse your files")) : null, /*#__PURE__*/_react["default"].createElement(StyledDisclaimer, null, DISCLAIMER))) : null, /*#__PURE__*/_react["default"].createElement(WarningMsg, null, (0, _utils.isChrome)() ? CHROME_MSG : "")) ); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, state) { if (state.fileLoading && props.fileLoading === false && state.files.length) { return { files: [], fileLoading: props.fileLoading }; } return { fileLoading: props.fileLoading }; } }]); return FileUpload; }(_react.Component); (0, _defineProperty2["default"])(FileUpload, "propTypes", { onFileUpload: _propTypes["default"].func.isRequired, validFileExt: _propTypes["default"].arrayOf(_propTypes["default"].string), fileLoading: _propTypes["default"].bool }); (0, _defineProperty2["default"])(FileUpload, "defaultProps", { validFileExt: defaultValidFileExt }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkLmpzIl0sIm5hbWVzIjpbIkZpbGVEcm9wIiwiZG9jdW1lbnQiLCJyZXF1aXJlIiwiZGVmYXVsdFZhbGlkRmlsZUV4dCIsIk1FU1NBR0UiLCJDSFJPTUVfTVNHIiwiRElTQ0xBSU1FUiIsIkNPTkZJR19VUExPQURfTUVTU0FHRSIsIkdVSURFU19GSUxFX0ZPUk1BVCIsImZpbGVJY29uQ29sb3IiLCJMaW5rUmVuZGVyZXIiLCJwcm9wcyIsImhyZWYiLCJjaGlsZHJlbiIsIlN0eWxlZFVwbG9hZE1lc3NhZ2UiLCJzdHlsZWQiLCJkaXYiLCJ0aGVtZSIsInRleHRDb2xvckxUIiwibWVkaWEiLCJwb3J0YWJsZSIsIldhcm5pbmdNc2ciLCJzcGFuIiwiZXJyb3JDb2xvciIsIlBvc2l0aXZlTXNnIiwicHJpbWFyeUJ0bkFjdEJnZCIsIlN0eWxlZEZpbGVEcm9wIiwic3VidGV4dENvbG9yTFQiLCJsaW5rQnRuQ29sb3IiLCJNc2dXcmFwcGVyIiwibW9kYWxUaXRsZUNvbG9yIiwiU3R5bGVkRHJhZ05Ecm9wSWNvbiIsInBhbG0iLCJTdHlsZWRGaWxlVHlwZUZvdyIsIlN0eWxlZEZpbGVVcGxvYWQiLCJTdHlsZWRNZXNzYWdlIiwiU3R5bGVkRHJhZ0ZpbGVXcmFwcGVyIiwiU3R5bGVkRGlzY2xhaW1lciIsIkZpbGVVcGxvYWQiLCJkcmFnT3ZlciIsImZpbGVMb2FkaW5nIiwiZmlsZXMiLCJlcnJvckZpbGVzIiwiZmlsZW5hbWUiLCJ2YWxpZEZpbGVFeHQiLCJmaWxlRXh0IiwiZmluZCIsImV4dCIsImVuZHNXaXRoIiwiQm9vbGVhbiIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJuZXh0U3RhdGUiLCJpIiwibGVuZ3RoIiwiZmlsZSIsIl9pc1ZhbGlkRmlsZVR5cGUiLCJuYW1lIiwicHVzaCIsInNldFN0YXRlIiwib25GaWxlVXBsb2FkIiwibmV3U3RhdGUiLCJzdGF0ZSIsImpvaW4iLCJtYXAiLCJmIiwiZnJhbWUiLCJfb25DaGFuZ2UiLCJjdXJyZW50IiwiX3RvZ2dsZURyYWdTdGF0ZSIsIl9oYW5kbGVGaWxlSW5wdXQiLCJsaW5rIiwib3BhY2l0eSIsIl9yZW5kZXJNZXNzYWdlIiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJhcnJheU9mIiwic3RyaW5nIiwiYm9vbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOzs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxRQUFRLEdBQ1osT0FBT0MsUUFBUCxLQUFvQixXQUFwQixHQUFrQ0MsT0FBTyxDQUFDLGlCQUFELENBQXpDLEdBQStELElBRGpFLEMsQ0FHQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxJQUFNQyxtQkFBbUIsR0FBRyxDQUFDLEtBQUQsRUFBUSxNQUFSLEVBQWdCLFNBQWhCLENBQTVCO0FBRUEsSUFBTUMsT0FBTyxHQUFHLGdDQUFoQjtBQUNBLElBQU1DLFVBQVUsR0FDZCxtRkFERjtBQUVBLElBQU1DLFVBQVUsR0FBRyxFQUFuQjtBQUNBLElBQU1DLHFCQUFxQiw2R0FBc0dDLDhCQUF0RyxPQUEzQjtBQUVBLElBQU1DLGFBQWEsR0FBRyxTQUF0Qjs7QUFFQSxJQUFNQyxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFBQyxLQUFLLEVBQUk7QUFDNUIsdUJBQ0U7QUFBRyxNQUFBLElBQUksRUFBRUEsS0FBSyxDQUFDQyxJQUFmO0FBQXFCLE1BQUEsTUFBTSxFQUFDLFFBQTVCO0FBQXFDLE1BQUEsR0FBRyxFQUFDO0FBQXpDLE9BQ0dELEtBQUssQ0FBQ0UsUUFEVDtBQURGO0FBS0QsQ0FORDs7QUFPQSxJQUFNQyxtQkFBbUIsR0FBR0MsNkJBQU9DLEdBQVYsK0pBQ2QsVUFBQUwsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ00sS0FBTixDQUFZQyxXQUFo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Q0xiLFVBQUFBLEtBQUssRUFBRSxFQURGO0FBRUxELFVBQUFBLFdBQVcsRUFBRTdCLEtBQUssQ0FBQzZCO0FBRmQsU0FBUDtBQUlEOztBQUNELGFBQU87QUFDTEEsUUFBQUEsV0FBVyxFQUFFN0IsS0FBSyxDQUFDNkI7QUFEZCxPQUFQO0FBR0Q7OztFQWhDcUNrQyxnQjs7aUNBQW5CcEMsVSxlQUNBO0FBQ2pCc0IsRUFBQUEsWUFBWSxFQUFFZSxzQkFBVUMsSUFBVixDQUFlQyxVQURaO0FBRWpCakMsRUFBQUEsWUFBWSxFQUFFK0Isc0JBQVVHLE9BQVYsQ0FBa0JILHNCQUFVSSxNQUE1QixDQUZHO0FBR2pCdkMsRUFBQUEsV0FBVyxFQUFFbUMsc0JBQVVLO0FBSE4sQztpQ0FEQTFDLFUsa0JBT0c7QUFDcEJNLEVBQUFBLFlBQVksRUFBRXpDO0FBRE0sQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIGNyZWF0ZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwic3R5bGVkLWNvbXBvbmVudHNcIjtcblxuaW1wb3J0IFVwbG9hZEJ1dHRvbiBmcm9tIFwiLi91cGxvYWQtYnV0dG9uXCI7XG5pbXBvcnQgeyBGaWxlVHlwZSwgRHJhZ05Ecm9wIH0gZnJvbSBcImNvbXBvbmVudHMvY29tbW9uL2ljb25zXCI7XG5pbXBvcnQgTG9hZGluZ1NwaW5uZXIgZnJvbSBcImNvbXBvbmVudHMvY29tbW9uL2xvYWRpbmctc3Bpbm5lclwiO1xuaW1wb3J0IHsgaXNDaHJvbWUgfSBmcm9tIFwidXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEdVSURFU19GSUxFX0ZPUk1BVCB9IGZyb20gXCJjb25zdGFudHMvdXNlci1ndWlkZXNcIjtcbmltcG9ydCBSZWFjdE1hcmtkb3duIGZyb20gXCJyZWFjdC1tYXJrZG93blwiO1xuXG4vLyBCcmVha3BvaW50c1xuaW1wb3J0IHsgbWVkaWEgfSBmcm9tIFwic3R5bGVzL21lZGlhLWJyZWFrcG9pbnRzXCI7XG5cbmNvbnN0IEZpbGVEcm9wID1cbiAgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gcmVxdWlyZShcInJlYWN0LWZpbGUtZHJvcFwiKSA6IG51bGw7XG5cbi8vIEZpbGUudHlwZSBpcyBub3QgcmVsaWFibGUgaWYgdGhlIE9TIGRvZXMgbm90IGhhdmUgYVxuLy8gcmVnaXN0ZXJlZCBtYXBwaW5nIGZvciB0aGUgZXh0ZW5zaW9uLlxuLy8gTk9URTogU2hhcGVmaWxlcyBtdXN0IGJlIGluIGEgY29tcHJlc3NlZCBmb3JtYXQgc2luY2Vcbi8vIGl0IHJlcXVpcmVzIG11bHRpcGxlIGZpbGVzIHRvIGJlIHByZXNlbnQuXG5jb25zdCBkZWZhdWx0VmFsaWRGaWxlRXh0ID0gW1wiY3N2XCIsIFwianNvblwiLCBcImdlb2pzb25cIl07XG5cbmNvbnN0IE1FU1NBR0UgPSBcIiBEcmFnICYgRHJvcCBZb3VyIEZpbGUocykgSGVyZVwiO1xuY29uc3QgQ0hST01FX01TRyA9XG4gIFwiKkNocm9tZSB1c2VyOiBMaW1pdCBmaWxlIHNpemUgdG8gMjUwbWIsIGlmIG5lZWQgdG8gdXBsb2FkIGxhcmdlciBmaWxlLCB0cnkgU2FmYXJpXCI7XG5jb25zdCBESVNDTEFJTUVSID0gXCJcIlxuY29uc3QgQ09ORklHX1VQTE9BRF9NRVNTQUdFID0gYFVwbG9hZCAqKkNTVioqLCAqKkdlb0pzb24qKiBvciBzYXZlZCBtYXAgKipKc29uKiouIFJlYWQgbW9yZSBhYm91dCBbKipzdXBwb3J0ZWQgZmlsZSBmb3JtYXRzKipdKCR7R1VJREVTX0ZJTEVfRk9STUFUfSkuYDtcblxuY29uc3QgZmlsZUljb25Db2xvciA9IFwiI0QzRDhFMFwiO1xuXG5jb25zdCBMaW5rUmVuZGVyZXIgPSBwcm9wcyA9PiB7XG4gIHJldHVybiAoXG4gICAgPGEgaHJlZj17cHJvcHMuaHJlZn0gdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlxuICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgIDwvYT5cbiAgKTtcbn07XG5jb25zdCBTdHlsZWRVcGxvYWRNZXNzYWdlID0gc3R5bGVkLmRpdmBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yTFR9O1xuICBmb250LXNpemU6IDE0cHg7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG5cbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBmb250LXNpemU6IDEycHg7XG4gIGB9XG5gO1xuXG5jb25zdCBXYXJuaW5nTXNnID0gc3R5bGVkLnNwYW5gXG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVycm9yQ29sb3J9O1xuICBmb250LXdlaWdodDogNTAwO1xuYDtcblxuY29uc3QgUG9zaXRpdmVNc2cgPSBzdHlsZWQuc3BhbmBcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wcmltYXJ5QnRuQWN0QmdkfTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbWFyZ2luLXJpZ2h0OiA4cHg7XG5gO1xuXG5jb25zdCBTdHlsZWRGaWxlRHJvcCA9IHN0eWxlZC5kaXZgXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJvcmRlci1zdHlsZTogZGFzaGVkO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnN1YnRleHRDb2xvckxUfTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogNDhweCA4cHggMDtcblxuICAuZmlsZS11cGxvYWQtb3Ige1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmtCdG5Db2xvcn07XG4gICAgcGFkZGluZy1yaWdodDogNHB4O1xuICB9XG5cbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBwYWRkaW5nOiAxNnB4IDRweCAwO1xuICBgfTtcbmA7XG5cbmNvbnN0IE1zZ1dyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5tb2RhbFRpdGxlQ29sb3J9O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGhlaWdodDogMzZweDtcbmA7XG5cbmNvbnN0IFN0eWxlZERyYWdORHJvcEljb24gPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtmaWxlSWNvbkNvbG9yfTtcbiAgbWFyZ2luLWJvdHRvbTogNDhweDtcblxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGB9O1xuICAke21lZGlhLnBhbG1gXG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZEZpbGVUeXBlRm93ID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICBgfTtcbiAgJHttZWRpYS5wYWxtYFxuICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgYH07XG5gO1xuXG5jb25zdCBTdHlsZWRGaWxlVXBsb2FkID0gc3R5bGVkLmRpdmBcbiAgLmZpbHRlci11cGxvYWRfX2lucHV0IHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgfVxuXG4gIC5maWxlLWRyb3Age1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAzMnB4O1xuXG4gIC5sb2FkaW5nLWFjdGlvbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICB9XG4gIC5sb2FkaW5nLXNwaW5uZXIge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWREcmFnRmlsZVdyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiAzMnB4O1xuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gIGB9O1xuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGB9XG5gO1xuXG5jb25zdCBTdHlsZWREaXNjbGFpbWVyID0gc3R5bGVkKFN0eWxlZE1lc3NhZ2UpYFxuICBtYXJnaW46IDAgYXV0bztcbmA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVVcGxvYWQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIG9uRmlsZVVwbG9hZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB2YWxpZEZpbGVFeHQ6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICAgIGZpbGVMb2FkaW5nOiBQcm9wVHlwZXMuYm9vbFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgdmFsaWRGaWxlRXh0OiBkZWZhdWx0VmFsaWRGaWxlRXh0XG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgZHJhZ092ZXI6IGZhbHNlLFxuICAgIGZpbGVMb2FkaW5nOiBmYWxzZSxcbiAgICBmaWxlczogW10sXG4gICAgZXJyb3JGaWxlczogW11cbiAgfTtcblxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgIGlmIChcbiAgICAgIHN0YXRlLmZpbGVMb2FkaW5nICYmXG4gICAgICBwcm9wcy5maWxlTG9hZGluZyA9PT0gZmFsc2UgJiZcbiAgICAgIHN0YXRlLmZpbGVzLmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZXM6IFtdLFxuICAgICAgICBmaWxlTG9hZGluZzogcHJvcHMuZmlsZUxvYWRpbmdcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBmaWxlTG9hZGluZzogcHJvcHMuZmlsZUxvYWRpbmdcbiAgICB9O1xuICB9XG5cbiAgZnJhbWUgPSBjcmVhdGVSZWYoKTtcblxuICBfaXNWYWxpZEZpbGVUeXBlID0gZmlsZW5hbWUgPT4ge1xuICAgIGNvbnN0IHsgdmFsaWRGaWxlRXh0IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGZpbGVFeHQgPSB2YWxpZEZpbGVFeHQuZmluZChleHQgPT4gZmlsZW5hbWUuZW5kc1dpdGgoZXh0KSk7XG5cbiAgICByZXR1cm4gQm9vbGVhbihmaWxlRXh0KTtcbiAgfTtcblxuICBfaGFuZGxlRmlsZUlucHV0ID0gKGZpbGVzLCBlKSA9PiB7XG4gICAgaWYgKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFN0YXRlID0geyBmaWxlczogW10sIGVycm9yRmlsZXM6IFtdLCBkcmFnT3ZlcjogZmFsc2UgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbaV07XG5cbiAgICAgIGlmIChmaWxlICYmIHRoaXMuX2lzVmFsaWRGaWxlVHlwZShmaWxlLm5hbWUpKSB7XG4gICAgICAgIG5leHRTdGF0ZS5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFN0YXRlLmVycm9yRmlsZXMucHVzaChmaWxlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCAoKSA9PlxuICAgICAgbmV4dFN0YXRlLmZpbGVzLmxlbmd0aCA/IHRoaXMucHJvcHMub25GaWxlVXBsb2FkKG5leHRTdGF0ZS5maWxlcykgOiBudWxsXG4gICAgKTtcbiAgfTtcblxuICBfdG9nZ2xlRHJhZ1N0YXRlID0gbmV3U3RhdGUgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBkcmFnT3ZlcjogbmV3U3RhdGUgfSk7XG4gIH07XG5cbiAgX3JlbmRlck1lc3NhZ2UoKSB7XG4gICAgY29uc3QgeyBlcnJvckZpbGVzLCBmaWxlcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoZXJyb3JGaWxlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxXYXJuaW5nTXNnPlxuICAgICAgICAgIHtgRmlsZSAke2Vycm9yRmlsZXMuam9pbihcIiwgXCIpfSBpcyBub3Qgc3VwcG9ydGVkLmB9XG4gICAgICAgIDwvV2FybmluZ01zZz5cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmZpbGVMb2FkaW5nICYmIGZpbGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZE1lc3NhZ2UgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRlcl9fbWVzc2FnZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGluZy1hY3Rpb25cIj5VcGxvYWRpbmc8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAge2ZpbGVzLm1hcCgoZiwgaSkgPT4gKFxuICAgICAgICAgICAgICA8UG9zaXRpdmVNc2cga2V5PXtpfT57Zi5uYW1lfTwvUG9zaXRpdmVNc2c+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICAgIC4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGluZy1zcGlubmVyXCI+XG4gICAgICAgICAgICA8TG9hZGluZ1NwaW5uZXIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvU3R5bGVkTWVzc2FnZT5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBkcmFnT3ZlciwgZmlsZXMgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyB2YWxpZEZpbGVFeHQgfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZEZpbGVVcGxvYWQgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRlclwiIHJlZj17dGhpcy5mcmFtZX0+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGNsYXNzTmFtZT1cImZpbHRlci11cGxvYWRfX2lucHV0XCJcbiAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgb25DaGFuZ2U9e3RoaXMuX29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgICB7RmlsZURyb3AgPyAoXG4gICAgICAgICAgPEZpbGVEcm9wXG4gICAgICAgICAgICBmcmFtZT17dGhpcy5mcmFtZS5jdXJyZW50IHx8IGRvY3VtZW50fVxuICAgICAgICAgICAgdGFyZ2V0QWx3YXlzVmlzaWJsZVxuICAgICAgICAgICAgb25EcmFnT3Zlcj17KCkgPT4gdGhpcy5fdG9nZ2xlRHJhZ1N0YXRlKHRydWUpfVxuICAgICAgICAgICAgb25EcmFnTGVhdmU9eygpID0+IHRoaXMuX3RvZ2dsZURyYWdTdGF0ZShmYWxzZSl9XG4gICAgICAgICAgICBvbkRyb3A9e3RoaXMuX2hhbmRsZUZpbGVJbnB1dH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8U3R5bGVkVXBsb2FkTWVzc2FnZSBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZF9fbWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8UmVhY3RNYXJrZG93blxuICAgICAgICAgICAgICAgIHNvdXJjZT17Q09ORklHX1VQTE9BRF9NRVNTQUdFfVxuICAgICAgICAgICAgICAgIHJlbmRlcmVycz17eyBsaW5rOiBMaW5rUmVuZGVyZXIgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvU3R5bGVkVXBsb2FkTWVzc2FnZT5cbiAgICAgICAgICAgIDxTdHlsZWRGaWxlRHJvcCBkcmFnT3Zlcj17ZHJhZ092ZXJ9PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IG9wYWNpdHk6IGRyYWdPdmVyID8gMC41IDogMSB9fT5cbiAgICAgICAgICAgICAgICA8U3R5bGVkRHJhZ05Ecm9wSWNvbj5cbiAgICAgICAgICAgICAgICAgIDxTdHlsZWRGaWxlVHlwZUZvdyBjbGFzc05hbWU9XCJmaWxlLXR5cGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIHt2YWxpZEZpbGVFeHQubWFwKGV4dCA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpbGVUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2V4dH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dD17ZXh0fVxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiNTBweFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT1cIjlweFwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZEZpbGVUeXBlRm93PlxuICAgICAgICAgICAgICAgICAgPERyYWdORHJvcCBoZWlnaHQ9XCI0NHB4XCIgLz5cbiAgICAgICAgICAgICAgICA8L1N0eWxlZERyYWdORHJvcEljb24+XG4gICAgICAgICAgICAgICAgPGRpdj57dGhpcy5fcmVuZGVyTWVzc2FnZSgpfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgeyFmaWxlcy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgICAgPFN0eWxlZERyYWdGaWxlV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgIDxNc2dXcmFwcGVyPntNRVNTQUdFfTwvTXNnV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkLW9yXCI+b3I8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8VXBsb2FkQnV0dG9uIG9uVXBsb2FkPXt0aGlzLl9oYW5kbGVGaWxlSW5wdXR9PlxuICAgICAgICAgICAgICAgICAgICBicm93c2UgeW91ciBmaWxlc1xuICAgICAgICAgICAgICAgICAgPC9VcGxvYWRCdXR0b24+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWREcmFnRmlsZVdyYXBwZXI+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICA8U3R5bGVkRGlzY2xhaW1lcj57RElTQ0xBSU1FUn08L1N0eWxlZERpc2NsYWltZXI+XG4gICAgICAgICAgICA8L1N0eWxlZEZpbGVEcm9wPlxuICAgICAgICAgIDwvRmlsZURyb3A+XG4gICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgIDxXYXJuaW5nTXNnPntpc0Nocm9tZSgpID8gQ0hST01FX01TRyA6IFwiXCJ9PC9XYXJuaW5nTXNnPlxuICAgICAgPC9TdHlsZWRGaWxlVXBsb2FkPlxuICAgICk7XG4gIH1cbn1cbiJdfQ==