kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
181 lines (173 loc) • 26.2 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ContainerFactory = ContainerFactory;
exports["default"] = exports.appInjector = exports.ERROR_MSG = void 0;
exports.injectComponents = injectComponents;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _reactRedux = require("react-redux");
var _window = require("global/window");
var _injector = require("./injector");
var _keplerGl = _interopRequireDefault(require("./kepler-gl"));
var _actions = require("@kepler.gl/actions");
var _utils = require("@kepler.gl/utils");
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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var ERROR_MSG = exports.ERROR_MSG = {
noState: "kepler.gl state does not exist. " + "You might forget to mount keplerGlReducer in your root reducer." + "If it is not mounted as state.keplerGl by default, you need to provide getState as a prop"
};
var mapStateToProps = function mapStateToProps(state, props) {
return _objectSpread({
state: state
}, props);
};
var dispatchToProps = function dispatchToProps(dispatch) {
return {
dispatch: dispatch
};
};
var connector = (0, _reactRedux.connect)(mapStateToProps, dispatchToProps);
ContainerFactory.deps = [_keplerGl["default"]];
function ContainerFactory(KeplerGl) {
/** @lends KeplerGl */
/**
* Main Kepler.gl Component
* @param {Object} props
*
* @param {string} props.id - _required_
*
* - Default: `map`
* The id of this KeplerGl instance. `id` is required if you have multiple
* KeplerGl instances in your app. It defines the prop name of the KeplerGl state that is
* stored in the KeplerGl reducer. For example, the state of the KeplerGl component with id `foo` is
* stored in `state.keplerGl.foo`.
*
* In case you create multiple kepler.gl instances using the same id, the kepler.gl state defined by the entry will be
* overridden by the latest instance and reset to a blank state.
* @param {string} props.mapboxApiAccessToken - _required_
* @param {string} props.mapboxApiUrl - _optional_
* @param {Boolean} props.mapStylesReplaceDefault - _optional_
* @param {object} props.initialUiState - _optional_
* You can create a free account at [www.mapbox.com](www.mapbox.com) and create a token at
* [www.mapbox.com/account/access-tokens](www.mapbox.com/account/access-tokens)
*
*
* @param {Number} props.width - _required_ Width of the KeplerGl UI.
* @public
*/
function usePreviousId(value) {
var ref = (0, _react.useRef)();
(0, _react.useEffect)(function () {
ref.current = value;
});
return ref.current;
}
var Container = function Container(props) {
var _props$id = props.id,
id = _props$id === void 0 ? 'map' : _props$id,
_props$getState = props.getState,
getState = _props$getState === void 0 ? function (state) {
return state.keplerGl;
} : _props$getState,
_props$mint = props.mint,
mint = _props$mint === void 0 ? true : _props$mint,
mapboxApiAccessToken = props.mapboxApiAccessToken,
mapboxApiUrl = props.mapboxApiUrl,
mapStylesReplaceDefault = props.mapStylesReplaceDefault,
initialUiState = props.initialUiState,
state = props.state;
var prevId = usePreviousId(id);
var dispatch = (0, _reactRedux.useDispatch)();
(0, _react.useEffect)(function () {
// add a new entry to reducer
dispatch((0, _actions.registerEntry)({
id: id,
mint: mint,
mapboxApiAccessToken: mapboxApiAccessToken,
mapboxApiUrl: mapboxApiUrl,
mapStylesReplaceDefault: mapStylesReplaceDefault,
initialUiState: initialUiState
}));
// initialize plugins
if ((0, _utils.getApplicationConfig)().plugins.length) {
(0, _utils.getApplicationConfig)().plugins.forEach( /*#__PURE__*/function () {
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(plugin) {
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return plugin.init();
case 2:
case "end":
return _context.stop();
}
}, _callee);
}));
return function (_x) {
return _ref.apply(this, arguments);
};
}());
}
// cleanup
return function () {
if (mint !== false) {
// delete entry in reducer
dispatch((0, _actions.deleteEntry)(id));
}
};
}, [id, dispatch, initialUiState, mapStylesReplaceDefault, mapboxApiAccessToken, mapboxApiUrl, mint]);
(0, _react.useEffect)(function () {
// check if id has changed, if true, copy state over
if (prevId && id && prevId !== id) {
dispatch((0, _actions.renameEntry)(prevId, id));
}
}, [dispatch, prevId, id]);
var stateSelector = (0, _react.useMemo)(function () {
return function (keplerState) {
if (!getState(keplerState)) {
// log error
_window.console.error(ERROR_MSG.noState);
return null;
}
return getState(keplerState)[id];
};
}, [id, getState]);
var forwardDispatch = (0, _react.useMemo)(function () {
return (0, _actions.forwardTo)(id, dispatch);
}, [id, dispatch]);
// const selector = getSelector(id, getState);
if (!stateSelector || !stateSelector(state)) {
// instance state hasn't been mounted yet
return /*#__PURE__*/_react["default"].createElement("div", null);
}
return /*#__PURE__*/_react["default"].createElement(KeplerGl, (0, _extends2["default"])({}, props, {
id: id,
selector: stateSelector,
dispatch: forwardDispatch
}));
};
return connector(Container);
}
var allDependencies = (0, _injector.flattenDeps)([], ContainerFactory);
// provide all dependencies to appInjector
var appInjector = exports.appInjector = allDependencies.reduce(function (inj, factory) {
return inj.provide(factory, factory);
}, (0, _injector.injector)());
// Helper to inject custom components and return kepler.gl container
function injectComponents() {
var recipes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
return (0, _injector.provideRecipesToInjector)(recipes, appInjector).get(ContainerFactory);
}
var InjectedContainer = appInjector.get(ContainerFactory);
var _default = exports["default"] = InjectedContainer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl93aW5kb3ciLCJfaW5qZWN0b3IiLCJfa2VwbGVyR2wiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2FjdGlvbnMiLCJfdXRpbHMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJFUlJPUl9NU0ciLCJleHBvcnRzIiwibm9TdGF0ZSIsIm1hcFN0YXRlVG9Qcm9wcyIsInN0YXRlIiwicHJvcHMiLCJkaXNwYXRjaFRvUHJvcHMiLCJkaXNwYXRjaCIsImNvbm5lY3RvciIsImNvbm5lY3QiLCJDb250YWluZXJGYWN0b3J5IiwiZGVwcyIsIktlcGxlckdsRmFjdG9yeSIsIktlcGxlckdsIiwidXNlUHJldmlvdXNJZCIsInZhbHVlIiwicmVmIiwidXNlUmVmIiwidXNlRWZmZWN0IiwiY3VycmVudCIsIkNvbnRhaW5lciIsIl9wcm9wcyRpZCIsImlkIiwiX3Byb3BzJGdldFN0YXRlIiwiZ2V0U3RhdGUiLCJrZXBsZXJHbCIsIl9wcm9wcyRtaW50IiwibWludCIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwibWFwU3R5bGVzUmVwbGFjZURlZmF1bHQiLCJpbml0aWFsVWlTdGF0ZSIsInByZXZJZCIsInVzZURpc3BhdGNoIiwicmVnaXN0ZXJFbnRyeSIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwicGx1Z2lucyIsIl9yZWYiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInBsdWdpbiIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJpbml0Iiwic3RvcCIsIl94IiwiZGVsZXRlRW50cnkiLCJyZW5hbWVFbnRyeSIsInN0YXRlU2VsZWN0b3IiLCJ1c2VNZW1vIiwia2VwbGVyU3RhdGUiLCJDb25zb2xlIiwiZXJyb3IiLCJmb3J3YXJkRGlzcGF0Y2giLCJmb3J3YXJkVG8iLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwic2VsZWN0b3IiLCJhbGxEZXBlbmRlbmNpZXMiLCJmbGF0dGVuRGVwcyIsImFwcEluamVjdG9yIiwicmVkdWNlIiwiaW5qIiwiZmFjdG9yeSIsInByb3ZpZGUiLCJpbmplY3RvciIsImluamVjdENvbXBvbmVudHMiLCJyZWNpcGVzIiwidW5kZWZpbmVkIiwicHJvdmlkZVJlY2lwZXNUb0luamVjdG9yIiwiSW5qZWN0ZWRDb250YWluZXIiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9jb250YWluZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZVJlZiwgQ29tcG9uZW50VHlwZSwgRGlzcGF0Y2gsIHVzZUVmZmVjdCwgdXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtjb25uZWN0LCBDb25uZWN0ZWRQcm9wcywgdXNlRGlzcGF0Y2h9IGZyb20gJ3JlYWN0LXJlZHV4JztcblxuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHtpbmplY3RvciwgcHJvdmlkZVJlY2lwZXNUb0luamVjdG9yLCBmbGF0dGVuRGVwc30gZnJvbSAnLi9pbmplY3Rvcic7XG5pbXBvcnQgS2VwbGVyR2xGYWN0b3J5IGZyb20gJy4va2VwbGVyLWdsJztcbmltcG9ydCB7cmVnaXN0ZXJFbnRyeSwgZGVsZXRlRW50cnksIHJlbmFtZUVudHJ5LCBmb3J3YXJkVG99IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge0tlcGxlckdsU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuaW1wb3J0IHtnZXRBcHBsaWNhdGlvbkNvbmZpZ30gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBFUlJPUl9NU0cgPSB7XG4gIG5vU3RhdGU6XG4gICAgYGtlcGxlci5nbCBzdGF0ZSBkb2VzIG5vdCBleGlzdC4gYCArXG4gICAgYFlvdSBtaWdodCBmb3JnZXQgdG8gbW91bnQga2VwbGVyR2xSZWR1Y2VyIGluIHlvdXIgcm9vdCByZWR1Y2VyLmAgK1xuICAgIGBJZiBpdCBpcyBub3QgbW91bnRlZCBhcyBzdGF0ZS5rZXBsZXJHbCBieSBkZWZhdWx0LCB5b3UgbmVlZCB0byBwcm92aWRlIGdldFN0YXRlIGFzIGEgcHJvcGBcbn07XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZTogYW55LCBwcm9wczogQ29udGFpbmVyUHJvcHMpID0+ICh7c3RhdGUsIC4uLnByb3BzfSk7XG5jb25zdCBkaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2g6IERpc3BhdGNoPGFueT4pID0+ICh7ZGlzcGF0Y2h9KTtcbmNvbnN0IGNvbm5lY3RvciA9IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBkaXNwYXRjaFRvUHJvcHMpO1xuXG50eXBlIENvbnRhaW5lclByb3BzID0ge1xuICBpZDogc3RyaW5nO1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBtYXBib3hBcGlVcmw/OiBzdHJpbmc7XG4gIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0PzogYm9vbGVhbjtcbiAgaW5pdGlhbFVpU3RhdGU/OiBvYmplY3Q7XG4gIHdpZHRoOiBudW1iZXI7XG4gIG1pbnQ/OiBib29sZWFuO1xuICBnZXRTdGF0ZTogKHN0YXRlOiBhbnkpID0+IEtlcGxlckdsU3RhdGU7XG59O1xuXG50eXBlIFByb3BzRnJvbVJlZHV4ID0gQ29ubmVjdGVkUHJvcHM8dHlwZW9mIGNvbm5lY3Rvcj4gJiBDb250YWluZXJQcm9wcztcblxuQ29udGFpbmVyRmFjdG9yeS5kZXBzID0gW0tlcGxlckdsRmFjdG9yeV07XG5cbmV4cG9ydCBmdW5jdGlvbiBDb250YWluZXJGYWN0b3J5KFxuICBLZXBsZXJHbDogUmV0dXJuVHlwZTx0eXBlb2YgS2VwbGVyR2xGYWN0b3J5PlxuKTogQ29tcG9uZW50VHlwZTxQcm9wc0Zyb21SZWR1eD4ge1xuICAvKiogQGxlbmRzIEtlcGxlckdsICovXG4gIC8qKlxuICAgICogTWFpbiBLZXBsZXIuZ2wgQ29tcG9uZW50XG4gICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcHMuaWQgLSBfcmVxdWlyZWRfXG4gICAgKlxuICAgICogLSBEZWZhdWx0OiBgbWFwYFxuICAgICogVGhlIGlkIG9mIHRoaXMgS2VwbGVyR2wgaW5zdGFuY2UuIGBpZGAgaXMgcmVxdWlyZWQgaWYgeW91IGhhdmUgbXVsdGlwbGVcbiAgICAqIEtlcGxlckdsIGluc3RhbmNlcyBpbiB5b3VyIGFwcC4gSXQgZGVmaW5lcyB0aGUgcHJvcCBuYW1lIG9mIHRoZSBLZXBsZXJHbCBzdGF0ZSB0aGF0IGlzXG4gICAgKiBzdG9yZWQgaW4gdGhlIEtlcGxlckdsIHJlZHVjZXIuIEZvciBleGFtcGxlLCB0aGUgc3RhdGUgb2YgdGhlIEtlcGxlckdsIGNvbXBvbmVudCB3aXRoIGlkIGBmb29gIGlzXG4gICAgKiBzdG9yZWQgaW4gYHN0YXRlLmtlcGxlckdsLmZvb2AuXG4gICAgKlxuICAgICogSW4gY2FzZSB5b3UgY3JlYXRlIG11bHRpcGxlIGtlcGxlci5nbCBpbnN0YW5jZXMgdXNpbmcgdGhlIHNhbWUgaWQsIHRoZSBrZXBsZXIuZ2wgc3RhdGUgZGVmaW5lZCBieSB0aGUgZW50cnkgd2lsbCBiZVxuICAgICogb3ZlcnJpZGRlbiBieSB0aGUgbGF0ZXN0IGluc3RhbmNlIGFuZCByZXNldCB0byBhIGJsYW5rIHN0YXRlLlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BzLm1hcGJveEFwaUFjY2Vzc1Rva2VuIC0gX3JlcXVpcmVkX1xuICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BzLm1hcGJveEFwaVVybCAtIF9vcHRpb25hbF9cbiAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJvcHMubWFwU3R5bGVzUmVwbGFjZURlZmF1bHQgLSBfb3B0aW9uYWxfXG4gICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHMuaW5pdGlhbFVpU3RhdGUgLSBfb3B0aW9uYWxfXG5cbiAgICAqIFlvdSBjYW4gY3JlYXRlIGEgZnJlZSBhY2NvdW50IGF0IFt3d3cubWFwYm94LmNvbV0od3d3Lm1hcGJveC5jb20pIGFuZCBjcmVhdGUgYSB0b2tlbiBhdFxuICAgICogW3d3dy5tYXBib3guY29tL2FjY291bnQvYWNjZXNzLXRva2Vuc10od3d3Lm1hcGJveC5jb20vYWNjb3VudC9hY2Nlc3MtdG9rZW5zKVxuICAgICpcbiAgICAqXG4gICAgKiBAcGFyYW0ge051bWJlcn0gcHJvcHMud2lkdGggLSBfcmVxdWlyZWRfIFdpZHRoIG9mIHRoZSBLZXBsZXJHbCBVSS5cbiAgICAqIEBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gdXNlUHJldmlvdXNJZCh2YWx1ZSkge1xuICAgIGNvbnN0IHJlZiA9IHVzZVJlZigpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZWYuY3VycmVudDtcbiAgfVxuXG4gIGNvbnN0IENvbnRhaW5lcjogUmVhY3QuRkM8UHJvcHNGcm9tUmVkdXg+ID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIC8vIGRlZmF1bHQgaWQgYW5kIGFkZHJlc3MgaWYgbm90IHByb3ZpZGVkXG4gICAgICBpZCA9ICdtYXAnLFxuICAgICAgZ2V0U3RhdGUgPSBzdGF0ZSA9PiBzdGF0ZS5rZXBsZXJHbCxcbiAgICAgIG1pbnQgPSB0cnVlLFxuICAgICAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gICAgICBtYXBib3hBcGlVcmwsXG4gICAgICBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCxcbiAgICAgIGluaXRpYWxVaVN0YXRlLFxuICAgICAgc3RhdGVcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgcHJldklkID0gdXNlUHJldmlvdXNJZChpZCk7XG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIGFkZCBhIG5ldyBlbnRyeSB0byByZWR1Y2VyXG4gICAgICBkaXNwYXRjaChcbiAgICAgICAgcmVnaXN0ZXJFbnRyeSh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgbWludCxcbiAgICAgICAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgICAgICAgICBtYXBib3hBcGlVcmwsXG4gICAgICAgICAgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQsXG4gICAgICAgICAgaW5pdGlhbFVpU3RhdGVcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIGluaXRpYWxpemUgcGx1Z2luc1xuICAgICAgaWYgKGdldEFwcGxpY2F0aW9uQ29uZmlnKCkucGx1Z2lucy5sZW5ndGgpIHtcbiAgICAgICAgZ2V0QXBwbGljYXRpb25Db25maWcoKS5wbHVnaW5zLmZvckVhY2goYXN5bmMgcGx1Z2luID0+IHtcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uaW5pdCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gY2xlYW51cFxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKG1pbnQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgLy8gZGVsZXRlIGVudHJ5IGluIHJlZHVjZXJcbiAgICAgICAgICBkaXNwYXRjaChkZWxldGVFbnRyeShpZCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sIFtcbiAgICAgIGlkLFxuICAgICAgZGlzcGF0Y2gsXG4gICAgICBpbml0aWFsVWlTdGF0ZSxcbiAgICAgIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0LFxuICAgICAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gICAgICBtYXBib3hBcGlVcmwsXG4gICAgICBtaW50XG4gICAgXSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgaWQgaGFzIGNoYW5nZWQsIGlmIHRydWUsIGNvcHkgc3RhdGUgb3ZlclxuICAgICAgaWYgKHByZXZJZCAmJiBpZCAmJiBwcmV2SWQgIT09IGlkKSB7XG4gICAgICAgIGRpc3BhdGNoKHJlbmFtZUVudHJ5KHByZXZJZCwgaWQpKTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIHByZXZJZCwgaWRdKTtcblxuICAgIGNvbnN0IHN0YXRlU2VsZWN0b3IgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4ga2VwbGVyU3RhdGUgPT4ge1xuICAgICAgICBpZiAoIWdldFN0YXRlKGtlcGxlclN0YXRlKSkge1xuICAgICAgICAgIC8vIGxvZyBlcnJvclxuICAgICAgICAgIENvbnNvbGUuZXJyb3IoRVJST1JfTVNHLm5vU3RhdGUpO1xuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFN0YXRlKGtlcGxlclN0YXRlKVtpZF07XG4gICAgICB9LFxuICAgICAgW2lkLCBnZXRTdGF0ZV1cbiAgICApO1xuICAgIGNvbnN0IGZvcndhcmREaXNwYXRjaCA9IHVzZU1lbW8oKCkgPT4gZm9yd2FyZFRvKGlkLCBkaXNwYXRjaCksIFtpZCwgZGlzcGF0Y2hdKTtcblxuICAgIC8vIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoaWQsIGdldFN0YXRlKTtcblxuICAgIGlmICghc3RhdGVTZWxlY3RvciB8fCAhc3RhdGVTZWxlY3RvcihzdGF0ZSkpIHtcbiAgICAgIC8vIGluc3RhbmNlIHN0YXRlIGhhc24ndCBiZWVuIG1vdW50ZWQgeWV0XG4gICAgICByZXR1cm4gPGRpdiAvPjtcbiAgICB9XG5cbiAgICByZXR1cm4gPEtlcGxlckdsIHsuLi5wcm9wc30gaWQ9e2lkfSBzZWxlY3Rvcj17c3RhdGVTZWxlY3Rvcn0gZGlzcGF0Y2g9e2ZvcndhcmREaXNwYXRjaH0gLz47XG4gIH07XG5cbiAgcmV0dXJuIGNvbm5lY3RvcihDb250YWluZXIpO1xufVxuXG5jb25zdCBhbGxEZXBlbmRlbmNpZXMgPSBmbGF0dGVuRGVwcyhbXSwgQ29udGFpbmVyRmFjdG9yeSk7XG5cbi8vIHByb3ZpZGUgYWxsIGRlcGVuZGVuY2llcyB0byBhcHBJbmplY3RvclxuZXhwb3J0IGNvbnN0IGFwcEluamVjdG9yID0gYWxsRGVwZW5kZW5jaWVzLnJlZHVjZShcbiAgKGluaiwgZmFjdG9yeSkgPT4gaW5qLnByb3ZpZGUoZmFjdG9yeSwgZmFjdG9yeSksXG4gIGluamVjdG9yKClcbik7XG5cbi8vIEhlbHBlciB0byBpbmplY3QgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHJldHVybiBrZXBsZXIuZ2wgY29udGFpbmVyXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q29tcG9uZW50cyhyZWNpcGVzID0gW10pIHtcbiAgcmV0dXJuIHByb3ZpZGVSZWNpcGVzVG9JbmplY3RvcihyZWNpcGVzLCBhcHBJbmplY3RvcikuZ2V0KENvbnRhaW5lckZhY3RvcnkpO1xufVxuXG5jb25zdCBJbmplY3RlZENvbnRhaW5lciA9IGFwcEluamVjdG9yLmdldChDb250YWluZXJGYWN0b3J5KTtcblxuZXhwb3J0IGRlZmF1bHQgSW5qZWN0ZWRDb250YWlu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
;