kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
160 lines (158 loc) • 27.6 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.FormatterDropdown = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _portaled = _interopRequireDefault(require("../portaled"));
var _dropdownList = _interopRequireDefault(require("../item-selector/dropdown-list"));
var _constants = require("@kepler.gl/constants");
var _utils = require("@kepler.gl/utils");
var _icons = require("../icons");
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; }
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 ListItem = function ListItem(_ref) {
var value = _ref.value;
return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(value.icon, {
height: "13px"
}), value.display);
};
// make hash icon smaller
var StyledOptionsDropdown = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .list-selector {\n border-top: 0;\n width: max-content;\n padding: 8px 0;\n }\n\n .list__item > div {\n display: flex;\n align-items: center;\n flex-direction: row;\n justify-content: flex-start;\n line-height: 18px;\n\n svg {\n margin-right: 5px;\n }\n\n .data-ex-icons-hash {\n width: 10px;\n height: 10px;\n stroke-width: 1px;\n margin-left: 2px;\n margin-right: 6px;\n }\n }\n"])));
var StyledPopover = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n width: 184px;\n height: 160px;\n z-index: 101;\n .list-selector {\n max-height: 160px;\n }\n .hover:after {\n content: '\\2713';\n margin-left: 5px;\n }\n"], ["\n width: 184px;\n height: 160px;\n z-index: 101;\n .list-selector {\n max-height: 160px;\n }\n .hover:after {\n content: '\\\\2713';\n margin-left: 5px;\n }\n"])));
var FormatterDropdown = exports.FormatterDropdown = function FormatterDropdown(props) {
var left = props.left,
top = props.top,
isOpened = props.isOpened,
_props$displayFormat = props.displayFormat,
displayFormat = _props$displayFormat === void 0 ? 'None' : _props$displayFormat,
setDisplayFormat = props.setDisplayFormat,
onClose = props.onClose,
formatLabels = props.formatLabels;
var selectionIndex = formatLabels.findIndex(function (label) {
return label.format === displayFormat;
});
var onSelectDisplayFormat = (0, _react.useCallback)(function (result) {
setDisplayFormat === null || setDisplayFormat === void 0 || setDisplayFormat(result);
onClose();
}, [setDisplayFormat, onClose]);
return /*#__PURE__*/_react["default"].createElement(_portaled["default"], {
left: left,
top: top,
isOpened: isOpened,
onClose: onClose
}, /*#__PURE__*/_react["default"].createElement(StyledPopover, {
className: "formatter-popover"
}, /*#__PURE__*/_react["default"].createElement(_dropdownList["default"], {
options: formatLabels,
selectionIndex: selectionIndex,
displayOption: function displayOption(option) {
return option.label;
},
onOptionSelected: onSelectDisplayFormat,
light: true
})));
};
var OptionDropdown = function OptionDropdown(props) {
var _colMeta$column;
var isOpened = props.isOpened,
column = props.column,
colMeta = props.colMeta,
toggleMoreOptions = props.toggleMoreOptions,
sortTableColumn = props.sortTableColumn,
pinTableColumn = props.pinTableColumn,
copyTableColumn = props.copyTableColumn,
setDisplayFormat = props.setDisplayFormat;
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
showFormatter = _useState2[0],
setShowFormatter = _useState2[1];
var onOptionSelected = (0, _react.useCallback)(function (_ref2) {
var value = _ref2.value;
switch (value) {
case _constants.TABLE_OPTION.SORT_ASC:
sortTableColumn === null || sortTableColumn === void 0 || sortTableColumn(_constants.SORT_ORDER.ASCENDING);
break;
case _constants.TABLE_OPTION.SORT_DES:
sortTableColumn === null || sortTableColumn === void 0 || sortTableColumn(_constants.SORT_ORDER.DESCENDING);
break;
case _constants.TABLE_OPTION.UNSORT:
sortTableColumn === null || sortTableColumn === void 0 || sortTableColumn(_constants.SORT_ORDER.UNSORT);
break;
case _constants.TABLE_OPTION.PIN:
pinTableColumn();
break;
case _constants.TABLE_OPTION.UNPIN:
pinTableColumn();
break;
case _constants.TABLE_OPTION.COPY:
copyTableColumn();
break;
case _constants.TABLE_OPTION.FORMAT_COLUMN:
setShowFormatter(true);
return;
default:
break;
}
toggleMoreOptions(column);
}, [column, sortTableColumn, pinTableColumn, copyTableColumn, toggleMoreOptions]);
var TABLE_OPTION_LIST_ICONS = {
Pin: _icons.Pin,
ArrowDown: _icons.ArrowDown,
ArrowUp: _icons.ArrowUp,
Clipboard: _icons.Clipboard,
Cancel: _icons.Cancel,
Hash: _icons.Hash
};
var formatLabels = (0, _utils.getFieldFormatLabels)(colMeta[column].type);
var options = _constants.TABLE_OPTION_LIST.filter(function (op) {
// cant use conditions because it creates a circular dependency
// TODO: move condition clause out of default-settings TABLE_OPTION_LIST
var validToFormat = op.value !== _constants.TABLE_OPTION.FORMAT_COLUMN || formatLabels.length;
return (!op.condition || op.condition(props)) && validToFormat;
}).map(function (op) {
return _objectSpread(_objectSpread({}, op), {}, {
icon: TABLE_OPTION_LIST_ICONS[op.icon]
});
});
var onClose = (0, _react.useCallback)(function () {
setShowFormatter(false);
toggleMoreOptions(column);
}, [column, toggleMoreOptions]);
return /*#__PURE__*/_react["default"].createElement(_portaled["default"], {
right: 120,
top: 20,
isOpened: isOpened,
onClose: onClose
}, /*#__PURE__*/_react["default"].createElement(StyledOptionsDropdown, {
className: "more-options"
}, /*#__PURE__*/_react["default"].createElement(_dropdownList["default"], {
displayOption: function displayOption(d) {
return d.display;
},
options: options,
customListItemComponent: ListItem,
onOptionSelected: onOptionSelected,
light: true
}), /*#__PURE__*/_react["default"].createElement(FormatterDropdown, {
left: 120,
top: -10,
isOpened: Boolean(isOpened && showFormatter),
formatLabels: formatLabels,
displayFormat: (_colMeta$column = colMeta[column]) === null || _colMeta$column === void 0 ? void 0 : _colMeta$column.displayFormat,
setDisplayFormat: setDisplayFormat,
onClose: onClose
})));
};
var _default = exports["default"] = OptionDropdown;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcG9ydGFsZWQiLCJfZHJvcGRvd25MaXN0IiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl9pY29ucyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJMaXN0SXRlbSIsIl9yZWYiLCJ2YWx1ZSIsImNyZWF0ZUVsZW1lbnQiLCJpY29uIiwiaGVpZ2h0IiwiZGlzcGxheSIsIlN0eWxlZE9wdGlvbnNEcm9wZG93biIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiU3R5bGVkUG9wb3ZlciIsIkZvcm1hdHRlckRyb3Bkb3duIiwiZXhwb3J0cyIsInByb3BzIiwibGVmdCIsInRvcCIsImlzT3BlbmVkIiwiX3Byb3BzJGRpc3BsYXlGb3JtYXQiLCJkaXNwbGF5Rm9ybWF0Iiwic2V0RGlzcGxheUZvcm1hdCIsIm9uQ2xvc2UiLCJmb3JtYXRMYWJlbHMiLCJzZWxlY3Rpb25JbmRleCIsImZpbmRJbmRleCIsImxhYmVsIiwiZm9ybWF0Iiwib25TZWxlY3REaXNwbGF5Rm9ybWF0IiwidXNlQ2FsbGJhY2siLCJyZXN1bHQiLCJjbGFzc05hbWUiLCJvcHRpb25zIiwiZGlzcGxheU9wdGlvbiIsIm9wdGlvbiIsIm9uT3B0aW9uU2VsZWN0ZWQiLCJsaWdodCIsIk9wdGlvbkRyb3Bkb3duIiwiX2NvbE1ldGEkY29sdW1uIiwiY29sdW1uIiwiY29sTWV0YSIsInRvZ2dsZU1vcmVPcHRpb25zIiwic29ydFRhYmxlQ29sdW1uIiwicGluVGFibGVDb2x1bW4iLCJjb3B5VGFibGVDb2x1bW4iLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJzaG93Rm9ybWF0dGVyIiwic2V0U2hvd0Zvcm1hdHRlciIsIl9yZWYyIiwiVEFCTEVfT1BUSU9OIiwiU09SVF9BU0MiLCJTT1JUX09SREVSIiwiQVNDRU5ESU5HIiwiU09SVF9ERVMiLCJERVNDRU5ESU5HIiwiVU5TT1JUIiwiUElOIiwiVU5QSU4iLCJDT1BZIiwiRk9STUFUX0NPTFVNTiIsIlRBQkxFX09QVElPTl9MSVNUX0lDT05TIiwiUGluIiwiQXJyb3dEb3duIiwiQXJyb3dVcCIsIkNsaXBib2FyZCIsIkNhbmNlbCIsIkhhc2giLCJnZXRGaWVsZEZvcm1hdExhYmVscyIsInR5cGUiLCJUQUJMRV9PUFRJT05fTElTVCIsIm9wIiwidmFsaWRUb0Zvcm1hdCIsImNvbmRpdGlvbiIsIm1hcCIsInJpZ2h0IiwiZCIsImN1c3RvbUxpc3RJdGVtQ29tcG9uZW50IiwiQm9vbGVhbiIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1vbi9kYXRhLXRhYmxlL29wdGlvbi1kcm9wZG93bi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBQb3J0YWxlZCBmcm9tICcuLi9wb3J0YWxlZCc7XG5pbXBvcnQgRHJvcGRvd25MaXN0IGZyb20gJy4uL2l0ZW0tc2VsZWN0b3IvZHJvcGRvd24tbGlzdCc7XG5pbXBvcnQge1xuICBTT1JUX09SREVSLFxuICBUQUJMRV9PUFRJT04sXG4gIFRBQkxFX09QVElPTl9MSVNULFxuICBUb29sdGlwRm9ybWF0LFxuICBUYWJsZU9wdGlvblxufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge2dldEZpZWxkRm9ybWF0TGFiZWxzfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7Q29sTWV0YX0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0Fycm93RG93biwgQXJyb3dVcCwgQ2xpcGJvYXJkLCBQaW4sIENhbmNlbCwgSGFzaH0gZnJvbSAnLi4vaWNvbnMnO1xuXG5jb25zdCBMaXN0SXRlbSA9ICh7dmFsdWV9KSA9PiAoXG4gIDxkaXY+XG4gICAgPHZhbHVlLmljb24gaGVpZ2h0PVwiMTNweFwiIC8+XG4gICAge3ZhbHVlLmRpc3BsYXl9XG4gIDwvZGl2PlxuKTtcblxuLy8gbWFrZSBoYXNoIGljb24gc21hbGxlclxuY29uc3QgU3R5bGVkT3B0aW9uc0Ryb3Bkb3duID0gc3R5bGVkLmRpdmBcbiAgLmxpc3Qtc2VsZWN0b3Ige1xuICAgIGJvcmRlci10b3A6IDA7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgIHBhZGRpbmc6IDhweCAwO1xuICB9XG5cbiAgLmxpc3RfX2l0ZW0gPiBkaXYge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICBsaW5lLWhlaWdodDogMThweDtcblxuICAgIHN2ZyB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgICB9XG5cbiAgICAuZGF0YS1leC1pY29ucy1oYXNoIHtcbiAgICAgIHdpZHRoOiAxMHB4O1xuICAgICAgaGVpZ2h0OiAxMHB4O1xuICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7XG4gICAgICBtYXJnaW4tbGVmdDogMnB4O1xuICAgICAgbWFyZ2luLXJpZ2h0OiA2cHg7XG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRQb3BvdmVyID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDE4NHB4O1xuICBoZWlnaHQ6IDE2MHB4O1xuICB6LWluZGV4OiAxMDE7XG4gIC5saXN0LXNlbGVjdG9yIHtcbiAgICBtYXgtaGVpZ2h0OiAxNjBweDtcbiAgfVxuICAuaG92ZXI6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICdcXFxcMjcxMyc7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgfVxuYDtcblxuZXhwb3J0IHR5cGUgRm9ybWF0dGVyRHJvcGRvd25Qcm9wcyA9IHtcbiAgbGVmdDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbiAgaXNPcGVuZWQ6IGJvb2xlYW47XG4gIGRpc3BsYXlGb3JtYXQ/OiBzdHJpbmc7XG4gIHNldERpc3BsYXlGb3JtYXQ/OiAoZGlzcGxheUZvcm1hdDogVG9vbHRpcEZvcm1hdCkgPT4gdm9pZDtcbiAgb25DbG9zZTogKCkgPT4gdm9pZDtcbiAgZm9ybWF0TGFiZWxzOiBUb29sdGlwRm9ybWF0W107XG59O1xuXG5leHBvcnQgY29uc3QgRm9ybWF0dGVyRHJvcGRvd246IFJlYWN0LkZDPEZvcm1hdHRlckRyb3Bkb3duUHJvcHM+ID0gKFxuICBwcm9wczogRm9ybWF0dGVyRHJvcGRvd25Qcm9wc1xuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBsZWZ0LFxuICAgIHRvcCxcbiAgICBpc09wZW5lZCxcbiAgICBkaXNwbGF5Rm9ybWF0ID0gJ05vbmUnLFxuICAgIHNldERpc3BsYXlGb3JtYXQsXG4gICAgb25DbG9zZSxcbiAgICBmb3JtYXRMYWJlbHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCBzZWxlY3Rpb25JbmRleCA9IGZvcm1hdExhYmVscy5maW5kSW5kZXgobGFiZWwgPT4gbGFiZWwuZm9ybWF0ID09PSBkaXNwbGF5Rm9ybWF0KTtcblxuICBjb25zdCBvblNlbGVjdERpc3BsYXlGb3JtYXQgPSB1c2VDYWxsYmFjayhcbiAgICByZXN1bHQgPT4ge1xuICAgICAgc2V0RGlzcGxheUZvcm1hdD8uKHJlc3VsdCk7XG4gICAgICBvbkNsb3NlKCk7XG4gICAgfSxcbiAgICBbc2V0RGlzcGxheUZvcm1hdCwgb25DbG9zZV1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxQb3J0YWxlZCBsZWZ0PXtsZWZ0fSB0b3A9e3RvcH0gaXNPcGVuZWQ9e2lzT3BlbmVkfSBvbkNsb3NlPXtvbkNsb3NlfT5cbiAgICAgIDxTdHlsZWRQb3BvdmVyIGNsYXNzTmFtZT1cImZvcm1hdHRlci1wb3BvdmVyXCI+XG4gICAgICAgIDxEcm9wZG93bkxpc3RcbiAgICAgICAgICBvcHRpb25zPXtmb3JtYXRMYWJlbHN9XG4gICAgICAgICAgc2VsZWN0aW9uSW5kZXg9e3NlbGVjdGlvbkluZGV4fVxuICAgICAgICAgIGRpc3BsYXlPcHRpb249e29wdGlvbiA9PiAob3B0aW9uIGFzIFRvb2x0aXBGb3JtYXQpLmxhYmVsfVxuICAgICAgICAgIG9uT3B0aW9uU2VsZWN0ZWQ9e29uU2VsZWN0RGlzcGxheUZvcm1hdH1cbiAgICAgICAgICBsaWdodFxuICAgICAgICAvPlxuICAgICAgPC9TdHlsZWRQb3BvdmVyPlxuICAgIDwvUG9ydGFsZWQ+XG4gICk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkRyb3Bkb3duUHJvcHMge1xuICBpc09wZW5lZD86IGJvb2xlYW47XG4gIGNvbHVtbjogc3RyaW5nO1xuICBjb2xNZXRhOiBDb2xNZXRhO1xuICB0b2dnbGVNb3JlT3B0aW9uczogKGNvbHVtbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzb3J0VGFibGVDb2x1bW4/OiAoc29ydDogc3RyaW5nKSA9PiB2b2lkO1xuICBwaW5UYWJsZUNvbHVtbjogKCkgPT4gdm9pZDtcbiAgY29weVRhYmxlQ29sdW1uOiAoKSA9PiB2b2lkO1xuICBzZXREaXNwbGF5Rm9ybWF0PzogKGRpc3BsYXlGb3JtYXQ6IGFueSkgPT4gdm9pZDtcbiAgc29ydE1vZGU/OiBzdHJpbmc7XG4gIGlzU29ydGVkPzogc3RyaW5nO1xuICBpc1Bpbm5lZD86IGJvb2xlYW47XG59XG5cbmNvbnN0IE9wdGlvbkRyb3Bkb3duID0gKHByb3BzOiBPcHRpb25Ecm9wZG93blByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBpc09wZW5lZCxcbiAgICBjb2x1bW4sXG4gICAgY29sTWV0YSxcbiAgICB0b2dnbGVNb3JlT3B0aW9ucyxcbiAgICBzb3J0VGFibGVDb2x1bW4sXG4gICAgcGluVGFibGVDb2x1bW4sXG4gICAgY29weVRhYmxlQ29sdW1uLFxuICAgIHNldERpc3BsYXlGb3JtYXRcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbc2hvd0Zvcm1hdHRlciwgc2V0U2hvd0Zvcm1hdHRlcl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IG9uT3B0aW9uU2VsZWN0ZWQ6ICh2OiBUYWJsZU9wdGlvbikgPT4gdm9pZCA9IHVzZUNhbGxiYWNrKFxuICAgICh7dmFsdWV9KSA9PiB7XG4gICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgIGNhc2UgVEFCTEVfT1BUSU9OLlNPUlRfQVNDOlxuICAgICAgICAgIHNvcnRUYWJsZUNvbHVtbj8uKFNPUlRfT1JERVIuQVNDRU5ESU5HKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUQUJMRV9PUFRJT04uU09SVF9ERVM6XG4gICAgICAgICAgc29ydFRhYmxlQ29sdW1uPy4oU09SVF9PUkRFUi5ERVNDRU5ESU5HKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUQUJMRV9PUFRJT04uVU5TT1JUOlxuICAgICAgICAgIHNvcnRUYWJsZUNvbHVtbj8uKFNPUlRfT1JERVIuVU5TT1JUKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUQUJMRV9PUFRJT04uUElOOlxuICAgICAgICAgIHBpblRhYmxlQ29sdW1uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVEFCTEVfT1BUSU9OLlVOUElOOlxuICAgICAgICAgIHBpblRhYmxlQ29sdW1uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVEFCTEVfT1BUSU9OLkNPUFk6XG4gICAgICAgICAgY29weVRhYmxlQ29sdW1uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVEFCTEVfT1BUSU9OLkZPUk1BVF9DT0xVTU46XG4gICAgICAgICAgc2V0U2hvd0Zvcm1hdHRlcih0cnVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRvZ2dsZU1vcmVPcHRpb25zKGNvbHVtbik7XG4gICAgfSxcbiAgICBbY29sdW1uLCBzb3J0VGFibGVDb2x1bW4sIHBpblRhYmxlQ29sdW1uLCBjb3B5VGFibGVDb2x1bW4sIHRvZ2dsZU1vcmVPcHRpb25zXVxuICApO1xuXG4gIGNvbnN0IFRBQkxFX09QVElPTl9MSVNUX0lDT05TID0ge1xuICAgIFBpbixcbiAgICBBcnJvd0Rvd24sXG4gICAgQXJyb3dVcCxcbiAgICBDbGlwYm9hcmQsXG4gICAgQ2FuY2VsLFxuICAgIEhhc2hcbiAgfTtcblxuICBjb25zdCBmb3JtYXRMYWJlbHMgPSBnZXRGaWVsZEZvcm1hdExhYmVscyhjb2xNZXRhW2NvbHVtbl0udHlwZSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBUQUJMRV9PUFRJT05fTElTVC5maWx0ZXIob3AgPT4ge1xuICAgIC8vIGNhbnQgdXNlIGNvbmRpdGlvbnMgYmVjYXVzZSBpdCBjcmVhdGVzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgIC8vIFRPRE86IG1vdmUgY29uZGl0aW9uIGNsYXVzZSBvdXQgb2YgZGVmYXVsdC1zZXR0aW5ncyBUQUJMRV9PUFRJT05fTElTVFxuICAgIGNvbnN0IHZhbGlkVG9Gb3JtYXQgPSBvcC52YWx1ZSAhPT0gVEFCTEVfT1BUSU9OLkZPUk1BVF9DT0xVTU4gfHwgZm9ybWF0TGFiZWxzLmxlbmd0aDtcbiAgICByZXR1cm4gKCFvcC5jb25kaXRpb24gfHwgb3AuY29uZGl0aW9uKHByb3BzKSkgJiYgdmFsaWRUb0Zvcm1hdDtcbiAgfSkubWFwKG9wID0+ICh7XG4gICAgLi4ub3AsXG4gICAgaWNvbjogVEFCTEVfT1BUSU9OX0xJU1RfSUNPTlNbb3AuaWNvbl1cbiAgfSkpO1xuXG4gIGNvbnN0IG9uQ2xvc2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2hvd0Zvcm1hdHRlcihmYWxzZSk7XG4gICAgdG9nZ2xlTW9yZU9wdGlvbnMoY29sdW1uKTtcbiAgfSwgW2NvbHVtbiwgdG9nZ2xlTW9yZU9wdGlvbnNdKTtcblxuICByZXR1cm4gKFxuICAgIDxQb3J0YWxlZCByaWdodD17MTIwfSB0b3A9ezIwfSBpc09wZW5lZD17aXNPcGVuZWR9IG9uQ2xvc2U9e29uQ2xvc2V9PlxuICAgICAgPFN0eWxlZE9wdGlvbnNEcm9wZG93biBjbGFzc05hbWU9XCJtb3JlLW9wdGlvbnNcIj5cbiAgICAgICAgPERyb3Bkb3duTGlzdFxuICAgICAgICAgIGRpc3BsYXlPcHRpb249e2QgPT4gKGQgYXMgVGFibGVPcHRpb24pLmRpc3BsYXl9XG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICBjdXN0b21MaXN0SXRlbUNvbXBvbmVudD17TGlzdEl0ZW19XG4gICAgICAgICAgb25PcHRpb25TZWxlY3RlZD17b25PcHRpb25TZWxlY3RlZH1cbiAgICAgICAgICBsaWdodFxuICAgICAgICAvPlxuICAgICAgICA8Rm9ybWF0dGVyRHJvcGRvd25cbiAgICAgICAgICBsZWZ0PXsxMjB9XG4gICAgICAgICAgdG9wPXstMTB9XG4gICAgICAgICAgaXNPcGVuZWQ9e0Jvb2xlYW4oaXNPcGVuZWQgJiYgc2hvd0Zvcm1hdHRlcil9XG4gICAgICAgICAgZm9ybWF0TGFiZWxzPXtmb3JtYXRMYWJlbHN9XG4gICAgICAgICAgZGlzcGxheUZvcm1hdD17Y29sTWV0YVtjb2x1bW5dPy5kaXNwbGF5Rm9ybWF0fVxuICAgICAgICAgIHNldERpc3BsYXlGb3JtYXQ9e3NldERpc3BsYXlGb3JtYXR9XG4gICAgICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgICAgLz5cbiAgICAgIDwvU3R5bGVkT3B0aW9uc0Ryb3Bkb3duPlxuICAgIDwvUG9ydGFsZWQ+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBPcHRpb25Ecm9wZG93bjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsU0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksYUFBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTCxPQUFBO0FBT0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBRUEsSUFBQU8sTUFBQSxHQUFBUCxPQUFBO0FBQTBFLElBQUFRLGVBQUEsRUFBQUMsZ0JBQUEsRUFoQjFFO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVosd0JBQUFZLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEs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
;