kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
185 lines (182 loc) • 34 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.EditButton = exports.ColorBreaksDisplay = exports.CategoricalColorDisplay = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _commonUtils = require("@kepler.gl/common-utils");
var _constants = require("@kepler.gl/constants");
var _utils = require("@kepler.gl/utils");
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _columnStatsChart = _interopRequireDefault(require("../../common/column-stats-chart"));
var _icons = require("../../common/icons");
var _styledComponents2 = require("../../common/styled-components");
var _customPalette = _interopRequireWildcard(require("./custom-palette"));
var _templateObject, _templateObject2, _templateObject3; // 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; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var StyledColorBreaksPanel = _styledComponents["default"].div.attrs({
className: 'styled-color-breaks-panel'
})(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 10px;\n"])));
var StyledColorBreaksDisplay = _styledComponents["default"].div.attrs({
className: 'styled-color-breaks-display'
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 8px 12px 0 12px;\n"])));
var ColorBreaksPanelWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])([""])));
var EditButton = exports.EditButton = function EditButton(_ref) {
var onClickEdit = _ref.onClickEdit;
return /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, {
className: "editp__button",
link: true,
onClick: onClickEdit
}, /*#__PURE__*/_react["default"].createElement(_icons.Edit, {
height: "16px"
}), "Edit");
};
var ColorBreaksDisplay = exports.ColorBreaksDisplay = function ColorBreaksDisplay(_ref2) {
var currentBreaks = _ref2.currentBreaks,
onEdit = _ref2.onEdit;
if (!(0, _utils.isNumericColorBreaks)(currentBreaks)) {
// don't display color breaks for ordinal breaks, user can change it in custom breaks
return null;
}
return /*#__PURE__*/_react["default"].createElement(StyledColorBreaksDisplay, null, onEdit ? /*#__PURE__*/_react["default"].createElement(EditButton, {
onClickEdit: onEdit
}) : null, currentBreaks.map(function (item, index) {
return /*#__PURE__*/_react["default"].createElement(_customPalette.ColorPaletteItem, {
className: "disabled",
key: index
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "custom-palette-input__left"
}, /*#__PURE__*/_react["default"].createElement(_customPalette.ColorSwatch, {
color: item.data
}), /*#__PURE__*/_react["default"].createElement(_customPalette.EditableColorRange, {
item: item,
isLast: index === currentBreaks.length - 1,
index: index,
editable: false
})));
}));
};
var CategoricalColorDisplay = exports.CategoricalColorDisplay = function CategoricalColorDisplay(_ref3) {
var colorMap = _ref3.colorMap,
onEdit = _ref3.onEdit;
return /*#__PURE__*/_react["default"].createElement(StyledColorBreaksDisplay, null, onEdit ? /*#__PURE__*/_react["default"].createElement(EditButton, {
onClickEdit: onEdit
}) : null, colorMap === null || colorMap === void 0 ? void 0 : colorMap.map(function (cm, index) {
return /*#__PURE__*/_react["default"].createElement(_customPalette.ColorPaletteItem, {
className: "disabled",
key: index
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "custom-palette-input__left"
}, /*#__PURE__*/_react["default"].createElement(_customPalette.ColorSwatch, {
color: cm[1]
}), /*#__PURE__*/_react["default"].createElement(_customPalette.CategoricalSelector, {
index: index,
selectedValues: (0, _commonUtils.toArray)(cm[0]),
allValues: [],
editable: false
})));
}));
};
ColorBreaksPanelFactory.deps = [_customPalette["default"], _columnStatsChart["default"]];
function ColorBreaksPanelFactory(CustomPalette, ColumnStatsChart) {
// eslint-disable-next-line complexity
var ColorBreaksPanel = function ColorBreaksPanel(_ref4) {
var _customPalette$name;
var colorBreaks = _ref4.colorBreaks,
colorUIConfig = _ref4.colorUIConfig,
dataset = _ref4.dataset,
colorField = _ref4.colorField,
isCustomBreaks = _ref4.isCustomBreaks,
allBins = _ref4.allBins,
filteredBins = _ref4.filteredBins,
isFiltered = _ref4.isFiltered,
histogramDomain = _ref4.histogramDomain,
ordinalDomain = _ref4.ordinalDomain,
setColorUI = _ref4.setColorUI,
onScaleChange = _ref4.onScaleChange,
onApply = _ref4.onApply,
onCancel = _ref4.onCancel;
var customPalette = colorUIConfig.customPalette,
showSketcher = colorUIConfig.showSketcher,
colorRangeConfig = colorUIConfig.colorRangeConfig;
var isEditingCustomBreaks = Boolean(colorRangeConfig.customBreaks);
var currentBreaks = (0, _react.useMemo)(function () {
return isEditingCustomBreaks ? (0, _utils.colorMapToColorBreaks)(customPalette.colorMap) : colorBreaks;
}, [customPalette.colorMap, isEditingCustomBreaks, colorBreaks]);
var onClickEditCustomBreaks = (0, _react.useCallback)(function () {
setColorUI({
colorRangeConfig: {
customBreaks: true
}
});
}, [setColorUI]);
var onCilckCancel = (0, _react.useCallback)(function () {
setColorUI({
showSketcher: false,
colorRangeConfig: {
customBreaks: false
}
});
onCancel();
}, [setColorUI, onCancel]);
var onColumnStatsChartChanged = (0, _react.useCallback)(function (newColorBreaks) {
var newColors = newColorBreaks.map(function (cb) {
return cb.data;
});
var newColorMap = (0, _utils.colorBreaksToColorMap)(newColorBreaks);
var newCustomPalette = _objectSpread(_objectSpread({}, customPalette), {}, {
colorMap: newColorMap,
colors: newColors
});
// update custom pallette editor
if (!isEditingCustomBreaks) {
setColorUI({
colorRangeConfig: {
customBreaks: true
},
customPalette: newCustomPalette
});
} else {
setColorUI({
customPalette: newCustomPalette
});
}
// trigger the map to re-render using newCustomPalette
onScaleChange(_constants.SCALE_TYPES.custom, newCustomPalette);
}, [setColorUI, customPalette, isEditingCustomBreaks, onScaleChange]);
return /*#__PURE__*/_react["default"].createElement(ColorBreaksPanelWrapper, null, dataset && allBins.length > 1 && (0, _utils.isNumericColorBreaks)(colorBreaks) ? /*#__PURE__*/_react["default"].createElement(ColumnStatsChart, {
colorField: colorField,
dataset: dataset,
colorBreaks: currentBreaks,
allBins: allBins,
filteredBins: filteredBins,
isFiltered: isFiltered,
histogramDomain: histogramDomain,
onChangedUpdater: onColumnStatsChartChanged
}) : null, /*#__PURE__*/_react["default"].createElement(StyledColorBreaksPanel, null, isEditingCustomBreaks ? /*#__PURE__*/_react["default"].createElement(CustomPalette, {
ordinalDomain: ordinalDomain,
customPalette: customPalette,
setColorPaletteUI: setColorUI,
showSketcher: showSketcher,
onApply: onApply,
onCancel: onCilckCancel
}) : currentBreaks && allBins.length > 1 && (0, _utils.isNumericColorBreaks)(colorBreaks) ? /*#__PURE__*/_react["default"].createElement(ColorBreaksDisplay, {
currentBreaks: currentBreaks,
onEdit: isCustomBreaks ? onClickEditCustomBreaks : null
}) : customPalette.colorMap && customPalette.type === 'customOrdinal' && (_customPalette$name = customPalette.name) !== null && _customPalette$name !== void 0 && _customPalette$name.endsWith(colorField.name) ? /*#__PURE__*/_react["default"].createElement(CategoricalColorDisplay, {
colorMap: customPalette.colorMap,
onEdit: isCustomBreaks ? onClickEditCustomBreaks : null
}) : null));
};
return /*#__PURE__*/_react["default"].memo(ColorBreaksPanel);
}
var _default = exports["default"] = ColorBreaksPanelFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tbW9uVXRpbHMiLCJyZXF1aXJlIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3N0eWxlZENvbXBvbmVudHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2NvbHVtblN0YXRzQ2hhcnQiLCJfaWNvbnMiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfY3VzdG9tUGFsZXR0ZSIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiU3R5bGVkQ29sb3JCcmVha3NQYW5lbCIsInN0eWxlZCIsImRpdiIsImF0dHJzIiwiY2xhc3NOYW1lIiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJTdHlsZWRDb2xvckJyZWFrc0Rpc3BsYXkiLCJDb2xvckJyZWFrc1BhbmVsV3JhcHBlciIsIkVkaXRCdXR0b24iLCJleHBvcnRzIiwiX3JlZiIsIm9uQ2xpY2tFZGl0IiwiY3JlYXRlRWxlbWVudCIsIkJ1dHRvbiIsImxpbmsiLCJvbkNsaWNrIiwiRWRpdCIsImhlaWdodCIsIkNvbG9yQnJlYWtzRGlzcGxheSIsIl9yZWYyIiwiY3VycmVudEJyZWFrcyIsIm9uRWRpdCIsIm5vdE9yZGluYWxDb2xvckJyZWFrcyIsIm1hcCIsIml0ZW0iLCJpbmRleCIsIkNvbG9yUGFsZXR0ZUl0ZW0iLCJrZXkiLCJDb2xvclN3YXRjaCIsImNvbG9yIiwiZGF0YSIsIkVkaXRhYmxlQ29sb3JSYW5nZSIsImlzTGFzdCIsImVkaXRhYmxlIiwiQ2F0ZWdvcmljYWxDb2xvckRpc3BsYXkiLCJfcmVmMyIsImNvbG9yTWFwIiwiY20iLCJDYXRlZ29yaWNhbFNlbGVjdG9yIiwic2VsZWN0ZWRWYWx1ZXMiLCJ0b0FycmF5IiwiYWxsVmFsdWVzIiwiQ29sb3JCcmVha3NQYW5lbEZhY3RvcnkiLCJkZXBzIiwiQ3VzdG9tUGFsZXR0ZUZhY3RvcnkiLCJDb2x1bW5TdGF0c0NoYXJ0RmFjdG9yeSIsIkN1c3RvbVBhbGV0dGUiLCJDb2x1bW5TdGF0c0NoYXJ0IiwiQ29sb3JCcmVha3NQYW5lbCIsIl9yZWY0IiwiX2N1c3RvbVBhbGV0dGUkbmFtZSIsImNvbG9yQnJlYWtzIiwiY29sb3JVSUNvbmZpZyIsImRhdGFzZXQiLCJjb2xvckZpZWxkIiwiaXNDdXN0b21CcmVha3MiLCJhbGxCaW5zIiwiZmlsdGVyZWRCaW5zIiwiaXNGaWx0ZXJlZCIsImhpc3RvZ3JhbURvbWFpbiIsIm9yZGluYWxEb21haW4iLCJzZXRDb2xvclVJIiwib25TY2FsZUNoYW5nZSIsIm9uQXBwbHkiLCJvbkNhbmNlbCIsImN1c3RvbVBhbGV0dGUiLCJzaG93U2tldGNoZXIiLCJjb2xvclJhbmdlQ29uZmlnIiwiaXNFZGl0aW5nQ3VzdG9tQnJlYWtzIiwiQm9vbGVhbiIsImN1c3RvbUJyZWFrcyIsInVzZU1lbW8iLCJjb2xvck1hcFRvQ29sb3JCcmVha3MiLCJvbkNsaWNrRWRpdEN1c3RvbUJyZWFrcyIsInVzZUNhbGxiYWNrIiwib25DaWxja0NhbmNlbCIsIm9uQ29sdW1uU3RhdHNDaGFydENoYW5nZWQiLCJuZXdDb2xvckJyZWFrcyIsIm5ld0NvbG9ycyIsImNiIiwibmV3Q29sb3JNYXAiLCJjb2xvckJyZWFrc1RvQ29sb3JNYXAiLCJuZXdDdXN0b21QYWxldHRlIiwiY29sb3JzIiwiU0NBTEVfVFlQRVMiLCJjdXN0b20iLCJvbkNoYW5nZWRVcGRhdGVyIiwic2V0Q29sb3JQYWxldHRlVUkiLCJ0eXBlIiwibmFtZSIsImVuZHNXaXRoIiwiUmVhY3QiLCJtZW1vIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2lkZS1wYW5lbC9sYXllci1wYW5lbC9jb2xvci1icmVha3MtcGFuZWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7dG9BcnJheX0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtTQ0FMRV9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge0JpbiwgQ29sb3JNYXAsIENvbG9yVUksIEZpZWxkfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIENvbG9yQnJlYWssXG4gIENvbG9yQnJlYWtPcmRpbmFsLFxuICBjb2xvckJyZWFrc1RvQ29sb3JNYXAsXG4gIGNvbG9yTWFwVG9Db2xvckJyZWFrcyxcbiAgaXNOdW1lcmljQ29sb3JCcmVha3MgYXMgbm90T3JkaW5hbENvbG9yQnJlYWtzXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IENvbHVtblN0YXRzQ2hhcnRGYWN0b3J5IGZyb20gJy4uLy4uL2NvbW1vbi9jb2x1bW4tc3RhdHMtY2hhcnQnO1xuaW1wb3J0IHtFZGl0fSBmcm9tICcuLi8uLi9jb21tb24vaWNvbnMnO1xuaW1wb3J0IHtCdXR0b259IGZyb20gJy4uLy4uL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgQ3VzdG9tUGFsZXR0ZUZhY3RvcnksIHtcbiAgQ29sb3JQYWxldHRlSXRlbSxcbiAgQ29sb3JTd2F0Y2gsXG4gIEVkaXRhYmxlQ29sb3JSYW5nZSxcbiAgQ2F0ZWdvcmljYWxTZWxlY3RvcixcbiAgU2V0Q29sb3JVSUZ1bmNcbn0gZnJvbSAnLi9jdXN0b20tcGFsZXR0ZSc7XG5cbmNvbnN0IFN0eWxlZENvbG9yQnJlYWtzUGFuZWwgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc3R5bGVkLWNvbG9yLWJyZWFrcy1wYW5lbCdcbn0pYFxuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuYDtcblxuY29uc3QgU3R5bGVkQ29sb3JCcmVha3NEaXNwbGF5ID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3N0eWxlZC1jb2xvci1icmVha3MtZGlzcGxheSdcbn0pYFxuICBwYWRkaW5nOiA4cHggMTJweCAwIDEycHg7XG5gO1xuXG5jb25zdCBDb2xvckJyZWFrc1BhbmVsV3JhcHBlciA9IHN0eWxlZC5kaXZgYDtcblxudHlwZSBFZGl0QnV0dG9uUHJvcHMgPSB7b25DbGlja0VkaXQ6ICgpID0+IHZvaWR9O1xuXG5leHBvcnQgY29uc3QgRWRpdEJ1dHRvbjogUmVhY3QuRkM8RWRpdEJ1dHRvblByb3BzPiA9ICh7b25DbGlja0VkaXR9KSA9PiAoXG4gIDxCdXR0b24gY2xhc3NOYW1lPVwiZWRpdHBfX2J1dHRvblwiIGxpbmsgb25DbGljaz17b25DbGlja0VkaXR9PlxuICAgIDxFZGl0IGhlaWdodD1cIjE2cHhcIiAvPlxuICAgIEVkaXRcbiAgPC9CdXR0b24+XG4pO1xuXG5leHBvcnQgdHlwZSBDb2xvckJyZWFrc0Rpc3BsYXlQcm9wcyA9IHtcbiAgY3VycmVudEJyZWFrcz86IENvbG9yQnJlYWtbXSB8IENvbG9yQnJlYWtPcmRpbmFsW10gfCBudWxsO1xuICBvbkVkaXQ6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgQ29sb3JCcmVha3NEaXNwbGF5OiBSZWFjdC5GQzxDb2xvckJyZWFrc0Rpc3BsYXlQcm9wcz4gPSAoe2N1cnJlbnRCcmVha3MsIG9uRWRpdH0pID0+IHtcbiAgaWYgKCFub3RPcmRpbmFsQ29sb3JCcmVha3MoY3VycmVudEJyZWFrcykpIHtcbiAgICAvLyBkb24ndCBkaXNwbGF5IGNvbG9yIGJyZWFrcyBmb3Igb3JkaW5hbCBicmVha3MsIHVzZXIgY2FuIGNoYW5nZSBpdCBpbiBjdXN0b20gYnJlYWtzXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkQ29sb3JCcmVha3NEaXNwbGF5PlxuICAgICAge29uRWRpdCA/IDxFZGl0QnV0dG9uIG9uQ2xpY2tFZGl0PXtvbkVkaXR9IC8+IDogbnVsbH1cbiAgICAgIHtjdXJyZW50QnJlYWtzLm1hcCgoaXRlbSwgaW5kZXgpID0+IChcbiAgICAgICAgPENvbG9yUGFsZXR0ZUl0ZW0gY2xhc3NOYW1lPVwiZGlzYWJsZWRcIiBrZXk9e2luZGV4fT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImN1c3RvbS1wYWxldHRlLWlucHV0X19sZWZ0XCI+XG4gICAgICAgICAgICA8Q29sb3JTd2F0Y2ggY29sb3I9e2l0ZW0uZGF0YX0gLz5cbiAgICAgICAgICAgIDxFZGl0YWJsZUNvbG9yUmFuZ2VcbiAgICAgICAgICAgICAgaXRlbT17aXRlbX1cbiAgICAgICAgICAgICAgaXNMYXN0PXtpbmRleCA9PT0gY3VycmVudEJyZWFrcy5sZW5ndGggLSAxfVxuICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIGVkaXRhYmxlPXtmYWxzZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvQ29sb3JQYWxldHRlSXRlbT5cbiAgICAgICkpfVxuICAgIDwvU3R5bGVkQ29sb3JCcmVha3NEaXNwbGF5PlxuICApO1xufTtcblxuZXhwb3J0IHR5cGUgQ2F0ZWdvcmljYWxDb2xvckRpc3BsYXlQcm9wcyA9IHtcbiAgY29sb3JNYXA/OiBDb2xvck1hcDtcbiAgb25FZGl0OiAoKCkgPT4gdm9pZCkgfCBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IENhdGVnb3JpY2FsQ29sb3JEaXNwbGF5OiBSZWFjdC5GQzxDYXRlZ29yaWNhbENvbG9yRGlzcGxheVByb3BzPiA9ICh7XG4gIGNvbG9yTWFwLFxuICBvbkVkaXRcbn06IENhdGVnb3JpY2FsQ29sb3JEaXNwbGF5UHJvcHMpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkQ29sb3JCcmVha3NEaXNwbGF5PlxuICAgICAge29uRWRpdCA/IDxFZGl0QnV0dG9uIG9uQ2xpY2tFZGl0PXtvbkVkaXR9IC8+IDogbnVsbH1cbiAgICAgIHtjb2xvck1hcD8ubWFwKChjbSwgaW5kZXgpID0+IChcbiAgICAgICAgPENvbG9yUGFsZXR0ZUl0ZW0gY2xhc3NOYW1lPVwiZGlzYWJsZWRcIiBrZXk9e2luZGV4fT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImN1c3RvbS1wYWxldHRlLWlucHV0X19sZWZ0XCI+XG4gICAgICAgICAgICA8Q29sb3JTd2F0Y2ggY29sb3I9e2NtWzFdfSAvPlxuICAgICAgICAgICAgPENhdGVnb3JpY2FsU2VsZWN0b3JcbiAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcz17dG9BcnJheShjbVswXSl9XG4gICAgICAgICAgICAgIGFsbFZhbHVlcz17W119XG4gICAgICAgICAgICAgIGVkaXRhYmxlPXtmYWxzZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvQ29sb3JQYWxldHRlSXRlbT5cbiAgICAgICkpfVxuICAgIDwvU3R5bGVkQ29sb3JCcmVha3NEaXNwbGF5PlxuICApO1xufTtcblxuZXhwb3J0IHR5cGUgQ29sb3JCcmVha3NQYW5lbFByb3BzID0ge1xuICBjb2xvckJyZWFrczogQ29sb3JCcmVha1tdIHwgQ29sb3JCcmVha09yZGluYWxbXSB8IG51bGw7XG4gIGNvbG9yVUlDb25maWc6IENvbG9yVUk7XG4gIGRhdGFzZXQ6IEtlcGxlclRhYmxlIHwgdW5kZWZpbmVkO1xuICBjb2xvckZpZWxkOiBGaWVsZDtcbiAgaXNDdXN0b21CcmVha3M6IGJvb2xlYW47XG4gIGFsbEJpbnM6IEJpbltdO1xuICBmaWx0ZXJlZEJpbnM6IEJpbltdO1xuICBpc0ZpbHRlcmVkOiBib29sZWFuO1xuICBoaXN0b2dyYW1Eb21haW46IG51bWJlcltdO1xuICBvcmRpbmFsRG9tYWluOiBudW1iZXJbXSB8IHN0cmluZ1tdO1xuICBzZXRDb2xvclVJOiBTZXRDb2xvclVJRnVuYztcbiAgb25TY2FsZUNoYW5nZTogKHY6IHN0cmluZywgdmlzQ29uZmc/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkO1xuICBvbkFwcGx5OiAoZTogUmVhY3QuTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgb25DYW5jZWw6ICgpID0+IHZvaWQ7XG59O1xuXG5Db2xvckJyZWFrc1BhbmVsRmFjdG9yeS5kZXBzID0gW0N1c3RvbVBhbGV0dGVGYWN0b3J5LCBDb2x1bW5TdGF0c0NoYXJ0RmFjdG9yeV07XG5cbmZ1bmN0aW9uIENvbG9yQnJlYWtzUGFuZWxGYWN0b3J5KFxuICBDdXN0b21QYWxldHRlOiBSZXR1cm5UeXBlPHR5cGVvZiBDdXN0b21QYWxldHRlRmFjdG9yeT4sXG4gIENvbHVtblN0YXRzQ2hhcnQ6IFJldHVyblR5cGU8dHlwZW9mIENvbHVtblN0YXRzQ2hhcnRGYWN0b3J5PlxuKTogUmVhY3QuRkM8Q29sb3JCcmVha3NQYW5lbFByb3BzPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIGNvbnN0IENvbG9yQnJlYWtzUGFuZWw6IFJlYWN0LkZDPENvbG9yQnJlYWtzUGFuZWxQcm9wcz4gPSAoe1xuICAgIGNvbG9yQnJlYWtzLFxuICAgIGNvbG9yVUlDb25maWcsXG4gICAgZGF0YXNldCxcbiAgICBjb2xvckZpZWxkLFxuICAgIGlzQ3VzdG9tQnJlYWtzLFxuICAgIGFsbEJpbnMsXG4gICAgZmlsdGVyZWRCaW5zLFxuICAgIGlzRmlsdGVyZWQsXG4gICAgaGlzdG9ncmFtRG9tYWluLFxuICAgIG9yZGluYWxEb21haW4sXG4gICAgc2V0Q29sb3JVSSxcbiAgICBvblNjYWxlQ2hhbmdlLFxuICAgIG9uQXBwbHksXG4gICAgb25DYW5jZWxcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHtjdXN0b21QYWxldHRlLCBzaG93U2tldGNoZXIsIGNvbG9yUmFuZ2VDb25maWd9ID0gY29sb3JVSUNvbmZpZztcbiAgICBjb25zdCBpc0VkaXRpbmdDdXN0b21CcmVha3MgPSBCb29sZWFuKGNvbG9yUmFuZ2VDb25maWcuY3VzdG9tQnJlYWtzKTtcblxuICAgIGNvbnN0IGN1cnJlbnRCcmVha3MgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKGlzRWRpdGluZ0N1c3RvbUJyZWFrcyA/IGNvbG9yTWFwVG9Db2xvckJyZWFrcyhjdXN0b21QYWxldHRlLmNvbG9yTWFwKSA6IGNvbG9yQnJlYWtzKSxcbiAgICAgIFtjdXN0b21QYWxldHRlLmNvbG9yTWFwLCBpc0VkaXRpbmdDdXN0b21CcmVha3MsIGNvbG9yQnJlYWtzXVxuICAgICk7XG5cbiAgICBjb25zdCBvbkNsaWNrRWRpdEN1c3RvbUJyZWFrcyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHNldENvbG9yVUkoe1xuICAgICAgICBjb2xvclJhbmdlQ29uZmlnOiB7XG4gICAgICAgICAgY3VzdG9tQnJlYWtzOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIFtzZXRDb2xvclVJXSk7XG5cbiAgICBjb25zdCBvbkNpbGNrQ2FuY2VsID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgc2V0Q29sb3JVSSh7XG4gICAgICAgIHNob3dTa2V0Y2hlcjogZmFsc2UsXG4gICAgICAgIGNvbG9yUmFuZ2VDb25maWc6IHtcbiAgICAgICAgICBjdXN0b21CcmVha3M6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgb25DYW5jZWwoKTtcbiAgICB9LCBbc2V0Q29sb3JVSSwgb25DYW5jZWxdKTtcblxuICAgIGNvbnN0IG9uQ29sdW1uU3RhdHNDaGFydENoYW5nZWQgPSB1c2VDYWxsYmFjayhcbiAgICAgIG5ld0NvbG9yQnJlYWtzID0+IHtcbiAgICAgICAgY29uc3QgbmV3Q29sb3JzID0gbmV3Q29sb3JCcmVha3MubWFwKGNiID0+IGNiLmRhdGEpO1xuICAgICAgICBjb25zdCBuZXdDb2xvck1hcCA9IGNvbG9yQnJlYWtzVG9Db2xvck1hcChuZXdDb2xvckJyZWFrcyk7XG5cbiAgICAgICAgY29uc3QgbmV3Q3VzdG9tUGFsZXR0ZSA9IHtcbiAgICAgICAgICAuLi5jdXN0b21QYWxldHRlLFxuICAgICAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcCxcbiAgICAgICAgICBjb2xvcnM6IG5ld0NvbG9yc1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHVwZGF0ZSBjdXN0b20gcGFsbGV0dGUgZWRpdG9yXG4gICAgICAgIGlmICghaXNFZGl0aW5nQ3VzdG9tQnJlYWtzKSB7XG4gICAgICAgICAgc2V0Q29sb3JVSSh7XG4gICAgICAgICAgICBjb2xvclJhbmdlQ29uZmlnOiB7XG4gICAgICAgICAgICAgIGN1c3RvbUJyZWFrczogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1c3RvbVBhbGV0dGU6IG5ld0N1c3RvbVBhbGV0dGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRDb2xvclVJKHtjdXN0b21QYWxldHRlOiBuZXdDdXN0b21QYWxldHRlfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cmlnZ2VyIHRoZSBtYXAgdG8gcmUtcmVuZGVyIHVzaW5nIG5ld0N1c3RvbVBhbGV0dGVcbiAgICAgICAgb25TY2FsZUNoYW5nZShTQ0FMRV9UWVBFUy5jdXN0b20sIG5ld0N1c3RvbVBhbGV0dGUpO1xuICAgICAgfSxcbiAgICAgIFtzZXRDb2xvclVJLCBjdXN0b21QYWxldHRlLCBpc0VkaXRpbmdDdXN0b21CcmVha3MsIG9uU2NhbGVDaGFuZ2VdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8Q29sb3JCcmVha3NQYW5lbFdyYXBwZXI+XG4gICAgICAgIHtkYXRhc2V0ICYmIGFsbEJpbnMubGVuZ3RoID4gMSAmJiBub3RPcmRpbmFsQ29sb3JCcmVha3MoY29sb3JCcmVha3MpID8gKFxuICAgICAgICAgIDxDb2x1bW5TdGF0c0NoYXJ0XG4gICAgICAgICAgICBjb2xvckZpZWxkPXtjb2xvckZpZWxkfVxuICAgICAgICAgICAgZGF0YXNldD17ZGF0YXNldH1cbiAgICAgICAgICAgIGNvbG9yQnJlYWtzPXtjdXJyZW50QnJlYWtzfVxuICAgICAgICAgICAgYWxsQmlucz17YWxsQmluc31cbiAgICAgICAgICAgIGZpbHRlcmVkQmlucz17ZmlsdGVyZWRCaW5zfVxuICAgICAgICAgICAgaXNGaWx0ZXJlZD17aXNGaWx0ZXJlZH1cbiAgICAgICAgICAgIGhpc3RvZ3JhbURvbWFpbj17aGlzdG9ncmFtRG9tYWlufVxuICAgICAgICAgICAgb25DaGFuZ2VkVXBkYXRlcj17b25Db2x1bW5TdGF0c0NoYXJ0Q2hhbmdlZH1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPFN0eWxlZENvbG9yQnJlYWtzUGFuZWw+XG4gICAgICAgICAge2lzRWRpdGluZ0N1c3RvbUJyZWFrcyA/IChcbiAgICAgICAgICAgIDxDdXN0b21QYWxldHRlXG4gICAgICAgICAgICAgIG9yZGluYWxEb21haW49e29yZGluYWxEb21haW59XG4gICAgICAgICAgICAgIGN1c3RvbVBhbGV0dGU9e2N1c3RvbVBhbGV0dGV9XG4gICAgICAgICAgICAgIHNldENvbG9yUGFsZXR0ZVVJPXtzZXRDb2xvclVJfVxuICAgICAgICAgICAgICBzaG93U2tldGNoZXI9e3Nob3dTa2V0Y2hlcn1cbiAgICAgICAgICAgICAgb25BcHBseT17b25BcHBseX1cbiAgICAgICAgICAgICAgb25DYW5jZWw9e29uQ2lsY2tDYW5jZWx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBjdXJyZW50QnJlYWtzICYmIGFsbEJpbnMubGVuZ3RoID4gMSAmJiBub3RPcmRpbmFsQ29sb3JCcmVha3MoY29sb3JCcmVha3MpID8gKFxuICAgICAgICAgICAgPENvbG9yQnJlYWtzRGlzcGxheVxuICAgICAgICAgICAgICBjdXJyZW50QnJlYWtzPXtjdXJyZW50QnJlYWtzfVxuICAgICAgICAgICAgICBvbkVkaXQ9e2lzQ3VzdG9tQnJlYWtzID8gb25DbGlja0VkaXRDdXN0b21CcmVha3MgOiBudWxsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApIDogY3VzdG9tUGFsZXR0ZS5jb2xvck1hcCAmJlxuICAgICAgICAgICAgY3VzdG9tUGFsZXR0ZS50eXBlID09PSAnY3VzdG9tT3JkaW5hbCcgJiZcbiAgICAgICAgICAgIGN1c3RvbVBhbGV0dGUubmFtZT8uZW5kc1dpdGgoY29sb3JGaWVsZC5uYW1lKSA/IChcbiAgICAgICAgICAgIDxDYXRlZ29yaWNhbENvbG9yRGlzcGxheVxuICAgICAgICAgICAgICBjb2xvck1hcD17Y3VzdG9tUGFsZXR0ZS5jb2xvck1hcH1cbiAgICAgICAgICAgICAgb25FZGl0PXtpc0N1c3RvbUJyZWFrcyA/IG9uQ2xpY2tFZGl0Q3VzdG9tQnJlYWtzIDogbnVsbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvU3R5bGVkQ29sb3JCcmVha3NQYW5lbD5cbiAgICAgIDwvQ29sb3JCcmVha3NQYW5lbFdyYXBwZXI+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUmVhY3QubWVtbyhDb2xvckJy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