UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

288 lines (286 loc) 41.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getChildPos = exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _lodash = _interopRequireDefault(require("lodash.debounce")); var _lodash2 = _interopRequireDefault(require("lodash.isequal")); var _exenv = require("exenv"); var _styledComponents = require("styled-components"); var _context = require("../context"); var _reactModal = _interopRequireDefault(require("react-modal")); var _window = _interopRequireDefault(require("global/window")); var _styles = require("@kepler.gl/styles"); 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 _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } 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 listeners = {}; var startListening = function startListening() { return Object.keys(listeners).forEach(function (key) { return listeners[key](); }); }; var getPageOffset = function getPageOffset() { return { x: _window["default"].pageXOffset !== undefined ? _window["default"].pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft, y: _window["default"].pageYOffset !== undefined ? _window["default"].pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop }; }; var addEventListeners = function addEventListeners() { if (document && document.body) document.body.addEventListener('mousewheel', (0, _lodash["default"])(startListening, 100, { leading: true })); _window["default"].addEventListener('resize', (0, _lodash["default"])(startListening, 50, { leading: true })); }; var getChildPos = exports.getChildPos = function getChildPos(_ref) { var offsets = _ref.offsets, rect = _ref.rect, childRect = _ref.childRect, pageOffset = _ref.pageOffset, padding = _ref.padding; var topOffset = offsets.topOffset, leftOffset = offsets.leftOffset, rightOffset = offsets.rightOffset; var anchorLeft = leftOffset !== undefined; var pos = _objectSpread({ top: pageOffset.y + rect.top + (topOffset || 0) }, anchorLeft ? { left: pageOffset.x + rect.left + (leftOffset || 0) } : { right: _window["default"].innerWidth - rect.right - pageOffset.x + (rightOffset || 0) }); var leftOrRight = anchorLeft ? 'left' : 'right'; if (pos[leftOrRight] && pos[leftOrRight] < 0) { pos[leftOrRight] = padding; } else if (pos[leftOrRight] && pos[leftOrRight] + childRect.width > _window["default"].innerWidth) { pos[leftOrRight] = _window["default"].innerWidth - childRect.width - padding; } if (pos.top < 0) { pos.top = padding; } else if (pos.top + childRect.height > _window["default"].innerHeight) { pos.top = _window["default"].innerHeight - childRect.height - padding; } return pos; }; if (_exenv.canUseDOM) { if (document.body) { addEventListeners(); } else { document.addEventListener('DOMContentLoaded', addEventListeners); } } var listenerIdCounter = 0; function subscribe(fn) { listenerIdCounter += 1; var id = listenerIdCounter; listeners[id] = fn; return function () { return delete listeners[id]; }; } var defaultModalStyle = { content: { top: 0, left: 0, border: 0, right: 'auto', bottom: 'auto', padding: '0px 0px 0px 0px' }, overlay: { right: 'auto', bottom: 'auto', width: '100vw', height: '100vh', backgroundColor: 'rgba(0, 0, 0, 0)' } }; var WINDOW_PAD = 40; var noop = function noop() { return; }; var DefaultComponent = 'div'; var Portaled = /*#__PURE__*/function (_Component) { function Portaled() { var _this; (0, _classCallCheck2["default"])(this, Portaled); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, Portaled, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", { pos: null, isVisible: false }); (0, _defineProperty2["default"])(_this, "unsubscribe", undefined); (0, _defineProperty2["default"])(_this, "_unmounted", false); (0, _defineProperty2["default"])(_this, "element", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "child", /*#__PURE__*/(0, _react.createRef)()); // eslint-disable-next-line complexity (0, _defineProperty2["default"])(_this, "handleScroll", function () { if (_this.child.current && _this.element.current) { var rect = _this.element.current.getBoundingClientRect(); var childRect = _this.child.current.getBoundingClientRect(); var pageOffset = getPageOffset(); var _this$props = _this.props, topOffset = _this$props.top, _this$props$left = _this$props.left, leftOffset = _this$props$left === void 0 ? 0 : _this$props$left, rightOffset = _this$props.right; var pos = getChildPos({ offsets: { topOffset: topOffset, leftOffset: leftOffset, rightOffset: rightOffset }, rect: rect, childRect: childRect, pageOffset: pageOffset, padding: WINDOW_PAD }); if (!(0, _lodash2["default"])(pos, _this.state.pos)) { _this.setState({ pos: pos }); } } }); return _this; } (0, _inherits2["default"])(Portaled, _Component); return (0, _createClass2["default"])(Portaled, [{ key: "componentDidMount", value: function componentDidMount() { this._unmounted = false; // relative this.unsubscribe = subscribe(this.handleScroll); this.handleScroll(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this2 = this; var didOpen = this.props.isOpened && !prevProps.isOpened; var didClose = !this.props.isOpened && prevProps.isOpened; if (didOpen || didClose) { _window["default"].requestAnimationFrame(function () { if (_this2._unmounted) return; _this2.setState({ isVisible: Boolean(didOpen) }); }); } this.handleScroll(); } // ColorPicker will throw a cross-origin error when it is closed // when the app is within an iframe. // This is a known issue of react-color component: // see: https://github.com/casesandberg/react-color/issues/806 }, { key: "componentDidCatch", value: function componentDidCatch() { // Do nothing here, since React will try to recreate this component // tree from scratch using the error boundary, which is this component // itself. This is a temporal fix for a crash. } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this._unmounted = true; // @ts-ignore this.unsubscribe(); } }, { key: "render", value: function render() { var _this3 = this; var _this$props2 = this.props, _this$props2$componen = _this$props2.component, component = _this$props2$componen === void 0 ? DefaultComponent : _this$props2$componen, overlayZIndex = _this$props2.overlayZIndex, isOpened = _this$props2.isOpened, onClose = _this$props2.onClose, children = _this$props2.children, modalProps = _this$props2.modalProps, _this$props2$modalSty = _this$props2.modalStyle, modalStyle = _this$props2$modalSty === void 0 ? {} : _this$props2$modalSty; var _this$state = this.state, isVisible = _this$state.isVisible, pos = _this$state.pos; var newModalStyle = _objectSpread(_objectSpread({}, defaultModalStyle), {}, { content: _objectSpread({}, modalStyle.content || {}), overlay: _objectSpread(_objectSpread(_objectSpread({}, defaultModalStyle.overlay), modalStyle.overlay || {}), {}, { // needs to be on top of existing modal zIndex: overlayZIndex || 9999 }) }); var Comp = component; return /*#__PURE__*/_react["default"].createElement(_context.RootContext.Consumer, null, function (context) { return /*#__PURE__*/_react["default"].createElement(Comp, { ref: _this3.element }, isOpened ? /*#__PURE__*/_react["default"].createElement(_reactModal["default"], (0, _extends2["default"])({ className: "modal-portal" }, modalProps, { ariaHideApp: false, isOpen: true, style: newModalStyle, parentSelector: function parentSelector() { // React modal issue: https://github.com/reactjs/react-modal/issues/769 // failed to execute removeChild on parent node when it is already unmounted return context && context.current || document.body; }, onRequestClose: onClose }), /*#__PURE__*/_react["default"].createElement("div", { className: "portaled-content", key: "item", style: _objectSpread({ position: 'fixed', opacity: isVisible ? 1 : 0, transition: _this3.props.theme.transitionFast, marginTop: isVisible ? '0px' : '14px' }, pos) }, /*#__PURE__*/_react["default"].createElement("div", { ref: _this3.child, style: { position: 'absolute', zIndex: overlayZIndex ? overlayZIndex + 1 : 10000 } }, children))) : null); }); } }], [{ key: "getDerivedStateFromError", value: // Make Portaled a component with Error Boundary, so React can recreate // this component if the child 'ColorPicker' throws cross-origin error. // see function componentDidCatch() function getDerivedStateFromError() { return { hasError: true }; } }]); }(_react.Component); (0, _defineProperty2["default"])(Portaled, "defaultProps", { component: DefaultComponent, onClose: noop, theme: _styles.theme }); var _default = exports["default"] = (0, _styledComponents.withTheme)(Portaled); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9sb2Rhc2gyIiwiX2V4ZW52IiwiX3N0eWxlZENvbXBvbmVudHMiLCJfY29udGV4dCIsIl9yZWFjdE1vZGFsIiwiX3dpbmRvdyIsIl9zdHlsZXMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfY2FsbFN1cGVyIiwibyIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImxpc3RlbmVycyIsInN0YXJ0TGlzdGVuaW5nIiwia2V5IiwiZ2V0UGFnZU9mZnNldCIsIngiLCJXaW5kb3ciLCJwYWdlWE9mZnNldCIsInVuZGVmaW5lZCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiYm9keSIsInBhcmVudE5vZGUiLCJzY3JvbGxMZWZ0IiwieSIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwiYWRkRXZlbnRMaXN0ZW5lcnMiLCJhZGRFdmVudExpc3RlbmVyIiwiZGVib3VuY2UiLCJsZWFkaW5nIiwiZ2V0Q2hpbGRQb3MiLCJleHBvcnRzIiwiX3JlZiIsIm9mZnNldHMiLCJyZWN0IiwiY2hpbGRSZWN0IiwicGFnZU9mZnNldCIsInBhZGRpbmciLCJ0b3BPZmZzZXQiLCJsZWZ0T2Zmc2V0IiwicmlnaHRPZmZzZXQiLCJhbmNob3JMZWZ0IiwicG9zIiwidG9wIiwibGVmdCIsInJpZ2h0IiwiaW5uZXJXaWR0aCIsImxlZnRPclJpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJpbm5lckhlaWdodCIsImNhblVzZURPTSIsImxpc3RlbmVySWRDb3VudGVyIiwic3Vic2NyaWJlIiwiZm4iLCJpZCIsImRlZmF1bHRNb2RhbFN0eWxlIiwiY29udGVudCIsImJvcmRlciIsImJvdHRvbSIsIm92ZXJsYXkiLCJiYWNrZ3JvdW5kQ29sb3IiLCJXSU5ET1dfUEFEIiwibm9vcCIsIkRlZmF1bHRDb21wb25lbnQiLCJQb3J0YWxlZCIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNvbmNhdCIsImlzVmlzaWJsZSIsImNyZWF0ZVJlZiIsImNoaWxkIiwiY3VycmVudCIsImVsZW1lbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJfdGhpcyRwcm9wcyIsInByb3BzIiwiX3RoaXMkcHJvcHMkbGVmdCIsImlzRXF1YWwiLCJzdGF0ZSIsInNldFN0YXRlIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJ2YWx1ZSIsImNvbXBvbmVudERpZE1vdW50IiwiX3VubW91bnRlZCIsInVuc3Vic2NyaWJlIiwiaGFuZGxlU2Nyb2xsIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwiX3RoaXMyIiwiZGlkT3BlbiIsImlzT3BlbmVkIiwiZGlkQ2xvc2UiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjb21wb25lbnREaWRDYXRjaCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVuZGVyIiwiX3RoaXMzIiwiX3RoaXMkcHJvcHMyIiwiX3RoaXMkcHJvcHMyJGNvbXBvbmVuIiwiY29tcG9uZW50Iiwib3ZlcmxheVpJbmRleCIsIm9uQ2xvc2UiLCJjaGlsZHJlbiIsIm1vZGFsUHJvcHMiLCJfdGhpcyRwcm9wczIkbW9kYWxTdHkiLCJtb2RhbFN0eWxlIiwiX3RoaXMkc3RhdGUiLCJuZXdNb2RhbFN0eWxlIiwiekluZGV4IiwiQ29tcCIsImNyZWF0ZUVsZW1lbnQiLCJSb290Q29udGV4dCIsIkNvbnN1bWVyIiwiY29udGV4dCIsInJlZiIsIl9leHRlbmRzMiIsImNsYXNzTmFtZSIsImFyaWFIaWRlQXBwIiwiaXNPcGVuIiwic3R5bGUiLCJwYXJlbnRTZWxlY3RvciIsIm9uUmVxdWVzdENsb3NlIiwicG9zaXRpb24iLCJvcGFjaXR5IiwidHJhbnNpdGlvbiIsInRoZW1lIiwidHJhbnNpdGlvbkZhc3QiLCJtYXJnaW5Ub3AiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJoYXNFcnJvciIsIkNvbXBvbmVudCIsIl9kZWZhdWx0Iiwid2l0aFRoZW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi9wb3J0YWxlZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWYsIFByb3BzV2l0aENoaWxkcmVufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC5pc2VxdWFsJztcblxuaW1wb3J0IHtjYW5Vc2VET019IGZyb20gJ2V4ZW52JztcbmltcG9ydCB7d2l0aFRoZW1lfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge1Jvb3RDb250ZXh0fSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCBNb2RhbCBmcm9tICdyZWFjdC1tb2RhbCc7XG5pbXBvcnQgV2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHt0aGVtZX0gZnJvbSAnQGtlcGxlci5nbC9zdHlsZXMnO1xuXG5jb25zdCBsaXN0ZW5lcnMgPSB7fTtcblxuY29uc3Qgc3RhcnRMaXN0ZW5pbmcgPSAoKSA9PiBPYmplY3Qua2V5cyhsaXN0ZW5lcnMpLmZvckVhY2goa2V5ID0+IGxpc3RlbmVyc1trZXldKCkpO1xuXG5jb25zdCBnZXRQYWdlT2Zmc2V0ID0gKCkgPT4gKHtcbiAgeDpcbiAgICBXaW5kb3cucGFnZVhPZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBXaW5kb3cucGFnZVhPZmZzZXRcbiAgICAgIDogKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxcbiAgeTpcbiAgICBXaW5kb3cucGFnZVlPZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBXaW5kb3cucGFnZVlPZmZzZXRcbiAgICAgIDogKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wXG59KTtcblxuY29uc3QgYWRkRXZlbnRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC5ib2R5KVxuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIGRlYm91bmNlKHN0YXJ0TGlzdGVuaW5nLCAxMDAsIHtsZWFkaW5nOiB0cnVlfSkpO1xuICBXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZGVib3VuY2Uoc3RhcnRMaXN0ZW5pbmcsIDUwLCB7bGVhZGluZzogdHJ1ZX0pKTtcbn07XG5cbmludGVyZmFjZSBHZXRDaGlsZFBvc1Byb3BzIHtcbiAgb2Zmc2V0czogUGFydGlhbDx7XG4gICAgdG9wT2Zmc2V0OiBudW1iZXI7XG4gICAgbGVmdE9mZnNldDogbnVtYmVyO1xuICAgIHJpZ2h0T2Zmc2V0OiBudW1iZXI7XG4gIH0+O1xuICByZWN0OiBET01SZWN0O1xuICBjaGlsZFJlY3Q6IERPTVJlY3Q7XG4gIHBhZ2VPZmZzZXQ6IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9O1xuICBwYWRkaW5nOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDaGlsZFBvcyA9ICh7b2Zmc2V0cywgcmVjdCwgY2hpbGRSZWN0LCBwYWdlT2Zmc2V0LCBwYWRkaW5nfTogR2V0Q2hpbGRQb3NQcm9wcykgPT4ge1xuICBjb25zdCB7dG9wT2Zmc2V0LCBsZWZ0T2Zmc2V0LCByaWdodE9mZnNldH0gPSBvZmZzZXRzO1xuXG4gIGNvbnN0IGFuY2hvckxlZnQgPSBsZWZ0T2Zmc2V0ICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHBvcyA9IHtcbiAgICB0b3A6IHBhZ2VPZmZzZXQueSArIHJlY3QudG9wICsgKHRvcE9mZnNldCB8fCAwKSxcbiAgICAuLi4oYW5jaG9yTGVmdFxuICAgICAgPyB7bGVmdDogcGFnZU9mZnNldC54ICsgcmVjdC5sZWZ0ICsgKGxlZnRPZmZzZXQgfHwgMCl9XG4gICAgICA6IHtyaWdodDogV2luZG93LmlubmVyV2lkdGggLSByZWN0LnJpZ2h0IC0gcGFnZU9mZnNldC54ICsgKHJpZ2h0T2Zmc2V0IHx8IDApfSlcbiAgfTtcblxuICBjb25zdCBsZWZ0T3JSaWdodCA9IGFuY2hvckxlZnQgPyAnbGVmdCcgOiAncmlnaHQnO1xuXG4gIGlmIChwb3NbbGVmdE9yUmlnaHRdICYmIHBvc1tsZWZ0T3JSaWdodF0gPCAwKSB7XG4gICAgcG9zW2xlZnRPclJpZ2h0XSA9IHBhZGRpbmc7XG4gIH0gZWxzZSBpZiAocG9zW2xlZnRPclJpZ2h0XSAmJiBwb3NbbGVmdE9yUmlnaHRdICsgY2hpbGRSZWN0LndpZHRoID4gV2luZG93LmlubmVyV2lkdGgpIHtcbiAgICBwb3NbbGVmdE9yUmlnaHRdID0gV2luZG93LmlubmVyV2lkdGggLSBjaGlsZFJlY3Qud2lkdGggLSBwYWRkaW5nO1xuICB9XG5cbiAgaWYgKHBvcy50b3AgPCAwKSB7XG4gICAgcG9zLnRvcCA9IHBhZGRpbmc7XG4gIH0gZWxzZSBpZiAocG9zLnRvcCArIGNoaWxkUmVjdC5oZWlnaHQgPiBXaW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICBwb3MudG9wID0gV2luZG93LmlubmVySGVpZ2h0IC0gY2hpbGRSZWN0LmhlaWdodCAtIHBhZGRpbmc7XG4gIH1cblxuICByZXR1cm4gcG9zO1xufTtcblxuaWYgKGNhblVzZURPTSkge1xuICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgIGFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGFkZEV2ZW50TGlzdGVuZXJzKTtcbiAgfVxufVxuXG5sZXQgbGlzdGVuZXJJZENvdW50ZXIgPSAwO1xuZnVuY3Rpb24gc3Vic2NyaWJlKGZuKSB7XG4gIGxpc3RlbmVySWRDb3VudGVyICs9IDE7XG4gIGNvbnN0IGlkID0gbGlzdGVuZXJJZENvdW50ZXI7XG4gIGxpc3RlbmVyc1tpZF0gPSBmbjtcbiAgcmV0dXJuICgpID0+IGRlbGV0ZSBsaXN0ZW5lcnNbaWRdO1xufVxuXG5jb25zdCBkZWZhdWx0TW9kYWxTdHlsZSA9IHtcbiAgY29udGVudDoge1xuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIGJvcmRlcjogMCxcbiAgICByaWdodDogJ2F1dG8nLFxuICAgIGJvdHRvbTogJ2F1dG8nLFxuICAgIHBhZGRpbmc6ICcwcHggMHB4IDBweCAwcHgnXG4gIH0sXG4gIG92ZXJsYXk6IHtcbiAgICByaWdodDogJ2F1dG8nLFxuICAgIGJvdHRvbTogJ2F1dG8nLFxuICAgIHdpZHRoOiAnMTAwdncnLFxuICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJ1xuICB9XG59O1xuXG5jb25zdCBXSU5ET1dfUEFEID0gNDA7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7XG4gIHJldHVybjtcbn07XG5cbnR5cGUgUG9ydGFsZWRQcm9wcyA9IFByb3BzV2l0aENoaWxkcmVuPHtcbiAgcmlnaHQ/OiBudW1iZXI7XG4gIGxlZnQ/OiBudW1iZXI7XG4gIHRvcD86IG51bWJlcjtcbiAgY29tcG9uZW50PzogUmVhY3QuRWxlbWVudFR5cGU8YW55PjtcbiAgb25DbG9zZT86IChcbiAgICBldmVudDogUmVhY3QuTW91c2VFdmVudDxFbGVtZW50LCBnbG9iYWxUaGlzLk1vdXNlRXZlbnQ+IHwgUmVhY3QuS2V5Ym9hcmRFdmVudDxFbGVtZW50PlxuICApID0+IHZvaWQ7XG4gIHRvcE9mZnNldD86IG51bWJlcjtcbiAgbGVmdE9mZnNldD86IG51bWJlcjtcbiAgcmlnaHRPZmZzZXQ/OiBudW1iZXI7XG4gIG92ZXJsYXlaSW5kZXg/OiBudW1iZXI7XG4gIGlzT3BlbmVkPzogYm9vbGVhbjtcbiAgbW9kYWxQcm9wcz86IFBhcnRpYWw8UmVhY3RNb2RhbC5Qcm9wcz47XG4gIG1vZGFsU3R5bGU/OiBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0TW9kYWxTdHlsZT47XG4gIHRoZW1lPzogYW55O1xufT47XG5cbmludGVyZmFjZSBQb3J0YWxlZFN0YXRlIHtcbiAgcG9zOlxuICAgIHwge1xuICAgICAgICBsZWZ0OiBudW1iZXI7XG4gICAgICAgIHRvcDogbnVtYmVyO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICByaWdodDogbnVtYmVyO1xuICAgICAgICB0b3A6IG51bWJlcjtcbiAgICAgIH1cbiAgICB8IG51bGw7XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbn1cblxuY29uc3QgRGVmYXVsdENvbXBvbmVudCA9ICdkaXYnO1xuXG5jbGFzcyBQb3J0YWxlZCBleHRlbmRzIENvbXBvbmVudDxQb3J0YWxlZFByb3BzLCBQb3J0YWxlZFN0YXRlPiB7XG4gIC8vIE1ha2UgUG9ydGFsZWQgYSBjb21wb25lbnQgd2l0aCBFcnJvciBCb3VuZGFyeSwgc28gUmVhY3QgY2FuIHJlY3JlYXRlXG4gIC8vIHRoaXMgY29tcG9uZW50IGlmIHRoZSBjaGlsZCAnQ29sb3JQaWNrZXInIHRocm93cyBjcm9zcy1vcmlnaW4gZXJyb3IuXG4gIC8vIHNlZSBmdW5jdGlvbiBjb21wb25lbnREaWRDYXRjaCgpXG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKToge2hhc0Vycm9yOiBib29sZWFufSB7XG4gICAgcmV0dXJuIHtoYXNFcnJvcjogdHJ1ZX07XG4gIH1cblxuICBzdGF0aWMgZGVmYXVsdFByb3BzOiBQb3J0YWxlZFByb3BzID0ge1xuICAgIGNvbXBvbmVudDogRGVmYXVsdENvbXBvbmVudCxcbiAgICBvbkNsb3NlOiBub29wLFxuICAgIHRoZW1lXG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgcG9zOiBudWxsLFxuICAgIGlzVmlzaWJsZTogZmFsc2VcbiAgfTtcblxuICB1bnN1YnNjcmliZTogKCgpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBfdW5tb3VudGVkID0gZmFsc2U7XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5fdW5tb3VudGVkID0gZmFsc2U7XG4gICAgLy8gcmVsYXRpdmVcbiAgICB0aGlzLnVuc3Vic2NyaWJlID0gc3Vic2NyaWJlKHRoaXMuaGFuZGxlU2Nyb2xsKTtcbiAgICB0aGlzLmhhbmRsZVNjcm9sbCgpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogUG9ydGFsZWRQcm9wcykge1xuICAgIGNvbnN0IGRpZE9wZW4gPSB0aGlzLnByb3BzLmlzT3BlbmVkICYmICFwcmV2UHJvcHMuaXNPcGVuZWQ7XG4gICAgY29uc3QgZGlkQ2xvc2UgPSAhdGhpcy5wcm9wcy5pc09wZW5lZCAmJiBwcmV2UHJvcHMuaXNPcGVuZWQ7XG4gICAgaWYgKGRpZE9wZW4gfHwgZGlkQ2xvc2UpIHtcbiAgICAgIFdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdW5tb3VudGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzVmlzaWJsZTogQm9vbGVhbihkaWRPcGVuKX0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVTY3JvbGwoKTtcbiAgfVxuXG4gIC8vIENvbG9yUGlja2VyIHdpbGwgdGhyb3cgYSBjcm9zcy1vcmlnaW4gZXJyb3Igd2hlbiBpdCBpcyBjbG9zZWRcbiAgLy8gd2hlbiB0aGUgYXBwIGlzIHdpdGhpbiBhbiBpZnJhbWUuXG4gIC8vIFRoaXMgaXMgYSBrbm93biBpc3N1ZSBvZiByZWFjdC1jb2xvciBjb21wb25lbnQ6XG4gIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Nhc2VzYW5kYmVyZy9yZWFjdC1jb2xvci9pc3N1ZXMvODA2XG4gIGNvbXBvbmVudERpZENhdGNoKCkge1xuICAgIC8vIERvIG5vdGhpbmcgaGVyZSwgc2luY2UgUmVhY3Qgd2lsbCB0cnkgdG8gcmVjcmVhdGUgdGhpcyBjb21wb25lbnRcbiAgICAvLyB0cmVlIGZyb20gc2NyYXRjaCB1c2luZyB0aGUgZXJyb3IgYm91bmRhcnksIHdoaWNoIGlzIHRoaXMgY29tcG9uZW50XG4gICAgLy8gaXRzZWxmLiBUaGlzIGlzIGEgdGVtcG9yYWwgZml4IGZvciBhIGNyYXNoLlxuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5fdW5tb3VudGVkID0gdHJ1ZTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZWxlbWVudCA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgY2hpbGQgPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgaGFuZGxlU2Nyb2xsID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLmNoaWxkLmN1cnJlbnQgJiYgdGhpcy5lbGVtZW50LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsZW1lbnQuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNoaWxkUmVjdCA9IHRoaXMuY2hpbGQuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHBhZ2VPZmZzZXQgPSBnZXRQYWdlT2Zmc2V0KCk7XG4gICAgICBjb25zdCB7dG9wOiB0b3BPZmZzZXQsIGxlZnQ6IGxlZnRPZmZzZXQgPSAwLCByaWdodDogcmlnaHRPZmZzZXR9ID0gdGhpcy5wcm9wcztcblxuICAgICAgY29uc3QgcG9zID0gZ2V0Q2hpbGRQb3Moe1xuICAgICAgICBvZmZzZXRzOiB7dG9wT2Zmc2V0LCBsZWZ0T2Zmc2V0LCByaWdodE9mZnNldH0sXG4gICAgICAgIHJlY3QsXG4gICAgICAgIGNoaWxkUmVjdCxcbiAgICAgICAgcGFnZU9mZnNldCxcbiAgICAgICAgcGFkZGluZzogV0lORE9XX1BBRFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghaXNFcXVhbChwb3MsIHRoaXMuc3RhdGUucG9zKSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtwb3N9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBjb25zdCB7XG4gICAgICAvLyByZWxhdGl2ZVxuICAgICAgY29tcG9uZW50ID0gRGVmYXVsdENvbXBvbmVudCxcbiAgICAgIG92ZXJsYXlaSW5kZXgsXG4gICAgICBpc09wZW5lZCxcbiAgICAgIG9uQ2xvc2UsXG5cbiAgICAgIC8vIE1vZGFsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIG1vZGFsUHJvcHMsXG4gICAgICBtb2RhbFN0eWxlID0ge31cbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IHtpc1Zpc2libGUsIHBvc30gPSB0aGlzLnN0YXRlO1xuXG4gICAgY29uc3QgbmV3TW9kYWxTdHlsZSA9IHtcbiAgICAgIC4uLmRlZmF1bHRNb2RhbFN0eWxlLFxuICAgICAgY29udGVudDoge1xuICAgICAgICAuLi4obW9kYWxTdHlsZS5jb250ZW50IHx8IHt9KVxuICAgICAgfSxcbiAgICAgIG92ZXJsYXk6IHtcbiAgICAgICAgLi4uZGVmYXVsdE1vZGFsU3R5bGUub3ZlcmxheSxcbiAgICAgICAgLi4uKG1vZGFsU3R5bGUub3ZlcmxheSB8fCB7fSksXG4gICAgICAgIC8vIG5lZWRzIHRvIGJlIG9uIHRvcCBvZiBleGlzdGluZyBtb2RhbFxuICAgICAgICB6SW5kZXg6IG92ZXJsYXlaSW5kZXggfHwgOTk5OVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBDb21wID0gY29tcG9uZW50O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxSb290Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAge2NvbnRleHQgPT4gKFxuICAgICAgICAgIDxDb21wIHJlZj17dGhpcy5lbGVtZW50fT5cbiAgICAgICAgICAgIHtpc09wZW5lZCA/IChcbiAgICAgICAgICAgICAgPE1vZGFsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibW9kYWwtcG9ydGFsXCJcbiAgICAgICAgICAgICAgICB7Li4ubW9kYWxQcm9wc31cbiAgICAgICAgICAgICAgICBhcmlhSGlkZUFwcD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgaXNPcGVuXG4gICAgICAgICAgICAgICAgc3R5bGU9e25ld01vZGFsU3R5bGV9XG4gICAgICAgICAgICAgICAgcGFyZW50U2VsZWN0b3I9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFJlYWN0IG1vZGFsIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC1tb2RhbC9pc3N1ZXMvNzY5XG4gICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gZXhlY3V0ZSByZW1vdmVDaGlsZCBvbiBwYXJlbnQgbm9kZSB3aGVuIGl0IGlzIGFscmVhZHkgdW5tb3VudGVkXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGNvbnRleHQgJiYgY29udGV4dC5jdXJyZW50KSB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgb25SZXF1ZXN0Q2xvc2U9e29uQ2xvc2V9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJwb3J0YWxlZC1jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgIGtleT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IGlzVmlzaWJsZSA/IDEgOiAwLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnByb3BzLnRoZW1lLnRyYW5zaXRpb25GYXN0LFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IGlzVmlzaWJsZSA/ICcwcHgnIDogJzE0cHgnLFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIC4uLnBvc1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHJlZj17dGhpcy5jaGlsZH1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IG92ZXJsYXlaSW5kZXggPyBvdmVybGF5WkluZGV4ICsgMSA6IDEwMDAwXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L01vZGFsPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPC9Db21wPlxuICAgICAgICApfVxuICAgICAgPC9Sb290Q29udGV4dC5Db25zdW1lcj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhUaGVtZShQb3J0YWxlZCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGlCQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxRQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxXQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxPQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxPQUFBLEdBQUFULE9BQUE7QUFBd0MsU0FBQVUseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFaLHdCQUFBWSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFL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