kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
180 lines (179 loc) • 33.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.MapInfoPanel = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _imageModalContainer = _interopRequireDefault(require("./image-modal-container"));
var _flexContainer = require("../common/flex-container");
var _statusPanel = _interopRequireWildcard(require("./status-panel"));
var _providerSelect = require("./cloud-components/provider-select");
var _constants = require("@kepler.gl/constants");
var _styledComponents2 = require("../common/styled-components");
var _imagePreview = _interopRequireDefault(require("../common/image-preview"));
var _localization = require("@kepler.gl/localization");
var _modal = require("../common/modal");
var _useCloudListProvider2 = require("../hooks/use-cloud-list-provider");
var _templateObject, _templateObject2; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
var StyledSaveMapModal = _styledComponents["default"].div.attrs({
className: 'save-map-modal'
})(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .save-map-modal-content {\n min-height: 400px;\n flex-direction: column;\n }\n\n .description {\n width: 300px;\n }\n\n .image-preview-panel {\n width: 300px;\n\n .image-preview {\n padding: 0;\n }\n }\n\n .map-info-panel {\n flex-direction: column;\n }\n\n .save-map-modal-description {\n .modal-section-subtitle {\n margin-left: 6px;\n }\n }\n"])));
var StyledCompactExportSection = (0, _styledComponents["default"])(_styledComponents2.StyledExportSection)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 5px 0;\n"])));
var nop = function nop() {
return;
};
var TEXT_AREA_LIGHT_STYLE = {
resize: 'none'
};
var MapInfoPanel = exports.MapInfoPanel = function MapInfoPanel(_ref) {
var mapInfo = _ref.mapInfo,
characterLimits = _ref.characterLimits,
onChangeInput = _ref.onChangeInput;
var _mapInfo$description = mapInfo.description,
description = _mapInfo$description === void 0 ? '' : _mapInfo$description,
_mapInfo$title = mapInfo.title,
title = _mapInfo$title === void 0 ? '' : _mapInfo$title;
return /*#__PURE__*/_react["default"].createElement("div", {
className: "selection map-info-panel",
"data-testid": _constants.dataTestIds.providerMapInfoPanel
}, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalSection, {
className: "save-map-modal-name"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "modal-section-title"
}, "Name*"), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.InputLight, {
id: "map-title",
type: "text",
value: title,
onChange: function onChange(e) {
return onChangeInput('title', e);
},
placeholder: "Type map title"
}))), /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalSection, null, /*#__PURE__*/_react["default"].createElement(_flexContainer.FlexContainer, {
className: "save-map-modal-description"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "modal-section-title"
}, "Description"), /*#__PURE__*/_react["default"].createElement("div", {
className: "modal-section-subtitle"
}, "(optional)")), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.TextAreaLight, {
rows: 3,
id: "map-description",
style: TEXT_AREA_LIGHT_STYLE,
value: description,
onChange: function onChange(e) {
return onChangeInput('description', e);
},
placeholder: "Type map description"
})), /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalInputFootnote, {
error: Boolean(characterLimits === null || characterLimits === void 0 ? void 0 : characterLimits.description) && description.length > Number(characterLimits === null || characterLimits === void 0 ? void 0 : characterLimits.description)
}, description.length, "/", (characterLimits === null || characterLimits === void 0 ? void 0 : characterLimits.description) || _constants.MAP_INFO_CHARACTER.description, ' ', "characters")));
};
var SaveMapHeader = function SaveMapHeader(_ref2) {
var cloudProviders = _ref2.cloudProviders;
return /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledExportSection, null, /*#__PURE__*/_react["default"].createElement("div", {
className: "description"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "title"
}, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: 'modal.saveMap.title'
})), /*#__PURE__*/_react["default"].createElement("div", {
className: "subtitle"
}, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: 'modal.saveMap.subtitle'
}))), /*#__PURE__*/_react["default"].createElement(_providerSelect.ProviderSelect, {
cloudProviders: cloudProviders
}));
};
var STYLED_EXPORT_SECTION_STYLE = {
margin: '2px 0'
};
var PROVIDER_MANAGER_URL_STYLE = {
textDecoration: 'underline'
};
function SaveMapModalFactory() {
var SaveMapModal = function SaveMapModal(_ref3) {
var mapInfo = _ref3.mapInfo,
exportImage = _ref3.exportImage,
_ref3$characterLimits = _ref3.characterLimits,
characterLimits = _ref3$characterLimits === void 0 ? _constants.MAP_INFO_CHARACTER : _ref3$characterLimits,
isProviderLoading = _ref3.isProviderLoading,
providerError = _ref3.providerError,
_ref3$onUpdateImageSe = _ref3.onUpdateImageSetting,
onUpdateImageSetting = _ref3$onUpdateImageSe === void 0 ? nop : _ref3$onUpdateImageSe,
cleanupExportImage = _ref3.cleanupExportImage,
onSetMapInfo = _ref3.onSetMapInfo,
onCancel = _ref3.onCancel,
onConfirm = _ref3.onConfirm;
var _useCloudListProvider = (0, _useCloudListProvider2.useCloudListProvider)(),
provider = _useCloudListProvider.provider,
cloudProviders = _useCloudListProvider.cloudProviders;
var onChangeInput = function onChangeInput(key, _ref4) {
var value = _ref4.target.value;
onSetMapInfo((0, _defineProperty2["default"])({}, key, value));
};
var confirmButton = (0, _react.useMemo)(function () {
return {
large: true,
disabled: Boolean(!(provider && mapInfo.title)),
children: 'modal.button.save'
};
}, [provider, mapInfo]);
var confirm = (0, _react.useCallback)(function () {
if (provider) {
onConfirm(provider);
}
}, [onConfirm, provider]);
return /*#__PURE__*/_react["default"].createElement(_imageModalContainer["default"], {
provider: provider,
onUpdateImageSetting: onUpdateImageSetting,
cleanupExportImage: cleanupExportImage
}, /*#__PURE__*/_react["default"].createElement(StyledSaveMapModal, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalContent, {
className: "save-map-modal-content"
}, /*#__PURE__*/_react["default"].createElement(SaveMapHeader, {
cloudProviders: cloudProviders
}), provider && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, provider.getManagementUrl ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledExportSection, {
style: STYLED_EXPORT_SECTION_STYLE
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "selection"
}, /*#__PURE__*/_react["default"].createElement("a", {
key: 1,
href: provider.getManagementUrl(),
target: "_blank",
rel: "noopener noreferrer",
style: PROVIDER_MANAGER_URL_STYLE
}, "Go to your Kepler.gl ", provider.displayName, " page"))) : null, /*#__PURE__*/_react["default"].createElement(StyledCompactExportSection, null, /*#__PURE__*/_react["default"].createElement("div", {
className: "description image-preview-panel"
}, /*#__PURE__*/_react["default"].createElement(_imagePreview["default"], {
exportImage: exportImage,
width: _constants.MAP_THUMBNAIL_DIMENSION.width,
showDimension: false
})), isProviderLoading ? /*#__PURE__*/_react["default"].createElement("div", {
"data-testid": _constants.dataTestIds.providerLoading,
className: "selection map-saving-animation"
}, /*#__PURE__*/_react["default"].createElement(_statusPanel.UploadAnimation, {
icon: provider && provider.icon
})) : /*#__PURE__*/_react["default"].createElement(MapInfoPanel, {
mapInfo: mapInfo,
characterLimits: characterLimits,
onChangeInput: onChangeInput
}))), providerError ? /*#__PURE__*/_react["default"].createElement(_statusPanel["default"], {
isLoading: false,
error: providerError.message,
providerIcon: provider && provider.icon
}) : null)), /*#__PURE__*/_react["default"].createElement(_modal.ModalFooter, {
cancel: onCancel,
confirm: confirm,
confirmButton: confirmButton
}));
};
return SaveMapModal;
}
var _default = exports["default"] = SaveMapModalFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfaW1hZ2VNb2RhbENvbnRhaW5lciIsIl9mbGV4Q29udGFpbmVyIiwiX3N0YXR1c1BhbmVsIiwiX3Byb3ZpZGVyU2VsZWN0IiwiX2NvbnN0YW50cyIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9pbWFnZVByZXZpZXciLCJfbG9jYWxpemF0aW9uIiwiX21vZGFsIiwiX3VzZUNsb3VkTGlzdFByb3ZpZGVyMiIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJTdHlsZWRTYXZlTWFwTW9kYWwiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiU3R5bGVkQ29tcGFjdEV4cG9ydFNlY3Rpb24iLCJTdHlsZWRFeHBvcnRTZWN0aW9uIiwibm9wIiwiVEVYVF9BUkVBX0xJR0hUX1NUWUxFIiwicmVzaXplIiwiTWFwSW5mb1BhbmVsIiwiZXhwb3J0cyIsIl9yZWYiLCJtYXBJbmZvIiwiY2hhcmFjdGVyTGltaXRzIiwib25DaGFuZ2VJbnB1dCIsIl9tYXBJbmZvJGRlc2NyaXB0aW9uIiwiZGVzY3JpcHRpb24iLCJfbWFwSW5mbyR0aXRsZSIsInRpdGxlIiwiY3JlYXRlRWxlbWVudCIsImRhdGFUZXN0SWRzIiwicHJvdmlkZXJNYXBJbmZvUGFuZWwiLCJTdHlsZWRNb2RhbFNlY3Rpb24iLCJJbnB1dExpZ2h0IiwiaWQiLCJ0eXBlIiwidmFsdWUiLCJvbkNoYW5nZSIsInBsYWNlaG9sZGVyIiwiRmxleENvbnRhaW5lciIsIlRleHRBcmVhTGlnaHQiLCJyb3dzIiwic3R5bGUiLCJTdHlsZWRNb2RhbElucHV0Rm9vdG5vdGUiLCJlcnJvciIsIkJvb2xlYW4iLCJsZW5ndGgiLCJOdW1iZXIiLCJNQVBfSU5GT19DSEFSQUNURVIiLCJTYXZlTWFwSGVhZGVyIiwiX3JlZjIiLCJjbG91ZFByb3ZpZGVycyIsIkZvcm1hdHRlZE1lc3NhZ2UiLCJQcm92aWRlclNlbGVjdCIsIlNUWUxFRF9FWFBPUlRfU0VDVElPTl9TVFlMRSIsIm1hcmdpbiIsIlBST1ZJREVSX01BTkFHRVJfVVJMX1NUWUxFIiwidGV4dERlY29yYXRpb24iLCJTYXZlTWFwTW9kYWxGYWN0b3J5IiwiU2F2ZU1hcE1vZGFsIiwiX3JlZjMiLCJleHBvcnRJbWFnZSIsIl9yZWYzJGNoYXJhY3RlckxpbWl0cyIsImlzUHJvdmlkZXJMb2FkaW5nIiwicHJvdmlkZXJFcnJvciIsIl9yZWYzJG9uVXBkYXRlSW1hZ2VTZSIsIm9uVXBkYXRlSW1hZ2VTZXR0aW5nIiwiY2xlYW51cEV4cG9ydEltYWdlIiwib25TZXRNYXBJbmZvIiwib25DYW5jZWwiLCJvbkNvbmZpcm0iLCJfdXNlQ2xvdWRMaXN0UHJvdmlkZXIiLCJ1c2VDbG91ZExpc3RQcm92aWRlciIsInByb3ZpZGVyIiwia2V5IiwiX3JlZjQiLCJ0YXJnZXQiLCJfZGVmaW5lUHJvcGVydHkyIiwiY29uZmlybUJ1dHRvbiIsInVzZU1lbW8iLCJsYXJnZSIsImRpc2FibGVkIiwiY2hpbGRyZW4iLCJjb25maXJtIiwidXNlQ2FsbGJhY2siLCJTdHlsZWRNb2RhbENvbnRlbnQiLCJGcmFnbWVudCIsImdldE1hbmFnZW1lbnRVcmwiLCJocmVmIiwicmVsIiwiZGlzcGxheU5hbWUiLCJ3aWR0aCIsIk1BUF9USFVNQk5BSUxfRElNRU5TSU9OIiwic2hvd0RpbWVuc2lvbiIsInByb3ZpZGVyTG9hZGluZyIsIlVwbG9hZEFuaW1hdGlvbiIsImljb24iLCJpc0xvYWRpbmciLCJtZXNzYWdlIiwicHJvdmlkZXJJY29uIiwiTW9kYWxGb290ZXIiLCJjYW5jZWwiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RhbHMvc2F2ZS1tYXAtbW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBJbWFnZU1vZGFsQ29udGFpbmVyLCB7SW1hZ2VNb2RhbENvbnRhaW5lclByb3BzfSBmcm9tICcuL2ltYWdlLW1vZGFsLWNvbnRhaW5lcic7XG5pbXBvcnQge0ZsZXhDb250YWluZXJ9IGZyb20gJy4uL2NvbW1vbi9mbGV4LWNvbnRhaW5lcic7XG5pbXBvcnQgU3RhdHVzUGFuZWwsIHtVcGxvYWRBbmltYXRpb259IGZyb20gJy4vc3RhdHVzLXBhbmVsJztcbmltcG9ydCB7UHJvdmlkZXJTZWxlY3R9IGZyb20gJy4vY2xvdWQtY29tcG9uZW50cy9wcm92aWRlci1zZWxlY3QnO1xuaW1wb3J0IHtcbiAgTUFQX1RIVU1CTkFJTF9ESU1FTlNJT04sXG4gIE1BUF9JTkZPX0NIQVJBQ1RFUixcbiAgRXhwb3J0SW1hZ2UsXG4gIGRhdGFUZXN0SWRzXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgU3R5bGVkTW9kYWxDb250ZW50LFxuICBJbnB1dExpZ2h0LFxuICBUZXh0QXJlYUxpZ2h0LFxuICBTdHlsZWRFeHBvcnRTZWN0aW9uLFxuICBTdHlsZWRNb2RhbFNlY3Rpb24sXG4gIFN0eWxlZE1vZGFsSW5wdXRGb290bm90ZVxufSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IEltYWdlUHJldmlldyBmcm9tICcuLi9jb21tb24vaW1hZ2UtcHJldmlldyc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7TWFwSW5mb30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tICdAa2VwbGVyLmdsL2Nsb3VkLXByb3ZpZGVycyc7XG5pbXBvcnQge3NldE1hcEluZm8sIGNsZWFudXBFeHBvcnRJbWFnZSBhcyBjbGVhbnVwRXhwb3J0SW1hZ2VBY3Rpb259IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge01vZGFsRm9vdGVyfSBmcm9tICcuLi9jb21tb24vbW9kYWwnO1xuaW1wb3J0IHt1c2VDbG91ZExpc3RQcm92aWRlcn0gZnJvbSAnLi4vaG9va3MvdXNlLWNsb3VkLWxpc3QtcHJvdmlkZXInO1xuXG5jb25zdCBTdHlsZWRTYXZlTWFwTW9kYWwgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2F2ZS1tYXAtbW9kYWwnXG59KWBcbiAgLnNhdmUtbWFwLW1vZGFsLWNvbnRlbnQge1xuICAgIG1pbi1oZWlnaHQ6IDQwMHB4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIH1cblxuICAuZGVzY3JpcHRpb24ge1xuICAgIHdpZHRoOiAzMDBweDtcbiAgfVxuXG4gIC5pbWFnZS1wcmV2aWV3LXBhbmVsIHtcbiAgICB3aWR0aDogMzAwcHg7XG5cbiAgICAuaW1hZ2UtcHJldmlldyB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgIH1cbiAgfVxuXG4gIC5tYXAtaW5mby1wYW5lbCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuXG4gIC5zYXZlLW1hcC1tb2RhbC1kZXNjcmlwdGlvbiB7XG4gICAgLm1vZGFsLXNlY3Rpb24tc3VidGl0bGUge1xuICAgICAgbWFyZ2luLWxlZnQ6IDZweDtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZENvbXBhY3RFeHBvcnRTZWN0aW9uID0gc3R5bGVkKFN0eWxlZEV4cG9ydFNlY3Rpb24pYFxuICBtYXJnaW46IDVweCAwO1xuYDtcblxuY29uc3Qgbm9wID0gKCkgPT4ge1xuICByZXR1cm47XG59O1xuY29uc3QgVEVYVF9BUkVBX0xJR0hUX1NUWUxFID0ge3Jlc2l6ZTogJ25vbmUnfTtcblxudHlwZSBDaGFyYWN0ZXJMaW1pdHMgPSB7XG4gIHRpdGxlPzogbnVtYmVyO1xuICBkZXNjcmlwdGlvbj86IG51bWJlcjtcbn07XG5cbnR5cGUgU2F2ZU1hcE1vZGFsUHJvcHMgPSB7XG4gIG1hcEluZm86IE1hcEluZm87XG4gIGV4cG9ydEltYWdlOiBFeHBvcnRJbWFnZTtcbiAgaXNQcm92aWRlckxvYWRpbmc6IGJvb2xlYW47XG4gIHByb3ZpZGVyRXJyb3I/OiBFcnJvcjtcbiAgY2hhcmFjdGVyTGltaXRzPzogQ2hhcmFjdGVyTGltaXRzO1xuXG4gIC8vIGNhbGxiYWNrc1xuICBvblVwZGF0ZUltYWdlU2V0dGluZzogSW1hZ2VNb2RhbENvbnRhaW5lclByb3BzWydvblVwZGF0ZUltYWdlU2V0dGluZyddO1xuICBjbGVhbnVwRXhwb3J0SW1hZ2U6IHR5cGVvZiBjbGVhbnVwRXhwb3J0SW1hZ2VBY3Rpb247XG4gIG9uU2V0TWFwSW5mbzogdHlwZW9mIHNldE1hcEluZm87XG4gIG9uQ29uZmlybTogKHByb3ZpZGVyOiBQcm92aWRlcikgPT4gdm9pZDtcbiAgb25DYW5jZWw6ICgpID0+IHZvaWQ7XG59O1xuXG50eXBlIE1hcEluZm9QYW5lbFByb3BzID0gUGljazxTYXZlTWFwTW9kYWxQcm9wcywgJ21hcEluZm8nIHwgJ2NoYXJhY3RlckxpbWl0cyc+ICYge1xuICBvbkNoYW5nZUlucHV0OiAoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50IHwgSFRNTElucHV0RWxlbWVudD5cbiAgKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNvbnN0IE1hcEluZm9QYW5lbDogUmVhY3QuRkM8TWFwSW5mb1BhbmVsUHJvcHM+ID0gKHtcbiAgbWFwSW5mbyxcbiAgY2hhcmFjdGVyTGltaXRzLFxuICBvbkNoYW5nZUlucHV0XG59KSA9PiB7XG4gIGNvbnN0IHtkZXNjcmlwdGlvbiA9ICcnLCB0aXRsZSA9ICcnfSA9IG1hcEluZm87XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJzZWxlY3Rpb24gbWFwLWluZm8tcGFuZWxcIiBkYXRhLXRlc3RpZD17ZGF0YVRlc3RJZHMucHJvdmlkZXJNYXBJbmZvUGFuZWx9PlxuICAgICAgPFN0eWxlZE1vZGFsU2VjdGlvbiBjbGFzc05hbWU9XCJzYXZlLW1hcC1tb2RhbC1uYW1lXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtc2VjdGlvbi10aXRsZVwiPk5hbWUqPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICAgIGlkPVwibWFwLXRpdGxlXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIHZhbHVlPXt0aXRsZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IG9uQ2hhbmdlSW5wdXQoJ3RpdGxlJywgZSl9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgbWFwIHRpdGxlXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvU3R5bGVkTW9kYWxTZWN0aW9uPlxuICAgICAgPFN0eWxlZE1vZGFsU2VjdGlvbj5cbiAgICAgICAgPEZsZXhDb250YWluZXIgY2xhc3NOYW1lPVwic2F2ZS1tYXAtbW9kYWwtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tdGl0bGVcIj5EZXNjcmlwdGlvbjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtc2VjdGlvbi1zdWJ0aXRsZVwiPihvcHRpb25hbCk8L2Rpdj5cbiAgICAgICAgPC9GbGV4Q29udGFpbmVyPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxUZXh0QXJlYUxpZ2h0XG4gICAgICAgICAgICByb3dzPXszfVxuICAgICAgICAgICAgaWQ9XCJtYXAtZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgc3R5bGU9e1RFWFRfQVJFQV9MSUdIVF9TVFlMRSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzfVxuICAgICAgICAgICAgdmFsdWU9e2Rlc2NyaXB0aW9ufVxuICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gb25DaGFuZ2VJbnB1dCgnZGVzY3JpcHRpb24nLCBlKX1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBtYXAgZGVzY3JpcHRpb25cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8U3R5bGVkTW9kYWxJbnB1dEZvb3Rub3RlXG4gICAgICAgICAgZXJyb3I9e1xuICAgICAgICAgICAgQm9vbGVhbihjaGFyYWN0ZXJMaW1pdHM/LmRlc2NyaXB0aW9uKSAmJlxuICAgICAgICAgICAgZGVzY3JpcHRpb24ubGVuZ3RoID4gTnVtYmVyKGNoYXJhY3RlckxpbWl0cz8uZGVzY3JpcHRpb24pXG4gICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAge2Rlc2NyaXB0aW9uLmxlbmd0aH0ve2NoYXJhY3RlckxpbWl0cz8uZGVzY3JpcHRpb24gfHwgTUFQX0lORk9fQ0hBUkFDVEVSLmRlc2NyaXB0aW9ufXsnICd9XG4gICAgICAgICAgY2hhcmFjdGVyc1xuICAgICAgICA8L1N0eWxlZE1vZGFsSW5wdXRGb290bm90ZT5cbiAgICAgIDwvU3R5bGVkTW9kYWxTZWN0aW9uPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuY29uc3QgU2F2ZU1hcEhlYWRlciA9ICh7Y2xvdWRQcm92aWRlcnN9KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFN0eWxlZEV4cG9ydFNlY3Rpb24+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLnNhdmVNYXAudGl0bGUnfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnbW9kYWwuc2F2ZU1hcC5zdWJ0aXRsZSd9IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8UHJvdmlkZXJTZWxlY3QgY2xvdWRQcm92aWRlcnM9e2Nsb3VkUHJvdmlkZXJzfSAvPlxuICAgIDwvU3R5bGVkRXhwb3J0U2VjdGlvbj5cbiAgKTtcbn07XG5cbmNvbnN0IFNUWUxFRF9FWFBPUlRfU0VDVElPTl9TVFlMRSA9IHttYXJnaW46ICcycHggMCd9O1xuY29uc3QgUFJPVklERVJfTUFOQUdFUl9VUkxfU1RZTEUgPSB7dGV4dERlY29yYXRpb246ICd1bmRlcmxpbmUnfTtcblxuZnVuY3Rpb24gU2F2ZU1hcE1vZGFsRmFjdG9yeSgpIHtcbiAgY29uc3QgU2F2ZU1hcE1vZGFsOiBSZWFjdC5GQzxTYXZlTWFwTW9kYWxQcm9wcz4gPSAoe1xuICAgIG1hcEluZm8sXG4gICAgZXhwb3J0SW1hZ2UsXG4gICAgY2hhcmFjdGVyTGltaXRzID0gTUFQX0lORk9fQ0hBUkFDVEVSLFxuICAgIGlzUHJvdmlkZXJMb2FkaW5nLFxuICAgIHByb3ZpZGVyRXJyb3IsXG4gICAgb25VcGRhdGVJbWFnZVNldHRpbmcgPSBub3AsXG4gICAgY2xlYW51cEV4cG9ydEltYWdlLFxuICAgIG9uU2V0TWFwSW5mbyxcbiAgICBvbkNhbmNlbCxcbiAgICBvbkNvbmZpcm1cbiAgfSkgPT4ge1xuICAgIGNvbnN0IHtwcm92aWRlciwgY2xvdWRQcm92aWRlcnN9ID0gdXNlQ2xvdWRMaXN0UHJvdmlkZXIoKTtcblxuICAgIGNvbnN0IG9uQ2hhbmdlSW5wdXQgPSAoXG4gICAgICBrZXk6IHN0cmluZyxcbiAgICAgIHt0YXJnZXQ6IHt2YWx1ZX19OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50IHwgSFRNTElucHV0RWxlbWVudD5cbiAgICApID0+IHtcbiAgICAgIG9uU2V0TWFwSW5mbyh7W2tleV06IHZhbHVlfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbmZpcm1CdXR0b24gPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgbGFyZ2U6IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiBCb29sZWFuKCEocHJvdmlkZXIgJiYgbWFwSW5mby50aXRsZSkpLFxuICAgICAgICBjaGlsZHJlbjogJ21vZGFsLmJ1dHRvbi5zYXZlJ1xuICAgICAgfSksXG4gICAgICBbcHJvdmlkZXIsIG1hcEluZm9dXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbmZpcm0gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBpZiAocHJvdmlkZXIpIHtcbiAgICAgICAgb25Db25maXJtKHByb3ZpZGVyKTtcbiAgICAgIH1cbiAgICB9LCBbb25Db25maXJtLCBwcm92aWRlcl0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxJbWFnZU1vZGFsQ29udGFpbmVyXG4gICAgICAgIHByb3ZpZGVyPXtwcm92aWRlcn1cbiAgICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmc9e29uVXBkYXRlSW1hZ2VTZXR0aW5nfVxuICAgICAgICBjbGVhbnVwRXhwb3J0SW1hZ2U9e2NsZWFudXBFeHBvcnRJbWFnZX1cbiAgICAgID5cbiAgICAgICAgPFN0eWxlZFNhdmVNYXBNb2RhbD5cbiAgICAgICAgICA8U3R5bGVkTW9kYWxDb250ZW50IGNsYXNzTmFtZT1cInNhdmUtbWFwLW1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxTYXZlTWFwSGVhZGVyIGNsb3VkUHJvdmlkZXJzPXtjbG91ZFByb3ZpZGVyc30gLz5cbiAgICAgICAgICAgIHtwcm92aWRlciAmJiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAge3Byb3ZpZGVyLmdldE1hbmFnZW1lbnRVcmwgPyAoXG4gICAgICAgICAgICAgICAgICA8U3R5bGVkRXhwb3J0U2VjdGlvbiBzdHlsZT17U1RZTEVEX0VYUE9SVF9TRUNUSU9OX1NUWUxFfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXsxfVxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17cHJvdmlkZXIuZ2V0TWFuYWdlbWVudFVybCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e1BST1ZJREVSX01BTkFHRVJfVVJMX1NUWUxFfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEdvIHRvIHlvdXIgS2VwbGVyLmdsIHtwcm92aWRlci5kaXNwbGF5TmFtZX0gcGFnZVxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZEV4cG9ydFNlY3Rpb24+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgPFN0eWxlZENvbXBhY3RFeHBvcnRTZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkZXNjcmlwdGlvbiBpbWFnZS1wcmV2aWV3LXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbWFnZVByZXZpZXdcbiAgICAgICAgICAgICAgICAgICAgICBleHBvcnRJbWFnZT17ZXhwb3J0SW1hZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9e01BUF9USFVNQk5BSUxfRElNRU5TSU9OLndpZHRofVxuICAgICAgICAgICAgICAgICAgICAgIHNob3dEaW1lbnNpb249e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7aXNQcm92aWRlckxvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD17ZGF0YVRlc3RJZHMucHJvdmlkZXJMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNlbGVjdGlvbiBtYXAtc2F2aW5nLWFuaW1hdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8VXBsb2FkQW5pbWF0aW9uIGljb249e3Byb3ZpZGVyICYmIHByb3ZpZGVyLmljb259IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPE1hcEluZm9QYW5lbFxuICAgICAgICAgICAgICAgICAgICAgIG1hcEluZm89e21hcEluZm99XG4gICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyTGltaXRzPXtjaGFyYWN0ZXJMaW1pdHN9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2VJbnB1dD17b25DaGFuZ2VJbnB1dH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRDb21wYWN0RXhwb3J0U2VjdGlvbj5cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3Byb3ZpZGVyRXJyb3IgPyAoXG4gICAgICAgICAgICAgIDxTdGF0dXNQYW5lbFxuICAgICAgICAgICAgICAgIGlzTG9hZGluZz17ZmFsc2V9XG4gICAgICAgICAgICAgICAgZXJyb3I9e3Byb3ZpZGVyRXJyb3IubWVzc2FnZX1cbiAgICAgICAgICAgICAgICBwcm92aWRlckljb249e3Byb3ZpZGVyICYmIHByb3ZpZGVyLmljb259XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L1N0eWxlZE1vZGFsQ29udGVudD5cbiAgICAgICAgPC9TdHlsZWRTYXZlTWFwTW9kYWw+XG4gICAgICAgIDxNb2RhbEZvb3RlciBjYW5jZWw9e29uQ2FuY2VsfSBjb25maXJtPXtjb25maXJtfSBjb25maXJtQnV0dG9uPXtjb25maXJtQnV0dG9ufSAvPlxuICAgICAgPC9JbWFnZU1vZGFsQ29udGFpbmVyPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFNhdmVNYXBNb2RhbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU2F2ZU1hcE1vZGFsRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxvQkFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksY0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssWUFBQSxHQUFBTix1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sZUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FBT0EsSUFBQVEsa0JBQUEsR0FBQVIsT0FBQTtBQVFBLElBQUFTLGFBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFVLGFBQUEsR0FBQVYsT0FBQTtBQUlBLElBQUFXLE1BQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLHNCQUFBLEdBQUFaLE9BQUE7QUFBc0UsSUFBQWEsZUFBQSxFQUFBQyxnQkFBQSxF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