UNPKG

kepler.gl

Version:

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

491 lines (380 loc) 39 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.FileUpload = exports["default"] = exports.WarningMsg = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); 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 _fileDrop = _interopRequireDefault(require("./file-drop")); var _utils = require("../../../utils/utils"); var _userGuides = require("../../../constants/user-guides"); var _reactMarkdown = _interopRequireDefault(require("react-markdown")); var _mediaBreakpoints = require("../../../styles/media-breakpoints"); var _reactIntl = require("react-intl"); function _templateObject19() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0 auto;\n"]); _templateObject19 = function _templateObject19() { return data; }; return data; } function _templateObject18() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]); _templateObject18 = function _templateObject18() { return data; }; return data; } function _templateObject17() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n "]); _templateObject17 = function _templateObject17() { return data; }; return data; } function _templateObject16() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 32px;\n ", ";\n ", "\n"]); _templateObject16 = function _templateObject16() { return data; }; return data; } function _templateObject15() { var data = (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"]); _templateObject15 = function _templateObject15() { return data; }; return data; } function _templateObject14() { var data = (0, _taggedTemplateLiteral2["default"])(["\n .file-drop {\n position: relative;\n }\n"]); _templateObject14 = function _templateObject14() { return data; }; return data; } function _templateObject13() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "]); _templateObject13 = function _templateObject13() { return data; }; return data; } function _templateObject12() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]); _templateObject12 = function _templateObject12() { return data; }; return data; } function _templateObject11() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n ", ";\n ", ";\n"]); _templateObject11 = function _templateObject11() { return data; }; return data; } function _templateObject10() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "]); _templateObject10 = function _templateObject10() { return data; }; return data; } function _templateObject9() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]); _templateObject9 = function _templateObject9() { return data; }; return data; } function _templateObject8() { var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n margin-bottom: 48px;\n\n ", ";\n ", ";\n"]); _templateObject8 = function _templateObject8() { return data; }; return data; } function _templateObject7() { var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 20px;\n height: 36px;\n"]); _templateObject7 = function _templateObject7() { return data; }; return data; } function _templateObject6() { var data = (0, _taggedTemplateLiteral2["default"])(["\n padding: 16px 4px 0;\n "]); _templateObject6 = function _templateObject6() { return data; }; return data; } function _templateObject5() { var data = (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"]); _templateObject5 = function _templateObject5() { return data; }; return data; } function _templateObject4() { var data = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-block;\n color: ", ";\n font-weight: 500;\n margin-right: 8px;\n"]); _templateObject4 = function _templateObject4() { return data; }; return data; } function _templateObject3() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 10px;\n color: ", ";\n font-weight: 500;\n"]); _templateObject3 = function _templateObject3() { return data; }; return data; } function _templateObject2() { var data = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n "]); _templateObject2 = function _templateObject2() { return data; }; return data; } function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 14px;\n margin-bottom: 12px;\n\n ", "\n"]); _templateObject = function _templateObject() { return data; }; return data; } // 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 fileIconColor = '#D3D8E0'; var LinkRenderer = function LinkRenderer(props) { return _react["default"].createElement("a", { href: props.href, target: "_blank", rel: "noopener noreferrer" }, props.children); }; var StyledUploadMessage = _styledComponents["default"].div(_templateObject(), function (props) { return props.theme.textColorLT; }, _mediaBreakpoints.media.portable(_templateObject2())); var WarningMsg = _styledComponents["default"].span(_templateObject3(), function (props) { return props.theme.errorColor; }); exports.WarningMsg = WarningMsg; var PositiveMsg = _styledComponents["default"].span(_templateObject4(), function (props) { return props.theme.primaryBtnActBgd; }); var StyledFileDrop = _styledComponents["default"].div(_templateObject5(), function (props) { return props.theme.subtextColorLT; }, function (props) { return props.theme.linkBtnColor; }, _mediaBreakpoints.media.portable(_templateObject6())); var MsgWrapper = _styledComponents["default"].div(_templateObject7(), function (props) { return props.theme.modalTitleColor; }); var StyledDragNDropIcon = _styledComponents["default"].div(_templateObject8(), fileIconColor, _mediaBreakpoints.media.portable(_templateObject9()), _mediaBreakpoints.media.palm(_templateObject10())); var StyledFileTypeFow = _styledComponents["default"].div(_templateObject11(), _mediaBreakpoints.media.portable(_templateObject12()), _mediaBreakpoints.media.palm(_templateObject13())); var StyledFileUpload = _styledComponents["default"].div(_templateObject14()); var StyledMessage = _styledComponents["default"].div(_templateObject15()); var StyledDragFileWrapper = _styledComponents["default"].div(_templateObject16(), _mediaBreakpoints.media.portable(_templateObject17()), _mediaBreakpoints.media.portable(_templateObject18())); var StyledDisclaimer = (0, _styledComponents["default"])(StyledMessage)(_templateObject19()); function FileUploadFactory() { var FileUpload = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(FileUpload, _Component); function FileUpload() { var _getPrototypeOf2; 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 = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(FileUpload)).call.apply(_getPrototypeOf2, [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 _react["default"].createElement(WarningMsg, null, _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'fileUploader.filenNotSupported', values: { errorFiles: errorFiles.join(', ') } })); } else if (this.props.fileLoading && files.length) { return _react["default"].createElement(StyledMessage, { className: "file-uploader__message" }, _react["default"].createElement("div", { className: "loading-action" }, _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'fileUploader.uploading' })), _react["default"].createElement("div", null, files.map(function (f, i) { return _react["default"].createElement(PositiveMsg, { key: i }, f.name); }), "..."), _react["default"].createElement("div", { className: "loading-spinner" }, _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 _this$props = this.props, validFileExt = _this$props.validFileExt, intl = _this$props.intl; return _react["default"].createElement(StyledFileUpload, { className: "file-uploader", ref: this.frame }, _fileDrop["default"] ? _react["default"].createElement(_fileDrop["default"], { frame: this.frame.current || document, onDragOver: function onDragOver() { return _this2._toggleDragState(true); }, onDragLeave: function onDragLeave() { return _this2._toggleDragState(false); }, onDrop: this._handleFileInput, className: "file-uploader__file-drop" }, _react["default"].createElement(StyledUploadMessage, { className: "file-upload__message" }, _react["default"].createElement(_reactMarkdown["default"], { source: "".concat(intl.formatMessage({ id: 'fileUploader.configUploadMessage' }), "(").concat(_userGuides.GUIDES_FILE_FORMAT, ")."), renderers: { link: LinkRenderer } })), _react["default"].createElement(StyledFileDrop, { dragOver: dragOver }, _react["default"].createElement("div", { style: { opacity: dragOver ? 0.5 : 1 } }, _react["default"].createElement(StyledDragNDropIcon, null, _react["default"].createElement(StyledFileTypeFow, { className: "file-type-row" }, validFileExt.map(function (ext) { return _react["default"].createElement(_icons.FileType, { key: ext, ext: ext, height: "50px", fontSize: "9px" }); })), _react["default"].createElement(_icons.DragNDrop, { height: "44px" })), _react["default"].createElement("div", null, this._renderMessage())), !files.length ? _react["default"].createElement(StyledDragFileWrapper, null, _react["default"].createElement(MsgWrapper, null, _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'fileUploader.message' })), _react["default"].createElement("span", { className: "file-upload-or" }, _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'fileUploader.or' })), _react["default"].createElement(_uploadButton["default"], { onUpload: this._handleFileInput }, _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'fileUploader.browseFiles' }))) : null, _react["default"].createElement(StyledDisclaimer, null, _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'fileUploader.disclaimer' })))) : null, _react["default"].createElement(WarningMsg, null, (0, _utils.isChrome)() ? _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'fileUploader.chromeMessage' }) : '')); } }], [{ 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 }); return (0, _reactIntl.injectIntl)(FileUpload); } var _default = FileUploadFactory; exports["default"] = _default; var FileUpload = FileUploadFactory(); exports.FileUpload = FileUpload; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkLmpzIl0sIm5hbWVzIjpbImRlZmF1bHRWYWxpZEZpbGVFeHQiLCJmaWxlSWNvbkNvbG9yIiwiTGlua1JlbmRlcmVyIiwicHJvcHMiLCJocmVmIiwiY2hpbGRyZW4iLCJTdHlsZWRVcGxvYWRNZXNzYWdlIiwic3R5bGVkIiwiZGl2IiwidGhlbWUiLCJ0ZXh0Q29sb3JMVCIsIm1lZGlhIiwicG9ydGFibGUiLCJXYXJuaW5nTXNnIiwic3BhbiIsImVycm9yQ29sb3IiLCJQb3NpdGl2ZU1zZyIsInByaW1hcnlCdG5BY3RCZ2QiLCJTdHlsZWRGaWxlRHJvcCIsInN1YnRleHRDb2xvckxUIiwibGlua0J0bkNvbG9yIiwiTXNnV3JhcHBlciIsIm1vZGFsVGl0bGVDb2xvciIsIlN0eWxlZERyYWdORHJvcEljb24iLCJwYWxtIiwiU3R5bGVkRmlsZVR5cGVGb3ciLCJTdHlsZWRGaWxlVXBsb2FkIiwiU3R5bGVkTWVzc2FnZSIsIlN0eWxlZERyYWdGaWxlV3JhcHBlciIsIlN0eWxlZERpc2NsYWltZXIiLCJGaWxlVXBsb2FkRmFjdG9yeSIsIkZpbGVVcGxvYWQiLCJkcmFnT3ZlciIsImZpbGVMb2FkaW5nIiwiZmlsZXMiLCJlcnJvckZpbGVzIiwiZmlsZW5hbWUiLCJ2YWxpZEZpbGVFeHQiLCJmaWxlRXh0IiwiZmluZCIsImV4dCIsImVuZHNXaXRoIiwiQm9vbGVhbiIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJuZXh0U3RhdGUiLCJpIiwibGVuZ3RoIiwiZmlsZSIsIl9pc1ZhbGlkRmlsZVR5cGUiLCJuYW1lIiwicHVzaCIsInNldFN0YXRlIiwib25GaWxlVXBsb2FkIiwibmV3U3RhdGUiLCJzdGF0ZSIsImpvaW4iLCJtYXAiLCJmIiwiaW50bCIsImZyYW1lIiwiRmlsZURyb3AiLCJjdXJyZW50IiwiZG9jdW1lbnQiLCJfdG9nZ2xlRHJhZ1N0YXRlIiwiX2hhbmRsZUZpbGVJbnB1dCIsImZvcm1hdE1lc3NhZ2UiLCJpZCIsIkdVSURFU19GSUxFX0ZPUk1BVCIsImxpbmsiLCJvcGFjaXR5IiwiX3JlbmRlck1lc3NhZ2UiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJmdW5jIiwiaXNSZXF1aXJlZCIsImFycmF5T2YiLCJzdHJpbmciLCJib29sIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTUEsbUJBQW1CLEdBQUcsQ0FBQyxLQUFELEVBQVEsTUFBUixFQUFnQixTQUFoQixDQUE1QjtBQUVBLElBQU1DLGFBQWEsR0FBRyxTQUF0Qjs7QUFFQSxJQUFNQyxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFBQyxLQUFLLEVBQUk7QUFDNUIsU0FDRTtBQUFHLElBQUEsSUFBSSxFQUFFQSxLQUFLLENBQUNDLElBQWY7QUFBcUIsSUFBQSxNQUFNLEVBQUMsUUFBNUI7QUFBcUMsSUFBQSxHQUFHLEVBQUM7QUFBekMsS0FDR0QsS0FBSyxDQUFDRSxRQURULENBREY7QUFLRCxDQU5EOztBQU9BLElBQU1DLG1CQUFtQixHQUFHQyw2QkFBT0MsR0FBVixvQkFDZCxVQUFBTCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDTSxLQUFOLENBQVlDLFdBQWhCO0FBQUEsQ0FEUyxFQUtyQkMsd0JBQU1DLFFBTGUscUJBQXpCOztBQVVPLElBQU1DLFVB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UDtBQUNEOztlQUVjRCxpQjs7QUFDUixJQUFNQyxVQUFVLEdBQUdELGlCQUFpQixFQUFwQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMCBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgY3JlYXRlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCBVcGxvYWRCdXR0b24gZnJvbSAnLi91cGxvYWQtYnV0dG9uJztcbmltcG9ydCB7RHJhZ05Ecm9wLCBGaWxlVHlwZX0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IExvYWRpbmdTcGlubmVyIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2xvYWRpbmctc3Bpbm5lcic7XG5pbXBvcnQgRmlsZURyb3AgZnJvbSAnLi9maWxlLWRyb3AnO1xuXG5pbXBvcnQge2lzQ2hyb21lfSBmcm9tICd1dGlscy91dGlscyc7XG5pbXBvcnQge0dVSURFU19GSUxFX0ZPUk1BVH0gZnJvbSAnY29uc3RhbnRzL3VzZXItZ3VpZGVzJztcbmltcG9ydCBSZWFjdE1hcmtkb3duIGZyb20gJ3JlYWN0LW1hcmtkb3duJztcbi8vIEJyZWFrcG9pbnRzXG5pbXBvcnQge21lZGlhfSBmcm9tICdzdHlsZXMvbWVkaWEtYnJlYWtwb2ludHMnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlLCBpbmplY3RJbnRsfSBmcm9tICdyZWFjdC1pbnRsJztcblxuLy8gRmlsZS50eXBlIGlzIG5vdCByZWxpYWJsZSBpZiB0aGUgT1MgZG9lcyBub3QgaGF2ZSBhXG4vLyByZWdpc3RlcmVkIG1hcHBpbmcgZm9yIHRoZSBleHRlbnNpb24uXG4vLyBOT1RFOiBTaGFwZWZpbGVzIG11c3QgYmUgaW4gYSBjb21wcmVzc2VkIGZvcm1hdCBzaW5jZVxuLy8gaXQgcmVxdWlyZXMgbXVsdGlwbGUgZmlsZXMgdG8gYmUgcHJlc2VudC5cbmNvbnN0IGRlZmF1bHRWYWxpZEZpbGVFeHQgPSBbJ2NzdicsICdqc29uJywgJ2dlb2pzb24nXTtcblxuY29uc3QgZmlsZUljb25Db2xvciA9ICcjRDNEOEUwJztcblxuY29uc3QgTGlua1JlbmRlcmVyID0gcHJvcHMgPT4ge1xuICByZXR1cm4gKFxuICAgIDxhIGhyZWY9e3Byb3BzLmhyZWZ9IHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L2E+XG4gICk7XG59O1xuY29uc3QgU3R5bGVkVXBsb2FkTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckxUfTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuXG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgZm9udC1zaXplOiAxMnB4O1xuICBgfVxuYDtcblxuZXhwb3J0IGNvbnN0IFdhcm5pbmdNc2cgPSBzdHlsZWQuc3BhbmBcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZXJyb3JDb2xvcn07XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG5gO1xuXG5jb25zdCBQb3NpdGl2ZU1zZyA9IHN0eWxlZC5zcGFuYFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnByaW1hcnlCdG5BY3RCZ2R9O1xuICBmb250LXdlaWdodDogNTAwO1xuICBtYXJnaW4tcmlnaHQ6IDhweDtcbmA7XG5cbmNvbnN0IFN0eWxlZEZpbGVEcm9wID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXN0eWxlOiBkYXNoZWQ7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc3VidGV4dENvbG9yTFR9O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiA0OHB4IDhweCAwO1xuXG4gIC5maWxlLXVwbG9hZC1vciB7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGlua0J0bkNvbG9yfTtcbiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gIH1cblxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIHBhZGRpbmc6IDE2cHggNHB4IDA7XG4gIGB9O1xuYDtcblxuY29uc3QgTXNnV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1vZGFsVGl0bGVDb2xvcn07XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgaGVpZ2h0OiAzNnB4O1xuYDtcblxuY29uc3QgU3R5bGVkRHJhZ05Ecm9wSWNvbiA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke2ZpbGVJY29uQ29sb3J9O1xuICBtYXJnaW4tYm90dG9tOiA0OHB4O1xuXG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgYH07XG4gICR7bWVkaWEucGFsbWBcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIGB9O1xuYDtcblxuY29uc3QgU3R5bGVkRmlsZVR5cGVGb3cgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGB9O1xuICAke21lZGlhLnBhbG1gXG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZEZpbGVVcGxvYWQgPSBzdHlsZWQuZGl2YFxuICAuZmlsZS1kcm9wIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZE1lc3NhZ2UgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogMzJweDtcblxuICAubG9hZGluZy1hY3Rpb24ge1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgfVxuICAubG9hZGluZy1zcGlubmVyIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRHJhZ0ZpbGVXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogMzJweDtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICBgfTtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICBgfVxuYDtcblxuY29uc3QgU3R5bGVkRGlzY2xhaW1lciA9IHN0eWxlZChTdHlsZWRNZXNzYWdlKWBcbiAgbWFyZ2luOiAwIGF1dG87XG5gO1xuXG5mdW5jdGlvbiBGaWxlVXBsb2FkRmFjdG9yeSgpIHtcbiAgY2xhc3MgRmlsZVVwbG9hZCBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgIG9uRmlsZVVwbG9hZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHZhbGlkRmlsZUV4dDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gICAgICBmaWxlTG9hZGluZzogUHJvcFR5cGVzLmJvb2xcbiAgICB9O1xuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIHZhbGlkRmlsZUV4dDogZGVmYXVsdFZhbGlkRmlsZUV4dFxuICAgIH07XG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgIGRyYWdPdmVyOiBmYWxzZSxcbiAgICAgIGZpbGVMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGZpbGVzOiBbXSxcbiAgICAgIGVycm9yRmlsZXM6IFtdXG4gICAgfTtcblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgICBpZiAoc3RhdGUuZmlsZUxvYWRpbmcgJiYgcHJvcHMuZmlsZUxvYWRpbmcgPT09IGZhbHNlICYmIHN0YXRlLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpbGVzOiBbXSxcbiAgICAgICAgICBmaWxlTG9hZGluZzogcHJvcHMuZmlsZUxvYWRpbmdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVMb2FkaW5nOiBwcm9wcy5maWxlTG9hZGluZ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmcmFtZSA9IGNyZWF0ZVJlZigpO1xuXG4gICAgX2lzVmFsaWRGaWxlVHlwZSA9IGZpbGVuYW1lID0+IHtcbiAgICAgIGNvbnN0IHt2YWxpZEZpbGVFeHR9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IGZpbGVFeHQgPSB2YWxpZEZpbGVFeHQuZmluZChleHQgPT4gZmlsZW5hbWUuZW5kc1dpdGgoZXh0KSk7XG5cbiAgICAgIHJldHVybiBCb29sZWFuKGZpbGVFeHQpO1xuICAgIH07XG5cbiAgICBfaGFuZGxlRmlsZUlucHV0ID0gKGZpbGVzLCBlKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0U3RhdGUgPSB7ZmlsZXM6IFtdLCBlcnJvckZpbGVzOiBbXSwgZHJhZ092ZXI6IGZhbHNlfTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldO1xuXG4gICAgICAgIGlmIChmaWxlICYmIHRoaXMuX2lzVmFsaWRGaWxlVHlwZShmaWxlLm5hbWUpKSB7XG4gICAgICAgICAgbmV4dFN0YXRlLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFN0YXRlLmVycm9yRmlsZXMucHVzaChmaWxlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCAoKSA9PlxuICAgICAgICBuZXh0U3RhdGUuZmlsZXMubGVuZ3RoID8gdGhpcy5wcm9wcy5vbkZpbGVVcGxvYWQobmV4dFN0YXRlLmZpbGVzKSA6IG51bGxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIF90b2dnbGVEcmFnU3RhdGUgPSBuZXdTdGF0ZSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtkcmFnT3ZlcjogbmV3U3RhdGV9KTtcbiAgICB9O1xuXG4gICAgX3JlbmRlck1lc3NhZ2UoKSB7XG4gICAgICBjb25zdCB7ZXJyb3JGaWxlcywgZmlsZXN9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGlmIChlcnJvckZpbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxXYXJuaW5nTXNnPlxuICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgaWQ9eydmaWxlVXBsb2FkZXIuZmlsZW5Ob3RTdXBwb3J0ZWQnfVxuICAgICAgICAgICAgICB2YWx1ZXM9e3tlcnJvckZpbGVzOiBlcnJvckZpbGVzLmpvaW4oJywgJyl9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1dhcm5pbmdNc2c+XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZmlsZUxvYWRpbmcgJiYgZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPFN0eWxlZE1lc3NhZ2UgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRlcl9fbWVzc2FnZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsb2FkaW5nLWFjdGlvblwiPlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2ZpbGVVcGxvYWRlci51cGxvYWRpbmcnfSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICB7ZmlsZXMubWFwKChmLCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgPFBvc2l0aXZlTXNnIGtleT17aX0+e2YubmFtZX08L1Bvc2l0aXZlTXNnPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgLi4uXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGluZy1zcGlubmVyXCI+XG4gICAgICAgICAgICAgIDxMb2FkaW5nU3Bpbm5lciBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvU3R5bGVkTWVzc2FnZT5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2RyYWdPdmVyLCBmaWxlc30gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3Qge3ZhbGlkRmlsZUV4dCwgaW50bH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkRmlsZVVwbG9hZCBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZGVyXCIgcmVmPXt0aGlzLmZyYW1lfT5cbiAgICAgICAgICB7RmlsZURyb3AgPyAoXG4gICAgICAgICAgICA8RmlsZURyb3BcbiAgICAgICAgICAgICAgZnJhbWU9e3RoaXMuZnJhbWUuY3VycmVudCB8fCBkb2N1bWVudH1cbiAgICAgICAgICAgICAgb25EcmFnT3Zlcj17KCkgPT4gdGhpcy5fdG9nZ2xlRHJhZ1N0YXRlKHRydWUpfVxuICAgICAgICAgICAgICBvbkRyYWdMZWF2ZT17KCkgPT4gdGhpcy5fdG9nZ2xlRHJhZ1N0YXRlKGZhbHNlKX1cbiAgICAgICAgICAgICAgb25Ecm9wPXt0aGlzLl9oYW5kbGVGaWxlSW5wdXR9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkZXJfX2ZpbGUtZHJvcFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxTdHlsZWRVcGxvYWRNZXNzYWdlIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkX19tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPFJlYWN0TWFya2Rvd25cbiAgICAgICAgICAgICAgICAgIHNvdXJjZT17YCR7aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdmaWxlVXBsb2FkZXIuY29uZmlnVXBsb2FkTWVzc2FnZSdcbiAgICAgICAgICAgICAgICAgIH0pfSgke0dVSURFU19GSUxFX0ZPUk1BVH0pLmB9XG4gICAgICAgICAgICAgICAgICByZW5kZXJlcnM9e3tsaW5rOiBMaW5rUmVuZGVyZXJ9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvU3R5bGVkVXBsb2FkTWVzc2FnZT5cbiAgICAgICAgICAgICAgPFN0eWxlZEZpbGVEcm9wIGRyYWdPdmVyPXtkcmFnT3Zlcn0+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e29wYWNpdHk6IGRyYWdPdmVyID8gMC41IDogMX19PlxuICAgICAgICAgICAgICAgICAgPFN0eWxlZERyYWdORHJvcEljb24+XG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRGaWxlVHlwZUZvdyBjbGFzc05hbWU9XCJmaWxlLXR5cGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3ZhbGlkRmlsZUV4dC5tYXAoZXh0ID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWxlVHlwZSBrZXk9e2V4dH0gZXh0PXtleHR9IGhlaWdodD1cIjUwcHhcIiBmb250U2l6ZT1cIjlweFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkRmlsZVR5cGVGb3c+XG4gICAgICAgICAgICAgICAgICAgIDxEcmFnTkRyb3AgaGVpZ2h0PVwiNDRweFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZERyYWdORHJvcEljb24+XG4gICAgICAgICAgICAgICAgICA8ZGl2Pnt0aGlzLl9yZW5kZXJNZXNzYWdlKCl9PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgeyFmaWxlcy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgICAgICA8U3R5bGVkRHJhZ0ZpbGVXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICA8TXNnV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2ZpbGVVcGxvYWRlci5tZXNzYWdlJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9Nc2dXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZC1vclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLm9yJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8VXBsb2FkQnV0dG9uIG9uVXBsb2FkPXt0aGlzLl9oYW5kbGVGaWxlSW5wdXR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLmJyb3dzZUZpbGVzJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9VcGxvYWRCdXR0b24+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZERyYWdGaWxlV3JhcHBlcj5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8U3R5bGVkRGlzY2xhaW1lcj5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLmRpc2NsYWltZXInfSAvPlxuICAgICAgICAgICAgICAgIDwvU3R5bGVkRGlzY2xhaW1lcj5cbiAgICAgICAgICAgICAgPC9TdHlsZWRGaWxlRHJvcD5cbiAgICAgICAgICAgIDwvRmlsZURyb3A+XG4gICAgICAgICAgKSA6IG51bGx9XG5cbiAgICAgICAgICA8V2FybmluZ01zZz5cbiAgICAgICAgICAgIHtpc0Nocm9tZSgpID8gPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydmaWxlVXBsb2FkZXIuY2hyb21lTWVzc2FnZSd9IC8+IDogJyd9XG4gICAgICAgICAgPC9XYXJuaW5nTXNnPlxuICAgICAgICA8L1N0eWxlZEZpbGVVcGxvYWQ+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmplY3RJbnRsKEZpbGVVcGxvYWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlVXBsb2FkRmFjdG9yeTtcbmV4cG9ydCBjb25zdCBGaWxlVXBsb2FkID0gRmlsZVVwbG9hZEZhY3RvcnkoKTtcbiJdfQ==