kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
153 lines (150 loc) • 23.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = useLegendPosition;
exports.useCalcLegendPosition = useCalcLegendPosition;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = require("react");
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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var MARGIN = {
left: 10,
top: 10,
right: 10,
bottom: 30
};
var DEFAULT_POSITION = {
x: MARGIN.right,
y: MARGIN.bottom,
anchorX: 'right',
anchorY: 'bottom'
};
var MIN_CONTENT_HEIGHT = 100;
var MAP_CONTROL_HEADER_FULL_HEIGHT = 34;
function useCalcLegendPosition(_ref) {
var legendContentRef = _ref.legendContentRef,
isSidePanelShown = _ref.isSidePanelShown,
sidePanelWidth = _ref.sidePanelWidth;
return (0, _react.useCallback)(function () {
var _legendContentRef$cur;
var root = (_legendContentRef$cur = legendContentRef.current) === null || _legendContentRef$cur === void 0 ? void 0 : _legendContentRef$cur.closest('.kepler-gl');
var legendContent = legendContentRef.current;
if (!legendContent || !(root instanceof HTMLElement)) {
return DEFAULT_POSITION;
}
var legendRect = legendContent.getBoundingClientRect();
var mapRootBounds = root.getBoundingClientRect();
var leftSidebarOffset = isSidePanelShown ? sidePanelWidth : 0;
var leftOffset = Math.max(MARGIN.left, legendRect.left - mapRootBounds.left - leftSidebarOffset);
var rightOffset = Math.max(MARGIN.right, mapRootBounds.right - legendRect.right);
var topOffset = Math.max(MARGIN.top, legendRect.top - mapRootBounds.top);
var bottomOffset = Math.max(MARGIN.bottom, mapRootBounds.bottom - legendRect.bottom);
return _objectSpread(_objectSpread({}, leftOffset < rightOffset ? {
x: leftOffset + leftSidebarOffset,
anchorX: 'left'
} : {
x: rightOffset,
anchorX: 'right'
}), topOffset < bottomOffset ? {
y: topOffset,
anchorY: 'top'
} : {
y: bottomOffset,
anchorY: 'bottom'
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isSidePanelShown, sidePanelWidth]);
}
/**
* Returns a function that calculates the anchored position of the map legend
* that is being dragged.
*/
function useLegendPosition(_ref2) {
var _settings$position, _settings$contentHeig, _theme$sidePanel;
var legendContentRef = _ref2.legendContentRef,
isSidePanelShown = _ref2.isSidePanelShown,
settings = _ref2.settings,
onChangeSettings = _ref2.onChangeSettings,
theme = _ref2.theme;
var pos = (_settings$position = settings === null || settings === void 0 ? void 0 : settings.position) !== null && _settings$position !== void 0 ? _settings$position : DEFAULT_POSITION;
var contentHeight = (_settings$contentHeig = settings === null || settings === void 0 ? void 0 : settings.contentHeight) !== null && _settings$contentHeig !== void 0 ? _settings$contentHeig : -1;
var positionStyles = (0, _react.useMemo)(function () {
return (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, pos.anchorX, pos.x), pos.anchorY, pos.y);
}, [pos]);
var startHeightRef = (0, _react.useRef)(0);
var sidePanelWidth = ((_theme$sidePanel = theme.sidePanel) === null || _theme$sidePanel === void 0 ? void 0 : _theme$sidePanel.width) || 0;
var calcPosition = useCalcLegendPosition({
legendContentRef: legendContentRef,
isSidePanelShown: isSidePanelShown,
sidePanelWidth: sidePanelWidth
});
var updatePosition = (0, _react.useCallback)(function () {
return onChangeSettings({
position: calcPosition()
});
}, [calcPosition, onChangeSettings]);
var startResize = (0, _react.useCallback)(function () {
var _legendContentRef$cur2;
var content = (_legendContentRef$cur2 = legendContentRef.current) === null || _legendContentRef$cur2 === void 0 ? void 0 : _legendContentRef$cur2.querySelector('.map-control__panel-content');
if (content instanceof HTMLElement) {
startHeightRef.current = content.offsetHeight;
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
var resize = (0, _react.useCallback)(function (deltaY) {
var _legendContentRef$cur3;
var root = (_legendContentRef$cur3 = legendContentRef.current) === null || _legendContentRef$cur3 === void 0 ? void 0 : _legendContentRef$cur3.closest('.kepler-gl');
var legendContent = legendContentRef.current;
if (root instanceof HTMLElement && legendContent) {
var mapRootBounds = root.getBoundingClientRect();
var legendRect = legendContent.getBoundingClientRect();
var nextHeight = Math.min(mapRootBounds.bottom - (legendRect.top + MAP_CONTROL_HEADER_FULL_HEIGHT + MARGIN.bottom), Math.max(MIN_CONTENT_HEIGHT, startHeightRef.current + deltaY));
onChangeSettings({
contentHeight: nextHeight
});
if (contentHeight > 0 && pos.anchorY === 'bottom') {
onChangeSettings({
position: _objectSpread(_objectSpread({}, pos), {}, {
y: pos.y - (nextHeight - contentHeight)
})
});
}
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[contentHeight, pos, onChangeSettings]);
// Shift when side panel is shown/hidden
var posRef = (0, _react.useRef)(pos);
posRef.current = pos;
(0, _react.useEffect)(function () {
var currentPos = posRef.current;
if (currentPos.anchorX === 'left') {
if (isSidePanelShown) {
if (currentPos.x <= sidePanelWidth + MARGIN.left) {
onChangeSettings({
position: _objectSpread(_objectSpread({}, currentPos), {}, {
x: sidePanelWidth + MARGIN.left
})
});
}
} else {
onChangeSettings({
position: _objectSpread(_objectSpread({}, currentPos), {}, {
x: Math.max(MARGIN.left, currentPos.x - sidePanelWidth)
})
});
}
}
}, [isSidePanelShown, onChangeSettings, sidePanelWidth]);
return {
positionStyles: positionStyles,
updatePosition: updatePosition,
contentHeight: contentHeight,
startResize: startResize,
resize: resize
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJNQVJHSU4iLCJsZWZ0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJERUZBVUxUX1BPU0lUSU9OIiwieCIsInkiLCJhbmNob3JYIiwiYW5jaG9yWSIsIk1JTl9DT05URU5UX0hFSUdIVCIsIk1BUF9DT05UUk9MX0hFQURFUl9GVUxMX0hFSUdIVCIsInVzZUNhbGNMZWdlbmRQb3NpdGlvbiIsIl9yZWYiLCJsZWdlbmRDb250ZW50UmVmIiwiaXNTaWRlUGFuZWxTaG93biIsInNpZGVQYW5lbFdpZHRoIiwidXNlQ2FsbGJhY2siLCJfbGVnZW5kQ29udGVudFJlZiRjdXIiLCJyb290IiwiY3VycmVudCIsImNsb3Nlc3QiLCJsZWdlbmRDb250ZW50IiwiSFRNTEVsZW1lbnQiLCJsZWdlbmRSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibWFwUm9vdEJvdW5kcyIsImxlZnRTaWRlYmFyT2Zmc2V0IiwibGVmdE9mZnNldCIsIk1hdGgiLCJtYXgiLCJyaWdodE9mZnNldCIsInRvcE9mZnNldCIsImJvdHRvbU9mZnNldCIsInVzZUxlZ2VuZFBvc2l0aW9uIiwiX3JlZjIiLCJfc2V0dGluZ3MkcG9zaXRpb24iLCJfc2V0dGluZ3MkY29udGVudEhlaWciLCJfdGhlbWUkc2lkZVBhbmVsIiwic2V0dGluZ3MiLCJvbkNoYW5nZVNldHRpbmdzIiwidGhlbWUiLCJwb3MiLCJwb3NpdGlvbiIsImNvbnRlbnRIZWlnaHQiLCJwb3NpdGlvblN0eWxlcyIsInVzZU1lbW8iLCJzdGFydEhlaWdodFJlZiIsInVzZVJlZiIsInNpZGVQYW5lbCIsIndpZHRoIiwiY2FsY1Bvc2l0aW9uIiwidXBkYXRlUG9zaXRpb24iLCJzdGFydFJlc2l6ZSIsIl9sZWdlbmRDb250ZW50UmVmJGN1cjIiLCJjb250ZW50IiwicXVlcnlTZWxlY3RvciIsIm9mZnNldEhlaWdodCIsInJlc2l6ZSIsImRlbHRhWSIsIl9sZWdlbmRDb250ZW50UmVmJGN1cjMiLCJuZXh0SGVpZ2h0IiwibWluIiwicG9zUmVmIiwidXNlRWZmZWN0IiwiY3VycmVudFBvcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2UtbGVnZW5kLXBvc2l0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7dXNlTWVtbywgdXNlUmVmLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7TWFwTGVnZW5kQ29udHJvbFNldHRpbmdzfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxudHlwZSBQYXJhbXMgPSB7XG4gIGxlZ2VuZENvbnRlbnRSZWY6IFJlYWN0Lk11dGFibGVSZWZPYmplY3Q8SFRNTEVsZW1lbnQgfCBudWxsPjtcbiAgaXNTaWRlUGFuZWxTaG93bjogYm9vbGVhbjtcbiAgc2V0dGluZ3M/OiBNYXBMZWdlbmRDb250cm9sU2V0dGluZ3M7XG4gIG9uQ2hhbmdlU2V0dGluZ3M6IChzZXR0aW5nczogUGFydGlhbDxNYXBMZWdlbmRDb250cm9sU2V0dGluZ3M+KSA9PiB2b2lkO1xuICB0aGVtZTogUmVjb3JkPHN0cmluZywgYW55Pjtcbn07XG5cbnR5cGUgUmV0dXJuVHlwZSA9IHtcbiAgcG9zaXRpb25TdHlsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB1cGRhdGVQb3NpdGlvbjogKCkgPT4gdm9pZDtcbiAgY29udGVudEhlaWdodDogbnVtYmVyO1xuICBzdGFydFJlc2l6ZTogKCkgPT4gdm9pZDtcbiAgcmVzaXplOiAoZGVsdGFZOiBudW1iZXIpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBNQVJHSU4gPSB7XG4gIGxlZnQ6IDEwLFxuICB0b3A6IDEwLFxuICByaWdodDogMTAsXG4gIGJvdHRvbTogMzBcbn07XG5jb25zdCBERUZBVUxUX1BPU0lUSU9OOiBNYXBMZWdlbmRDb250cm9sU2V0dGluZ3NbJ3Bvc2l0aW9uJ10gPSB7XG4gIHg6IE1BUkdJTi5yaWdodCxcbiAgeTogTUFSR0lOLmJvdHRvbSxcbiAgYW5jaG9yWDogJ3JpZ2h0JyxcbiAgYW5jaG9yWTogJ2JvdHRvbSdcbn07XG5jb25zdCBNSU5fQ09OVEVOVF9IRUlHSFQgPSAxMDA7XG5jb25zdCBNQVBfQ09OVFJPTF9IRUFERVJfRlVMTF9IRUlHSFQgPSAzNDtcblxuZXhwb3J0IHR5cGUgVXNlQ2FsY0xlZ2VuZFBvc2l0aW9uUHJvcHMgPSB7XG4gIGxlZ2VuZENvbnRlbnRSZWY6IFJlYWN0Lk11dGFibGVSZWZPYmplY3Q8SFRNTEVsZW1lbnQgfCBudWxsPjtcbiAgaXNTaWRlUGFuZWxTaG93bjogYm9vbGVhbjtcbiAgc2lkZVBhbmVsV2lkdGg6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWxjTGVnZW5kUG9zaXRpb24oe1xuICBsZWdlbmRDb250ZW50UmVmLFxuICBpc1NpZGVQYW5lbFNob3duLFxuICBzaWRlUGFuZWxXaWR0aFxufTogVXNlQ2FsY0xlZ2VuZFBvc2l0aW9uUHJvcHMpIHtcbiAgcmV0dXJuIHVzZUNhbGxiYWNrKCgpOiBNYXBMZWdlbmRDb250cm9sU2V0dGluZ3NbJ3Bvc2l0aW9uJ10gPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBsZWdlbmRDb250ZW50UmVmLmN1cnJlbnQ/LmNsb3Nlc3QoJy5rZXBsZXItZ2wnKTtcbiAgICBjb25zdCBsZWdlbmRDb250ZW50ID0gbGVnZW5kQ29udGVudFJlZi5jdXJyZW50O1xuICAgIGlmICghbGVnZW5kQ29udGVudCB8fCAhKHJvb3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBERUZBVUxUX1BPU0lUSU9OO1xuICAgIH1cbiAgICBjb25zdCBsZWdlbmRSZWN0ID0gbGVnZW5kQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtYXBSb290Qm91bmRzID0gcm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0U2lkZWJhck9mZnNldCA9IGlzU2lkZVBhbmVsU2hvd24gPyBzaWRlUGFuZWxXaWR0aCA6IDA7XG5cbiAgICBjb25zdCBsZWZ0T2Zmc2V0ID0gTWF0aC5tYXgoXG4gICAgICBNQVJHSU4ubGVmdCxcbiAgICAgIGxlZ2VuZFJlY3QubGVmdCAtIG1hcFJvb3RCb3VuZHMubGVmdCAtIGxlZnRTaWRlYmFyT2Zmc2V0XG4gICAgKTtcbiAgICBjb25zdCByaWdodE9mZnNldCA9IE1hdGgubWF4KE1BUkdJTi5yaWdodCwgbWFwUm9vdEJvdW5kcy5yaWdodCAtIGxlZ2VuZFJlY3QucmlnaHQpO1xuXG4gICAgY29uc3QgdG9wT2Zmc2V0ID0gTWF0aC5tYXgoTUFSR0lOLnRvcCwgbGVnZW5kUmVjdC50b3AgLSBtYXBSb290Qm91bmRzLnRvcCk7XG4gICAgY29uc3QgYm90dG9tT2Zmc2V0ID0gTWF0aC5tYXgoTUFSR0lOLmJvdHRvbSwgbWFwUm9vdEJvdW5kcy5ib3R0b20gLSBsZWdlbmRSZWN0LmJvdHRvbSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uKGxlZnRPZmZzZXQgPCByaWdodE9mZnNldFxuICAgICAgICA/IHt4OiBsZWZ0T2Zmc2V0ICsgbGVmdFNpZGViYXJPZmZzZXQsIGFuY2hvclg6ICdsZWZ0J31cbiAgICAgICAgOiB7eDogcmlnaHRPZmZzZXQsIGFuY2hvclg6ICdyaWdodCd9KSxcbiAgICAgIC4uLih0b3BPZmZzZXQgPCBib3R0b21PZmZzZXRcbiAgICAgICAgPyB7eTogdG9wT2Zmc2V0LCBhbmNob3JZOiAndG9wJ31cbiAgICAgICAgOiB7eTogYm90dG9tT2Zmc2V0LCBhbmNob3JZOiAnYm90dG9tJ30pXG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtpc1NpZGVQYW5lbFNob3duLCBzaWRlUGFuZWxXaWR0aF0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlIGFuY2hvcmVkIHBvc2l0aW9uIG9mIHRoZSBtYXAgbGVnZW5kXG4gKiB0aGF0IGlzIGJlaW5nIGRyYWdnZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUxlZ2VuZFBvc2l0aW9uKHtcbiAgbGVnZW5kQ29udGVudFJlZixcbiAgaXNTaWRlUGFuZWxTaG93bixcbiAgc2V0dGluZ3MsXG4gIG9uQ2hhbmdlU2V0dGluZ3MsXG4gIHRoZW1lXG59OiBQYXJhbXMpOiBSZXR1cm5UeXBlIHtcbiAgY29uc3QgcG9zID0gc2V0dGluZ3M/LnBvc2l0aW9uID8/IERFRkFVTFRfUE9TSVRJT047XG4gIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSBzZXR0aW5ncz8uY29udGVudEhlaWdodCA/PyAtMTtcbiAgY29uc3QgcG9zaXRpb25TdHlsZXMgPSB1c2VNZW1vKCgpID0+ICh7W3Bvcy5hbmNob3JYXTogcG9zLngsIFtwb3MuYW5jaG9yWV06IHBvcy55fSksIFtwb3NdKTtcbiAgY29uc3Qgc3RhcnRIZWlnaHRSZWYgPSB1c2VSZWYoMCk7XG4gIGNvbnN0IHNpZGVQYW5lbFdpZHRoID0gdGhlbWUuc2lkZVBhbmVsPy53aWR0aCB8fCAwO1xuXG4gIGNvbnN0IGNhbGNQb3NpdGlvbiA9IHVzZUNhbGNMZWdlbmRQb3NpdGlvbih7XG4gICAgbGVnZW5kQ29udGVudFJlZixcbiAgICBpc1NpZGVQYW5lbFNob3duLFxuICAgIHNpZGVQYW5lbFdpZHRoXG4gIH0pO1xuICBjb25zdCB1cGRhdGVQb3NpdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgICgpID0+IG9uQ2hhbmdlU2V0dGluZ3Moe3Bvc2l0aW9uOiBjYWxjUG9zaXRpb24oKX0pLFxuICAgIFtjYWxjUG9zaXRpb24sIG9uQ2hhbmdlU2V0dGluZ3NdXG4gICk7XG5cbiAgY29uc3Qgc3RhcnRSZXNpemUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IGxlZ2VuZENvbnRlbnRSZWYuY3VycmVudD8ucXVlcnlTZWxlY3RvcignLm1hcC1jb250cm9sX19wYW5lbC1jb250ZW50Jyk7XG4gICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgc3RhcnRIZWlnaHRSZWYuY3VycmVudCA9IGNvbnRlbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcbiAgY29uc3QgcmVzaXplID0gdXNlQ2FsbGJhY2soXG4gICAgZGVsdGFZID0+IHtcbiAgICAgIGNvbnN0IHJvb3QgPSBsZWdlbmRDb250ZW50UmVmLmN1cnJlbnQ/LmNsb3Nlc3QoJy5rZXBsZXItZ2wnKTtcbiAgICAgIGNvbnN0IGxlZ2VuZENvbnRlbnQgPSBsZWdlbmRDb250ZW50UmVmLmN1cnJlbnQ7XG4gICAgICBpZiAocm9vdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGxlZ2VuZENvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgbWFwUm9vdEJvdW5kcyA9IHJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGxlZ2VuZFJlY3QgPSBsZWdlbmRDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBuZXh0SGVpZ2h0ID0gTWF0aC5taW4oXG4gICAgICAgICAgbWFwUm9vdEJvdW5kcy5ib3R0b20gLSAobGVnZW5kUmVjdC50b3AgKyBNQVBfQ09OVFJPTF9IRUFERVJfRlVMTF9IRUlHSFQgKyBNQVJHSU4uYm90dG9tKSxcbiAgICAgICAgICBNYXRoLm1heChNSU5fQ09OVEVOVF9IRUlHSFQsIHN0YXJ0SGVpZ2h0UmVmLmN1cnJlbnQgKyBkZWx0YVkpXG4gICAgICAgICk7XG4gICAgICAgIG9uQ2hhbmdlU2V0dGluZ3Moe2NvbnRlbnRIZWlnaHQ6IG5leHRIZWlnaHR9KTtcbiAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHQgPiAwICYmIHBvcy5hbmNob3JZID09PSAnYm90dG9tJykge1xuICAgICAgICAgIG9uQ2hhbmdlU2V0dGluZ3Moe3Bvc2l0aW9uOiB7Li4ucG9zLCB5OiBwb3MueSAtIChuZXh0SGVpZ2h0IC0gY29udGVudEhlaWdodCl9fSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbY29udGVudEhlaWdodCwgcG9zLCBvbkNoYW5nZVNldHRpbmdzXVxuICApO1xuXG4gIC8vIFNoaWZ0IHdoZW4gc2lkZSBwYW5lbCBpcyBzaG93bi9oaWRkZW5cbiAgY29uc3QgcG9zUmVmID0gdXNlUmVmKHBvcyk7XG4gIHBvc1JlZi5jdXJyZW50ID0gcG9zO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBwb3NSZWYuY3VycmVudDtcbiAgICBpZiAoY3VycmVudFBvcy5hbmNob3JYID09PSAnbGVmdCcpIHtcbiAgICAgIGlmIChpc1NpZGVQYW5lbFNob3duKSB7XG4gICAgICAgIGlmIChjdXJyZW50UG9zLnggPD0gc2lkZVBhbmVsV2lkdGggKyBNQVJHSU4ubGVmdCkge1xuICAgICAgICAgIG9uQ2hhbmdlU2V0dGluZ3Moe3Bvc2l0aW9uOiB7Li4uY3VycmVudFBvcywgeDogc2lkZVBhbmVsV2lkdGggKyBNQVJHSU4ubGVmdH19KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25DaGFuZ2VTZXR0aW5ncyh7XG4gICAgICAgICAgcG9zaXRpb246IHsuLi5jdXJyZW50UG9zLCB4OiBNYXRoLm1heChNQVJHSU4ubGVmdCwgY3VycmVudFBvcy54IC0gc2lkZVBhbmVsV2lkdGgpfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtpc1NpZGVQYW5lbFNob3duLCBvbkNoYW5nZVNldHRpbmdzLCBzaWRlUGFuZWxXaWR0aF0pO1xuXG4gIHJldHVybiB7cG9zaXRpb25TdHlsZXMsIHVwZGF0ZVBvc2l0aW9uLCBjb250ZW50SGVpZ2h0LCBzdGFydFJlc2l6ZSwgcmVzaXplfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQThELFNBQUFDLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdB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