kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
217 lines (173 loc) • 22.3 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ContainerFactory = ContainerFactory;
exports.injectComponents = injectComponents;
exports["default"] = exports.appInjector = exports.ERROR_MSG = 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 _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _reactRedux = require("react-redux");
var _lodash = _interopRequireDefault(require("lodash.memoize"));
var _window = require("global/window");
var _injector = require("./injector");
var _keplerGl = _interopRequireDefault(require("./kepler-gl"));
var _actionWrapper = require("../actions/action-wrapper");
var _identityActions = require("../actions/identity-actions");
var _dataUtils = require("../utils/data-utils");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var 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"
};
exports.ERROR_MSG = ERROR_MSG;
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
*/
var Container = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(Container, _Component);
var _super = _createSuper(Container);
// default id and address if not provided
function Container(props, ctx) {
var _this;
(0, _classCallCheck2["default"])(this, Container);
_this = _super.call(this, props, ctx);
_this.getSelector = (0, _lodash["default"])(function (id, getState) {
return function (state) {
if (!getState(state)) {
// log error
_window.console.error(ERROR_MSG.noState);
return null;
}
return getState(state)[id];
};
});
_this.getDispatch = (0, _lodash["default"])(function (id, dispatch) {
return (0, _actionWrapper.forwardTo)(id, dispatch);
});
return _this;
}
(0, _createClass2["default"])(Container, [{
key: "componentDidMount",
value: function componentDidMount() {
var _this$props = this.props,
id = _this$props.id,
mint = _this$props.mint,
mapboxApiAccessToken = _this$props.mapboxApiAccessToken,
mapboxApiUrl = _this$props.mapboxApiUrl,
mapStylesReplaceDefault = _this$props.mapStylesReplaceDefault,
initialUiState = _this$props.initialUiState; // add a new entry to reducer
this.props.dispatch((0, _identityActions.registerEntry)({
id: id,
mint: mint,
mapboxApiAccessToken: mapboxApiAccessToken,
mapboxApiUrl: mapboxApiUrl,
mapStylesReplaceDefault: mapStylesReplaceDefault,
initialUiState: initialUiState
}));
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
// check if id has changed, if true, copy state over
if ((0, _dataUtils.notNullorUndefined)(prevProps.id) && (0, _dataUtils.notNullorUndefined)(this.props.id) && prevProps.id !== this.props.id) {
this.props.dispatch((0, _identityActions.renameEntry)(prevProps.id, this.props.id));
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
if (this.props.mint !== false) {
// delete entry in reducer
this.props.dispatch((0, _identityActions.deleteEntry)(this.props.id));
}
}
}, {
key: "render",
value: function render() {
var _this$props2 = this.props,
id = _this$props2.id,
getState = _this$props2.getState,
dispatch = _this$props2.dispatch,
state = _this$props2.state;
var selector = this.getSelector(id, getState);
if (!selector || !selector(state)) {
// instance state hasn't been mounted yet
return /*#__PURE__*/_react["default"].createElement("div", null);
}
return /*#__PURE__*/_react["default"].createElement(KeplerGl, (0, _extends2["default"])({}, this.props, {
id: id,
selector: selector,
dispatch: this.getDispatch(id, dispatch)
}));
}
}]);
return Container;
}(_react.Component);
(0, _defineProperty2["default"])(Container, "defaultProps", {
id: 'map',
getState: function getState(state) {
return state.keplerGl;
},
mint: true
});
var mapStateToProps = function mapStateToProps(state, props) {
return _objectSpread({
state: state
}, props);
};
var dispatchToProps = function dispatchToProps(dispatch) {
return {
dispatch: dispatch
};
};
return (0, _reactRedux.connect)(mapStateToProps, dispatchToProps)(Container);
}
var allDependencies = (0, _injector.flattenDeps)([], ContainerFactory); // provide all dependencies to appInjector
var appInjector = allDependencies.reduce(function (inj, factory) {
return inj.provide(factory, factory);
}, (0, _injector.injector)()); // Helper to inject custom components and return kepler.gl container
exports.appInjector = appInjector;
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 = InjectedContainer;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci5qcyJdLCJuYW1lcyI6WyJFUlJPUl9NU0ciLCJub1N0YXRlIiwiQ29udGFpbmVyRmFjdG9yeSIsImRlcHMiLCJLZXBsZXJHbEZhY3RvcnkiLCJLZXBsZXJHbCIsIkNvbnRhaW5lciIsInByb3BzIiwiY3R4IiwiZ2V0U2VsZWN0b3IiLCJpZCIsImdldFN0YXRlIiwic3RhdGUiLCJDb25zb2xlIiwiZXJyb3IiLCJnZXREaXNwYXRjaCIsImRpc3BhdGNoIiwibWludCIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwibWFwU3R5bGVzUmVwbGFjZURlZmF1bHQiLCJpbml0aWFsVWlTdGF0ZSIsInByZXZQcm9wcyIsInNlbGVjdG9yIiwiQ29tcG9uZW50Iiwia2VwbGVyR2wiLCJtYXBTdGF0ZVRvUHJvcHMiLCJkaXNwYXRjaFRvUHJvcHMiLCJhbGxEZXBlbmRlbmNpZXMiLCJhcHBJbmplY3RvciIsInJlZHVjZSIsImluaiIsImZhY3RvcnkiLCJwcm92aWRlIiwiaW5qZWN0Q29tcG9uZW50cyIsInJlY2lwZXMiLCJnZXQiLCJJbmplY3RlZENvbnRhaW5lciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7Ozs7Ozs7O0FBRU8sSUFBTUEsU0FBUyxHQUFHO0FBQ3ZCQyxFQUFBQSxPQUFPLEVBQ0w7QUFGcUIsQ0FBbEI7O0FBT1BDLGdCQUFnQixDQUFDQyxJQUFqQixHQUF3QixDQUFDQyxvQkFBRCxDQUF4Qjs7QUFFTyxTQUFTRixnQkFBVCxDQUEwQkcsUUFBMUIsRUFBb0M7QUFDekM7O0FBQ0E7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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STtBQUM3QyxTQUFPLHdDQUF5QkEsT0FBekIsRUFBa0NOLFdBQWxDLEVBQStDTyxHQUEvQyxDQUFtRGxDLGdCQUFuRCxDQUFQO0FBQ0Q7O0FBRUQsSUFBTW1DLGlCQUFpQixHQUFHUixXQUFXLENBQUNPLEdBQVosQ0FBZ0JsQyxnQkFBaEIsQ0FBMUI7ZUFFZW1DLGlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIxIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBtZW1vaXplIGZyb20gJ2xvZGFzaC5tZW1vaXplJztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCB7aW5qZWN0b3IsIHByb3ZpZGVSZWNpcGVzVG9JbmplY3RvciwgZmxhdHRlbkRlcHN9IGZyb20gJy4vaW5qZWN0b3InO1xuaW1wb3J0IEtlcGxlckdsRmFjdG9yeSBmcm9tICcuL2tlcGxlci1nbCc7XG5pbXBvcnQge2ZvcndhcmRUb30gZnJvbSAnYWN0aW9ucy9hY3Rpb24td3JhcHBlcic7XG5cbmltcG9ydCB7cmVnaXN0ZXJFbnRyeSwgZGVsZXRlRW50cnksIHJlbmFtZUVudHJ5fSBmcm9tICdhY3Rpb25zL2lkZW50aXR5LWFjdGlvbnMnO1xuaW1wb3J0IHtub3ROdWxsb3JVbmRlZmluZWR9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgRVJST1JfTVNHID0ge1xuICBub1N0YXRlOlxuICAgIGBrZXBsZXIuZ2wgc3RhdGUgZG9lcyBub3QgZXhpc3QuIGAgK1xuICAgIGBZb3UgbWlnaHQgZm9yZ2V0IHRvIG1vdW50IGtlcGxlckdsUmVkdWNlciBpbiB5b3VyIHJvb3QgcmVkdWNlci5gICtcbiAgICBgSWYgaXQgaXMgbm90IG1vdW50ZWQgYXMgc3RhdGUua2VwbGVyR2wgYnkgZGVmYXVsdCwgeW91IG5lZWQgdG8gcHJvdmlkZSBnZXRTdGF0ZSBhcyBhIHByb3BgXG59O1xuXG5Db250YWluZXJGYWN0b3J5LmRlcHMgPSBbS2VwbGVyR2xGYWN0b3J5XTtcblxuZXhwb3J0IGZ1bmN0aW9uIENvbnRhaW5lckZhY3RvcnkoS2VwbGVyR2wpIHtcbiAgLyoqIEBsZW5kcyBLZXBsZXJHbCAqL1xuICAvKipcbiAgICAqIE1haW4gS2VwbGVyLmdsIENvbXBvbmVudFxuICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAgKlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BzLmlkIC0gX3JlcXVpcmVkX1xuICAgICpcbiAgICAqIC0gRGVmYXVsdDogYG1hcGBcbiAgICAqIFRoZSBpZCBvZiB0aGlzIEtlcGxlckdsIGluc3RhbmNlLiBgaWRgIGlzIHJlcXVpcmVkIGlmIHlvdSBoYXZlIG11bHRpcGxlXG4gICAgKiBLZXBsZXJHbCBpbnN0YW5jZXMgaW4geW91ciBhcHAuIEl0IGRlZmluZXMgdGhlIHByb3AgbmFtZSBvZiB0aGUgS2VwbGVyR2wgc3RhdGUgdGhhdCBpc1xuICAgICogc3RvcmVkIGluIHRoZSBLZXBsZXJHbCByZWR1Y2VyLiBGb3IgZXhhbXBsZSwgdGhlIHN0YXRlIG9mIHRoZSBLZXBsZXJHbCBjb21wb25lbnQgd2l0aCBpZCBgZm9vYCBpc1xuICAgICogc3RvcmVkIGluIGBzdGF0ZS5rZXBsZXJHbC5mb29gLlxuICAgICpcbiAgICAqIEluIGNhc2UgeW91IGNyZWF0ZSBtdWx0aXBsZSBrZXBsZXIuZ2wgaW5zdGFuY2VzIHVzaW5nIHRoZSBzYW1lIGlkLCB0aGUga2VwbGVyLmdsIHN0YXRlIGRlZmluZWQgYnkgdGhlIGVudHJ5IHdpbGwgYmVcbiAgICAqIG92ZXJyaWRkZW4gYnkgdGhlIGxhdGVzdCBpbnN0YW5jZSBhbmQgcmVzZXQgdG8gYSBibGFuayBzdGF0ZS5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wcy5tYXBib3hBcGlBY2Nlc3NUb2tlbiAtIF9yZXF1aXJlZF9cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wcy5tYXBib3hBcGlVcmwgLSBfb3B0aW9uYWxfXG4gICAgKiBAcGFyYW0ge0Jvb2xlYW59IHByb3BzLm1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0IC0gX29wdGlvbmFsX1xuICAgICogQHBhcmFtIHtvYmplY3R9IHByb3BzLmluaXRpYWxVaVN0YXRlIC0gX29wdGlvbmFsX1xuXG4gICAgKiBZb3UgY2FuIGNyZWF0ZSBhIGZyZWUgYWNjb3VudCBhdCBbd3d3Lm1hcGJveC5jb21dKHd3dy5tYXBib3guY29tKSBhbmQgY3JlYXRlIGEgdG9rZW4gYXRcbiAgICAqIFt3d3cubWFwYm94LmNvbS9hY2NvdW50L2FjY2Vzcy10b2tlbnNdKHd3dy5tYXBib3guY29tL2FjY291bnQvYWNjZXNzLXRva2VucylcbiAgICAqXG4gICAgKlxuICAgICogQHBhcmFtIHtOdW1iZXJ9IHByb3BzLndpZHRoIC0gX3JlcXVpcmVkXyBXaWR0aCBvZiB0aGUgS2VwbGVyR2wgVUkuXG4gICAgKiBAcHVibGljXG4gICAqL1xuICBjbGFzcyBDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIC8vIGRlZmF1bHQgaWQgYW5kIGFkZHJlc3MgaWYgbm90IHByb3ZpZGVkXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGlkOiAnbWFwJyxcbiAgICAgIGdldFN0YXRlOiBzdGF0ZSA9PiBzdGF0ZS5rZXBsZXJHbCxcbiAgICAgIG1pbnQ6IHRydWVcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMsIGN0eCkge1xuICAgICAgc3VwZXIocHJvcHMsIGN0eCk7XG5cbiAgICAgIHRoaXMuZ2V0U2VsZWN0b3IgPSBtZW1vaXplKChpZCwgZ2V0U3RhdGUpID0+IHN0YXRlID0+IHtcbiAgICAgICAgaWYgKCFnZXRTdGF0ZShzdGF0ZSkpIHtcbiAgICAgICAgICAvLyBsb2cgZXJyb3JcbiAgICAgICAgICBDb25zb2xlLmVycm9yKEVSUk9SX01TRy5ub1N0YXRlKTtcblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRTdGF0ZShzdGF0ZSlbaWRdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdldERpc3BhdGNoID0gbWVtb2l6ZSgoaWQsIGRpc3BhdGNoKSA9PiBmb3J3YXJkVG8oaWQsIGRpc3BhdGNoKSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlkLFxuICAgICAgICBtaW50LFxuICAgICAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgICAgICAgbWFwYm94QXBpVXJsLFxuICAgICAgICBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCxcbiAgICAgICAgaW5pdGlhbFVpU3RhdGVcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAvLyBhZGQgYSBuZXcgZW50cnkgdG8gcmVkdWNlclxuICAgICAgdGhpcy5wcm9wcy5kaXNwYXRjaChcbiAgICAgICAgcmVnaXN0ZXJFbnRyeSh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgbWludCxcbiAgICAgICAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgICAgICAgICBtYXBib3hBcGlVcmwsXG4gICAgICAgICAgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQsXG4gICAgICAgICAgaW5pdGlhbFVpU3RhdGVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgLy8gY2hlY2sgaWYgaWQgaGFzIGNoYW5nZWQsIGlmIHRydWUsIGNvcHkgc3RhdGUgb3ZlclxuICAgICAgaWYgKFxuICAgICAgICBub3ROdWxsb3JVbmRlZmluZWQocHJldlByb3BzLmlkKSAmJlxuICAgICAgICBub3ROdWxsb3JVbmRlZmluZWQodGhpcy5wcm9wcy5pZCkgJiZcbiAgICAgICAgcHJldlByb3BzLmlkICE9PSB0aGlzLnByb3BzLmlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5wcm9wcy5kaXNwYXRjaChyZW5hbWVFbnRyeShwcmV2UHJvcHMuaWQsIHRoaXMucHJvcHMuaWQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLm1pbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vIGRlbGV0ZSBlbnRyeSBpbiByZWR1Y2VyXG4gICAgICAgIHRoaXMucHJvcHMuZGlzcGF0Y2goZGVsZXRlRW50cnkodGhpcy5wcm9wcy5pZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtpZCwgZ2V0U3RhdGUsIGRpc3BhdGNoLCBzdGF0ZX0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmdldFNlbGVjdG9yKGlkLCBnZXRTdGF0ZSk7XG5cbiAgICAgIGlmICghc2VsZWN0b3IgfHwgIXNlbGVjdG9yKHN0YXRlKSkge1xuICAgICAgICAvLyBpbnN0YW5jZSBzdGF0ZSBoYXNuJ3QgYmVlbiBtb3VudGVkIHlldFxuICAgICAgICByZXR1cm4gPGRpdiAvPjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEtlcGxlckdsXG4gICAgICAgICAgey4uLnRoaXMucHJvcHN9XG4gICAgICAgICAgaWQ9e2lkfVxuICAgICAgICAgIHNlbGVjdG9yPXtzZWxlY3Rvcn1cbiAgICAgICAgICBkaXNwYXRjaD17dGhpcy5nZXREaXNwYXRjaChpZCwgZGlzcGF0Y2gpfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoc3RhdGUsIHByb3BzKSA9PiAoe3N0YXRlLCAuLi5wcm9wc30pO1xuICBjb25zdCBkaXNwYXRjaFRvUHJvcHMgPSBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSk7XG4gIHJldHVybiBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgZGlzcGF0Y2hUb1Byb3BzKShDb250YWluZXIpO1xufVxuXG5jb25zdCBhbGxEZXBlbmRlbmNpZXMgPSBmbGF0dGVuRGVwcyhbXSwgQ29udGFpbmVyRmFjdG9yeSk7XG5cbi8vIHByb3ZpZGUgYWxsIGRlcGVuZGVuY2llcyB0byBhcHBJbmplY3RvclxuZXhwb3J0IGNvbnN0IGFwcEluamVjdG9yID0gYWxsRGVwZW5kZW5jaWVzLnJlZHVjZShcbiAgKGluaiwgZmFjdG9yeSkgPT4gaW5qLnByb3ZpZGUoZmFjdG9yeSwgZmFjdG9yeSksXG4gIGluamVjdG9yKClcbik7XG5cbi8vIEhlbHBlciB0byBpbmplY3QgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHJldHVybiBrZXBsZXIuZ2wgY29udGFpbmVyXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q29tcG9uZW50cyhyZWNpcGVzID0gW10pIHtcbiAgcmV0dXJuIHByb3ZpZGVSZWNpcGVzVG9JbmplY3RvcihyZWNpcGVzLCBhcHBJbmplY3RvcikuZ2V0KENvbnRhaW5lckZhY3RvcnkpO1xufVxuXG5jb25zdCBJbmplY3RlZENvbnRhaW5lciA9IGFwcEluamVjdG9yLmdldChDb250YWluZXJGYWN0b3J5KTtcblxuZXhwb3J0IGRlZmF1bHQgSW5qZWN0ZWRDb250YWluZXI7XG4iXX0=