kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
242 lines (209 loc) • 33.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = SidePanelFactory;
exports.StyledSidePanelContent = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _localization = require("../localization");
var _defaultSettings = require("../constants/default-settings");
var _sideBar = _interopRequireDefault(require("./side-panel/side-bar"));
var _panelHeader = _interopRequireDefault(require("./side-panel/panel-header"));
var _panelToggle = _interopRequireDefault(require("./side-panel/panel-toggle"));
var _layerManager = _interopRequireDefault(require("./side-panel/layer-manager"));
var _filterManager = _interopRequireDefault(require("./side-panel/filter-manager"));
var _interactionManager = _interopRequireDefault(require("./side-panel/interaction-manager"));
var _mapManager = _interopRequireDefault(require("./side-panel/map-manager"));
var _customPanel = _interopRequireDefault(require("./side-panel/custom-panel"));
var _panelTitle = _interopRequireDefault(require("./side-panel/panel-title"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _lodash = _interopRequireDefault(require("lodash.get"));
var _templateObject;
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var StyledSidePanelContent = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n flex-grow: 1;\n padding: ", "px;\n overflow-y: scroll;\n overflow-x: hidden;\n\n .side-panel__content__inner {\n display: flex;\n height: 100%;\n flex-direction: column;\n }\n"])), function (props) {
return props.theme.sidePanelScrollBar;
}, function (props) {
return props.theme.sidePanelInnerPadding;
});
exports.StyledSidePanelContent = StyledSidePanelContent;
SidePanelFactory.deps = [_sideBar["default"], _panelHeader["default"], _panelToggle["default"], _panelTitle["default"], _layerManager["default"], _filterManager["default"], _interactionManager["default"], _mapManager["default"], _customPanel["default"]];
/**
* Vertical sidebar containing input components for the rendering layers
*/
function SidePanelFactory(Sidebar, PanelHeader, PanelToggle, PanelTitle, LayerManager, FilterManager, InteractionManager, MapManager, CustomPanels) {
// inject components
var SIDEBAR_COMPONENTS = {
layer: LayerManager,
filter: FilterManager,
interaction: InteractionManager,
map: MapManager
}; // We should defined sidebar panels here but keeping them for backward compatible
var fullPanels = _defaultSettings.SIDEBAR_PANELS.map(function (component) {
return _objectSpread(_objectSpread({}, component), {}, {
component: SIDEBAR_COMPONENTS[component.id]
});
});
var getCustomPanelProps = (0, _lodash["default"])(CustomPanels, ['defaultProps', 'getProps']) || function () {
return {};
};
/** @type {typeof import('./side-panel').SidePanel} */
// eslint-disable-next-line max-statements
var SidePanel = function SidePanel(props) {
var appName = props.appName,
appWebsite = props.appWebsite,
availableProviders = props.availableProviders,
datasets = props.datasets,
filters = props.filters,
layers = props.layers,
layerBlending = props.layerBlending,
layerClasses = props.layerClasses,
layerOrder = props.layerOrder,
interactionConfig = props.interactionConfig,
panels = props.panels,
mapInfo = props.mapInfo,
mapSaved = props.mapSaved,
mapStateActions = props.mapStateActions,
mapStyle = props.mapStyle,
mapStyleActions = props.mapStyleActions,
onSaveMap = props.onSaveMap,
uiState = props.uiState,
uiStateActions = props.uiStateActions,
visStateActions = props.visStateActions,
version = props.version,
width = props.width;
var openDeleteModal = uiStateActions.openDeleteModal,
toggleModal = uiStateActions.toggleModal,
toggleSidePanel = uiStateActions.toggleSidePanel;
var activeSidePanel = uiState.activeSidePanel;
var setMapInfo = visStateActions.setMapInfo,
showDatasetTable = visStateActions.showDatasetTable;
var hasShare = availableProviders.hasShare,
hasStorage = availableProviders.hasStorage;
var title = mapInfo.title;
var isOpen = Boolean(activeSidePanel);
var _onOpenOrClose = (0, _react.useCallback)(function () {
return toggleSidePanel(activeSidePanel ? null : 'layer');
}, [activeSidePanel, toggleSidePanel]);
var onClickExportImage = (0, _react.useCallback)(function () {
return toggleModal(_defaultSettings.EXPORT_IMAGE_ID);
}, [toggleModal]);
var onClickExportData = (0, _react.useCallback)(function () {
return toggleModal(_defaultSettings.EXPORT_DATA_ID);
}, [toggleModal]);
var onClickExportMap = (0, _react.useCallback)(function () {
return toggleModal(_defaultSettings.EXPORT_MAP_ID);
}, [toggleModal]);
var onClickSaveToStorage = (0, _react.useCallback)(function () {
return toggleModal(mapSaved ? _defaultSettings.OVERWRITE_MAP_ID : _defaultSettings.SAVE_MAP_ID);
}, [mapSaved, toggleModal]);
var onClickSaveAsToStorage = (0, _react.useCallback)(function () {
setMapInfo({
title: "".concat(title || 'Kepler.gl', " (Copy)")
});
toggleModal(_defaultSettings.SAVE_MAP_ID);
}, [title, setMapInfo, toggleModal]);
var onClickShareMap = (0, _react.useCallback)(function () {
return toggleModal(_defaultSettings.SHARE_MAP_ID);
}, [toggleModal]);
var onShowDatasetTable = (0, _react.useCallback)(function (dataId) {
return showDatasetTable(dataId);
}, [showDatasetTable]);
var onShowAddDataModal = (0, _react.useCallback)(function () {
return toggleModal(_defaultSettings.ADD_DATA_ID);
}, [toggleModal]);
var onShowAddMapStyleModal = (0, _react.useCallback)(function () {
return toggleModal(_defaultSettings.ADD_MAP_STYLE_ID);
}, [toggleModal]);
var onRemoveDataset = (0, _react.useCallback)(function (dataId) {
return openDeleteModal(dataId);
}, [openDeleteModal]);
var onSaveToStorage = (0, _react.useMemo)(function () {
return hasStorage ? onClickSaveToStorage : null;
}, [hasStorage, onClickSaveToStorage]);
var onSaveAsToStorage = (0, _react.useMemo)(function () {
return hasStorage && mapSaved ? onClickSaveAsToStorage : null;
}, [hasStorage, mapSaved, onClickSaveAsToStorage]);
var currentPanel = (0, _react.useMemo)(function () {
return panels.find(function (_ref) {
var id = _ref.id;
return id === activeSidePanel;
}) || {};
}, [activeSidePanel, panels]);
var onShareMap = (0, _react.useMemo)(function () {
return hasShare ? onClickShareMap : null;
}, [hasShare, onClickShareMap]);
var customPanelProps = (0, _react.useMemo)(function () {
return getCustomPanelProps(props);
}, [props]);
var PanelComponent = currentPanel.component;
return /*#__PURE__*/_react["default"].createElement(Sidebar, {
width: width,
isOpen: isOpen,
minifiedWidth: 0,
onOpenOrClose: _onOpenOrClose
}, /*#__PURE__*/_react["default"].createElement(PanelHeader, {
appName: appName,
version: version,
appWebsite: appWebsite,
visibleDropdown: uiState.visibleDropdown,
showExportDropdown: uiStateActions.showExportDropdown,
hideExportDropdown: uiStateActions.hideExportDropdown,
onExportImage: onClickExportImage,
onExportData: onClickExportData,
onExportMap: onClickExportMap,
onSaveMap: onSaveMap,
onSaveToStorage: onSaveToStorage,
onSaveAsToStorage: onSaveAsToStorage,
onShareMap: onShareMap
}), /*#__PURE__*/_react["default"].createElement(PanelToggle, {
panels: panels,
activePanel: activeSidePanel,
togglePanel: uiStateActions.toggleSidePanel
}), /*#__PURE__*/_react["default"].createElement(StyledSidePanelContent, {
className: "side-panel__content"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "side-panel__content__inner"
}, /*#__PURE__*/_react["default"].createElement(PanelTitle, {
className: "side-panel__content__title"
}, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: currentPanel.label
})), PanelComponent ? /*#__PURE__*/_react["default"].createElement(PanelComponent, {
datasets: datasets,
filters: filters,
layers: layers,
layerClasses: layerClasses,
layerOrder: layerOrder,
layerBlending: layerBlending,
mapStyle: mapStyle,
mapStyleActions: mapStyleActions,
mapStateActions: mapStateActions,
interactionConfig: interactionConfig,
removeDataset: onRemoveDataset,
showDatasetTable: onShowDatasetTable,
showAddDataModal: onShowAddDataModal,
showAddMapStyleModal: onShowAddMapStyleModal,
uiStateActions: uiStateActions,
visStateActions: visStateActions
}) : null, /*#__PURE__*/_react["default"].createElement(CustomPanels, (0, _extends2["default"])({}, customPanelProps, {
activeSidePanel: activeSidePanel
})))));
};
SidePanel.defaultProps = {
panels: fullPanels,
sidebarComponents: SIDEBAR_COMPONENTS,
uiState: {},
visStateActions: {},
mapStyleActions: {},
uiStateActions: {},
availableProviders: {},
mapInfo: {}
};
return SidePanel;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwuanMiXSwibmFtZXMiOlsiU3R5bGVkU2lkZVBhbmVsQ29udGVudCIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJzaWRlUGFuZWxTY3JvbGxCYXIiLCJzaWRlUGFuZWxJbm5lclBhZGRpbmciLCJTaWRlUGFuZWxGYWN0b3J5IiwiZGVwcyIsIlNpZGViYXJGYWN0b3J5IiwiUGFuZWxIZWFkZXJGYWN0b3J5IiwiUGFuZWxUb2dnbGVGYWN0b3J5IiwiUGFuZWxUaXRsZUZhY3RvcnkiLCJMYXllck1hbmFnZXJGYWN0b3J5IiwiRmlsdGVyTWFuYWdlckZhY3RvcnkiLCJJbnRlcmFjdGlvbk1hbmFnZXJGYWN0b3J5IiwiTWFwTWFuYWdlckZhY3RvcnkiLCJDdXN0b21QYW5lbHNGYWN0b3J5IiwiU2lkZWJhciIsIlBhbmVsSGVhZGVyIiwiUGFuZWxUb2dnbGUiLCJQYW5lbFRpdGxlIiwiTGF5ZXJNYW5hZ2VyIiwiRmlsdGVyTWFuYWdlciIsIkludGVyYWN0aW9uTWFuYWdlciIsIk1hcE1hbmFnZXIiLCJDdXN0b21QYW5lbHMiLCJTSURFQkFSX0NPTVBPTkVOVFMiLCJsYXllciIsImZpbHRlciIsImludGVyYWN0aW9uIiwibWFwIiwiZnVsbFBhbmVscyIsIlNJREVCQVJfUEFORUxTIiwiY29tcG9uZW50IiwiaWQiLCJnZXRDdXN0b21QYW5lbFByb3BzIiwiU2lkZVBhbmVsIiwiYXBwTmFtZSIsImFwcFdlYnNpdGUiLCJhdmFpbGFibGVQcm92aWRlcnMiLCJkYXRhc2V0cyIsImZpbHRlcnMiLCJsYXllcnMiLCJsYXllckJsZW5kaW5nIiwibGF5ZXJDbGFzc2VzIiwibGF5ZXJPcmRlciIsImludGVyYWN0aW9uQ29uZmlnIiwicGFuZWxzIiwibWFwSW5mbyIsIm1hcFNhdmVkIiwibWFwU3RhdGVBY3Rpb25zIiwibWFwU3R5bGUiLCJtYXBTdHlsZUFjdGlvbnMiLCJvblNhdmVNYXAiLCJ1aVN0YXRlIiwidWlTdGF0ZUFjdGlvbnMiLCJ2aXNTdGF0ZUFjdGlvbnMiLCJ2ZXJzaW9uIiwid2lkdGgiLCJvcGVuRGVsZXRlTW9kYWwiLCJ0b2dnbGVNb2RhbCIsInRvZ2dsZVNpZGVQYW5lbCIsImFjdGl2ZVNpZGVQYW5lbCIsInNldE1hcEluZm8iLCJzaG93RGF0YXNldFRhYmxlIiwiaGFzU2hhcmUiLCJoYXNTdG9yYWdlIiwidGl0bGUiLCJpc09wZW4iLCJCb29sZWFuIiwiX29uT3Blbk9yQ2xvc2UiLCJvbkNsaWNrRXhwb3J0SW1hZ2UiLCJFWFBPUlRfSU1BR0VfSUQiLCJvbkNsaWNrRXhwb3J0RGF0YSIsIkVYUE9SVF9EQVRBX0lEIiwib25DbGlja0V4cG9ydE1hcCIsIkVYUE9SVF9NQVBfSUQiLCJvbkNsaWNrU2F2ZVRvU3RvcmFnZSIsIk9WRVJXUklURV9NQVBfSUQiLCJTQVZFX01BUF9JRCIsIm9uQ2xpY2tTYXZlQXNUb1N0b3JhZ2UiLCJvbkNsaWNrU2hhcmVNYXAiLCJTSEFSRV9NQVBfSUQiLCJvblNob3dEYXRhc2V0VGFibGUiLCJkYXRhSWQiLCJvblNob3dBZGREYXRhTW9kYWwiLCJBRERfREFUQV9JRCIsIm9uU2hvd0FkZE1hcFN0eWxlTW9kYWwiLCJBRERfTUFQX1NUWUxFX0lEIiwib25SZW1vdmVEYXRhc2V0Iiwib25TYXZlVG9TdG9yYWdlIiwib25TYXZlQXNUb1N0b3JhZ2UiLCJjdXJyZW50UGFuZWwiLCJmaW5kIiwib25TaGFyZU1hcCIsImN1c3RvbVBhbmVsUHJvcHMiLCJQYW5lbENvbXBvbmVudCIsInZpc2libGVEcm9wZG93biIsInNob3dFeHBvcnREcm9wZG93biIsImhpZGVFeHBvcnREcm9wZG93biIsImxhYmVsIiwiZGVmYXVsdFByb3BzIiwic2lkZWJhckNvbXBvbmVudHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFFQTs7QUFZQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7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QkFBa0IsRUFBRSxFQVBHO0FBUXZCUyxJQUFBQSxPQUFPLEVBQUU7QUFSYyxHQUF6QjtBQVdBLFNBQU9aLFNBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ2xvY2FsaXphdGlvbic7XG5cbmltcG9ydCB7XG4gIEVYUE9SVF9EQVRBX0lELFxuICBFWFBPUlRfTUFQX0lELFxuICBTSEFSRV9NQVBfSUQsXG4gIFNJREVCQVJfUEFORUxTLFxuICBPVkVSV1JJVEVfTUFQX0lELFxuICBTQVZFX01BUF9JRCxcbiAgRVhQT1JUX0lNQUdFX0lELFxuICBBRERfREFUQV9JRCxcbiAgQUREX01BUF9TVFlMRV9JRFxufSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmltcG9ydCBTaWRlYmFyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvc2lkZS1iYXInO1xuaW1wb3J0IFBhbmVsSGVhZGVyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyJztcbmltcG9ydCBQYW5lbFRvZ2dsZUZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL3BhbmVsLXRvZ2dsZSc7XG5pbXBvcnQgTGF5ZXJNYW5hZ2VyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvbGF5ZXItbWFuYWdlcic7XG5pbXBvcnQgRmlsdGVyTWFuYWdlckZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL2ZpbHRlci1tYW5hZ2VyJztcbmltcG9ydCBJbnRlcmFjdGlvbk1hbmFnZXJGYWN0b3J5IGZyb20gJy4vc2lkZS1wYW5lbC9pbnRlcmFjdGlvbi1tYW5hZ2VyJztcbmltcG9ydCBNYXBNYW5hZ2VyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvbWFwLW1hbmFnZXInO1xuaW1wb3J0IEN1c3RvbVBhbmVsc0ZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL2N1c3RvbS1wYW5lbCc7XG5pbXBvcnQgUGFuZWxUaXRsZUZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL3BhbmVsLXRpdGxlJztcblxuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xuXG5leHBvcnQgY29uc3QgU3R5bGVkU2lkZVBhbmVsQ29udGVudCA9IHN0eWxlZC5kaXZgXG4gICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2lkZVBhbmVsU2Nyb2xsQmFyfTtcbiAgZmxleC1ncm93OiAxO1xuICBwYWRkaW5nOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNpZGVQYW5lbElubmVyUGFkZGluZ31weDtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG5cbiAgLnNpZGUtcGFuZWxfX2NvbnRlbnRfX2lubmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG5gO1xuXG5TaWRlUGFuZWxGYWN0b3J5LmRlcHMgPSBbXG4gIFNpZGViYXJGYWN0b3J5LFxuICBQYW5lbEhlYWRlckZhY3RvcnksXG4gIFBhbmVsVG9nZ2xlRmFjdG9yeSxcbiAgUGFuZWxUaXRsZUZhY3RvcnksXG4gIExheWVyTWFuYWdlckZhY3RvcnksXG4gIEZpbHRlck1hbmFnZXJGYWN0b3J5LFxuICBJbnRlcmFjdGlvbk1hbmFnZXJGYWN0b3J5LFxuICBNYXBNYW5hZ2VyRmFjdG9yeSxcbiAgQ3VzdG9tUGFuZWxzRmFjdG9yeVxuXTtcblxuLyoqXG4gKiBWZXJ0aWNhbCBzaWRlYmFyIGNvbnRhaW5pbmcgaW5wdXQgY29tcG9uZW50cyBmb3IgdGhlIHJlbmRlcmluZyBsYXllcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2lkZVBhbmVsRmFjdG9yeShcbiAgU2lkZWJhcixcbiAgUGFuZWxIZWFkZXIsXG4gIFBhbmVsVG9nZ2xlLFxuICBQYW5lbFRpdGxlLFxuICBMYXllck1hbmFnZXIsXG4gIEZpbHRlck1hbmFnZXIsXG4gIEludGVyYWN0aW9uTWFuYWdlcixcbiAgTWFwTWFuYWdlcixcbiAgQ3VzdG9tUGFuZWxzXG4pIHtcbiAgLy8gaW5qZWN0IGNvbXBvbmVudHNcbiAgY29uc3QgU0lERUJBUl9DT01QT05FTlRTID0ge1xuICAgIGxheWVyOiBMYXllck1hbmFnZXIsXG4gICAgZmlsdGVyOiBGaWx0ZXJNYW5hZ2VyLFxuICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbk1hbmFnZXIsXG4gICAgbWFwOiBNYXBNYW5hZ2VyXG4gIH07XG5cbiAgLy8gV2Ugc2hvdWxkIGRlZmluZWQgc2lkZWJhciBwYW5lbHMgaGVyZSBidXQga2VlcGluZyB0aGVtIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlXG4gIGNvbnN0IGZ1bGxQYW5lbHMgPSBTSURFQkFSX1BBTkVMUy5tYXAoY29tcG9uZW50ID0+ICh7XG4gICAgLi4uY29tcG9uZW50LFxuICAgIGNvbXBvbmVudDogU0lERUJBUl9DT01QT05FTlRTW2NvbXBvbmVudC5pZF1cbiAgfSkpO1xuXG4gIGNvbnN0IGdldEN1c3RvbVBhbmVsUHJvcHMgPSBnZXQoQ3VzdG9tUGFuZWxzLCBbJ2RlZmF1bHRQcm9wcycsICdnZXRQcm9wcyddKSB8fCAoKCkgPT4gKHt9KSk7XG5cbiAgLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL3NpZGUtcGFuZWwnKS5TaWRlUGFuZWx9ICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuICBjb25zdCBTaWRlUGFuZWwgPSBwcm9wcyA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgYXBwTmFtZSxcbiAgICAgIGFwcFdlYnNpdGUsXG4gICAgICBhdmFpbGFibGVQcm92aWRlcnMsXG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGZpbHRlcnMsXG4gICAgICBsYXllcnMsXG4gICAgICBsYXllckJsZW5kaW5nLFxuICAgICAgbGF5ZXJDbGFzc2VzLFxuICAgICAgbGF5ZXJPcmRlcixcbiAgICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgcGFuZWxzLFxuICAgICAgbWFwSW5mbyxcbiAgICAgIG1hcFNhdmVkLFxuICAgICAgbWFwU3RhdGVBY3Rpb25zLFxuICAgICAgbWFwU3R5bGUsXG4gICAgICBtYXBTdHlsZUFjdGlvbnMsXG4gICAgICBvblNhdmVNYXAsXG4gICAgICB1aVN0YXRlLFxuICAgICAgdWlTdGF0ZUFjdGlvbnMsXG4gICAgICB2aXNTdGF0ZUFjdGlvbnMsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgd2lkdGhcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3Qge29wZW5EZWxldGVNb2RhbCwgdG9nZ2xlTW9kYWwsIHRvZ2dsZVNpZGVQYW5lbH0gPSB1aVN0YXRlQWN0aW9ucztcbiAgICBjb25zdCB7YWN0aXZlU2lkZVBhbmVsfSA9IHVpU3RhdGU7XG4gICAgY29uc3Qge3NldE1hcEluZm8sIHNob3dEYXRhc2V0VGFibGV9ID0gdmlzU3RhdGVBY3Rpb25zO1xuICAgIGNvbnN0IHtoYXNTaGFyZSwgaGFzU3RvcmFnZX0gPSBhdmFpbGFibGVQcm92aWRlcnM7XG5cbiAgICBjb25zdCB7dGl0bGV9ID0gbWFwSW5mbztcblxuICAgIGNvbnN0IGlzT3BlbiA9IEJvb2xlYW4oYWN0aXZlU2lkZVBhbmVsKTtcblxuICAgIGNvbnN0IF9vbk9wZW5PckNsb3NlID0gdXNlQ2FsbGJhY2soKCkgPT4gdG9nZ2xlU2lkZVBhbmVsKGFjdGl2ZVNpZGVQYW5lbCA/IG51bGwgOiAnbGF5ZXInKSwgW1xuICAgICAgYWN0aXZlU2lkZVBhbmVsLFxuICAgICAgdG9nZ2xlU2lkZVBhbmVsXG4gICAgXSk7XG5cbiAgICBjb25zdCBvbkNsaWNrRXhwb3J0SW1hZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB0b2dnbGVNb2RhbChFWFBPUlRfSU1BR0VfSUQpLCBbdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvbkNsaWNrRXhwb3J0RGF0YSA9IHVzZUNhbGxiYWNrKCgpID0+IHRvZ2dsZU1vZGFsKEVYUE9SVF9EQVRBX0lEKSwgW3RvZ2dsZU1vZGFsXSk7XG4gICAgY29uc3Qgb25DbGlja0V4cG9ydE1hcCA9IHVzZUNhbGxiYWNrKCgpID0+IHRvZ2dsZU1vZGFsKEVYUE9SVF9NQVBfSUQpLCBbdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvbkNsaWNrU2F2ZVRvU3RvcmFnZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKCkgPT4gdG9nZ2xlTW9kYWwobWFwU2F2ZWQgPyBPVkVSV1JJVEVfTUFQX0lEIDogU0FWRV9NQVBfSUQpLFxuICAgICAgW21hcFNhdmVkLCB0b2dnbGVNb2RhbF1cbiAgICApO1xuICAgIGNvbnN0IG9uQ2xpY2tTYXZlQXNUb1N0b3JhZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBzZXRNYXBJbmZvKHtcbiAgICAgICAgdGl0bGU6IGAke3RpdGxlIHx8ICdLZXBsZXIuZ2wnfSAoQ29weSlgXG4gICAgICB9KTtcblxuICAgICAgdG9nZ2xlTW9kYWwoU0FWRV9NQVBfSUQpO1xuICAgIH0sIFt0aXRsZSwgc2V0TWFwSW5mbywgdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvbkNsaWNrU2hhcmVNYXAgPSB1c2VDYWxsYmFjaygoKSA9PiB0b2dnbGVNb2RhbChTSEFSRV9NQVBfSUQpLCBbdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvblNob3dEYXRhc2V0VGFibGUgPSB1c2VDYWxsYmFjayhkYXRhSWQgPT4gc2hvd0RhdGFzZXRUYWJsZShkYXRhSWQpLCBbc2hvd0RhdGFzZXRUYWJsZV0pO1xuICAgIGNvbnN0IG9uU2hvd0FkZERhdGFNb2RhbCA9IHVzZUNhbGxiYWNrKCgpID0+IHRvZ2dsZU1vZGFsKEFERF9EQVRBX0lEKSwgW3RvZ2dsZU1vZGFsXSk7XG4gICAgY29uc3Qgb25TaG93QWRkTWFwU3R5bGVNb2RhbCA9IHVzZUNhbGxiYWNrKCgpID0+IHRvZ2dsZU1vZGFsKEFERF9NQVBfU1RZTEVfSUQpLCBbdG9nZ2xlTW9kYWxdKTtcbiAgICBjb25zdCBvblJlbW92ZURhdGFzZXQgPSB1c2VDYWxsYmFjayhkYXRhSWQgPT4gb3BlbkRlbGV0ZU1vZGFsKGRhdGFJZCksIFtvcGVuRGVsZXRlTW9kYWxdKTtcbiAgICBjb25zdCBvblNhdmVUb1N0b3JhZ2UgPSB1c2VNZW1vKCgpID0+ICgoaGFzU3RvcmFnZSA/IG9uQ2xpY2tTYXZlVG9TdG9yYWdlIDogbnVsbCkpLCBbXG4gICAgICBoYXNTdG9yYWdlLFxuICAgICAgb25DbGlja1NhdmVUb1N0b3JhZ2VcbiAgICBdKTtcbiAgICBjb25zdCBvblNhdmVBc1RvU3RvcmFnZSA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoKGhhc1N0b3JhZ2UgJiYgbWFwU2F2ZWQgPyBvbkNsaWNrU2F2ZUFzVG9TdG9yYWdlIDogbnVsbCkpLFxuICAgICAgW2hhc1N0b3JhZ2UsIG1hcFNhdmVkLCBvbkNsaWNrU2F2ZUFzVG9TdG9yYWdlXVxuICAgICk7XG4gICAgY29uc3QgY3VycmVudFBhbmVsID0gdXNlTWVtbygoKSA9PiBwYW5lbHMuZmluZCgoe2lkfSkgPT4gaWQgPT09IGFjdGl2ZVNpZGVQYW5lbCkgfHwge30sIFtcbiAgICAgIGFjdGl2ZVNpZGVQYW5lbCxcbiAgICAgIHBhbmVsc1xuICAgIF0pO1xuICAgIGNvbnN0IG9uU2hhcmVNYXAgPSB1c2VNZW1vKCgpID0+ICgoaGFzU2hhcmUgPyBvbkNsaWNrU2hhcmVNYXAgOiBudWxsKSksIFtcbiAgICAgIGhhc1NoYXJlLFxuICAgICAgb25DbGlja1NoYXJlTWFwXG4gICAgXSk7XG4gICAgY29uc3QgY3VzdG9tUGFuZWxQcm9wcyA9IHVzZU1lbW8oKCkgPT4gZ2V0Q3VzdG9tUGFuZWxQcm9wcyhwcm9wcyksIFtwcm9wc10pO1xuXG4gICAgY29uc3QgUGFuZWxDb21wb25lbnQgPSBjdXJyZW50UGFuZWwuY29tcG9uZW50O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTaWRlYmFyIHdpZHRoPXt3aWR0aH0gaXNPcGVuPXtpc09wZW59IG1pbmlmaWVkV2lkdGg9ezB9IG9uT3Blbk9yQ2xvc2U9e19vbk9wZW5PckNsb3NlfT5cbiAgICAgICAgPFBhbmVsSGVhZGVyXG4gICAgICAgICAgYXBwTmFtZT17YXBwTmFtZX1cbiAgICAgICAgICB2ZXJzaW9uPXt2ZXJzaW9ufVxuICAgICAgICAgIGFwcFdlYnNpdGU9e2FwcFdlYnNpdGV9XG4gICAgICAgICAgdmlzaWJsZURyb3Bkb3duPXt1aVN0YXRlLnZpc2libGVEcm9wZG93bn1cbiAgICAgICAgICBzaG93RXhwb3J0RHJvcGRvd249e3VpU3RhdGVBY3Rpb25zLnNob3dFeHBvcnREcm9wZG93bn1cbiAgICAgICAgICBoaWRlRXhwb3J0RHJvcGRvd249e3VpU3RhdGVBY3Rpb25zLmhpZGVFeHBvcnREcm9wZG93bn1cbiAgICAgICAgICBvbkV4cG9ydEltYWdlPXtvbkNsaWNrRXhwb3J0SW1hZ2V9XG4gICAgICAgICAgb25FeHBvcnREYXRhPXtvbkNsaWNrRXhwb3J0RGF0YX1cbiAgICAgICAgICBvbkV4cG9ydE1hcD17b25DbGlja0V4cG9ydE1hcH1cbiAgICAgICAgICBvblNhdmVNYXA9e29uU2F2ZU1hcH1cbiAgICAgICAgICBvblNhdmVUb1N0b3JhZ2U9e29uU2F2ZVRvU3RvcmFnZX1cbiAgICAgICAgICBvblNhdmVBc1RvU3RvcmFnZT17b25TYXZlQXNUb1N0b3JhZ2V9XG4gICAgICAgICAgb25TaGFyZU1hcD17b25TaGFyZU1hcH1cbiAgICAgICAgLz5cbiAgICAgICAgey8qIHRoZSBuZXh0IHR3byBjb21wb25lbnRzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIG9uZSAqL31cbiAgICAgICAgey8qIGJ1dCBpIGFtIGtlZXBpbmcgdGhlbSBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi99XG4gICAgICAgIDxQYW5lbFRvZ2dsZVxuICAgICAgICAgIHBhbmVscz17cGFuZWxzfVxuICAgICAgICAgIGFjdGl2ZVBhbmVsPXthY3RpdmVTaWRlUGFuZWx9XG4gICAgICAgICAgdG9nZ2xlUGFuZWw9e3VpU3RhdGVBY3Rpb25zLnRvZ2dsZVNpZGVQYW5lbH1cbiAgICAgICAgLz5cbiAgICAgICAgPFN0eWxlZFNpZGVQYW5lbENvbnRlbnQgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fY29udGVudF9faW5uZXJcIj5cbiAgICAgICAgICAgIDxQYW5lbFRpdGxlIGNsYXNzTmFtZT1cInNpZGUtcGFuZWxfX2NvbnRlbnRfX3RpdGxlXCI+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXtjdXJyZW50UGFuZWwubGFiZWx9IC8+XG4gICAgICAgICAgICA8L1BhbmVsVGl0bGU+XG4gICAgICAgICAgICB7UGFuZWxDb21wb25lbnQgPyAoXG4gICAgICAgICAgICAgIDxQYW5lbENvbXBvbmVudFxuICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICBmaWx0ZXJzPXtmaWx0ZXJzfVxuICAgICAgICAgICAgICAgIGxheWVycz17bGF5ZXJzfVxuICAgICAgICAgICAgICAgIGxheWVyQ2xhc3Nlcz17bGF5ZXJDbGFzc2VzfVxuICAgICAgICAgICAgICAgIGxheWVyT3JkZXI9e2xheWVyT3JkZXJ9XG4gICAgICAgICAgICAgICAgbGF5ZXJCbGVuZGluZz17bGF5ZXJCbGVuZGluZ31cbiAgICAgICAgICAgICAgICBtYXBTdHlsZT17bWFwU3R5bGV9XG4gICAgICAgICAgICAgICAgbWFwU3R5bGVBY3Rpb25zPXttYXBTdHlsZUFjdGlvbnN9XG4gICAgICAgICAgICAgICAgbWFwU3RhdGVBY3Rpb25zPXttYXBTdGF0ZUFjdGlvbnN9XG4gICAgICAgICAgICAgICAgaW50ZXJhY3Rpb25Db25maWc9e2ludGVyYWN0aW9uQ29uZmlnfVxuICAgICAgICAgICAgICAgIHJlbW92ZURhdGFzZXQ9e29uUmVtb3ZlRGF0YXNldH1cbiAgICAgICAgICAgICAgICBzaG93RGF0YXNldFRhYmxlPXtvblNob3dEYXRhc2V0VGFibGV9XG4gICAgICAgICAgICAgICAgc2hvd0FkZERhdGFNb2RhbD17b25TaG93QWRkRGF0YU1vZGFsfVxuICAgICAgICAgICAgICAgIHNob3dBZGRNYXBTdHlsZU1vZGFsPXtvblNob3dBZGRNYXBTdHlsZU1vZGFsfVxuICAgICAgICAgICAgICAgIHVpU3RhdGVBY3Rpb25zPXt1aVN0YXRlQWN0aW9uc31cbiAgICAgICAgICAgICAgICB2aXNTdGF0ZUFjdGlvbnM9e3Zpc1N0YXRlQWN0aW9uc31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPEN1c3RvbVBhbmVscyB7Li4uY3VzdG9tUGFuZWxQcm9wc30gYWN0aXZlU2lkZVBhbmVsPXthY3RpdmVTaWRlUGFuZWx9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvU3R5bGVkU2lkZVBhbmVsQ29udGVudD5cbiAgICAgIDwvU2lkZWJhcj5cbiAgICApO1xuICB9O1xuXG4gIFNpZGVQYW5lbC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgcGFuZWxzOiBmdWxsUGFuZWxzLFxuICAgIHNpZGViYXJDb21wb25lbnRzOiBTSURFQkFSX0NPTVBPTkVOVFMsXG4gICAgdWlTdGF0ZToge30sXG4gICAgdmlzU3RhdGVBY3Rpb25zOiB7fSxcbiAgICBtYXBTdHlsZUFjdGlvbnM6IHt9LFxuICAgIHVpU3RhdGVBY3Rpb25zOiB7fSxcbiAgICBhdmFpbGFibGVQcm92aWRlcnM6IHt9LFxuICAgIG1hcEluZm86IHt9XG4gIH07XG5cbiAgcmV0dXJuIFNpZGVQYW5lbDtcbn1cbiJdfQ==