kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
252 lines (197 loc) • 26.6 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof3 = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ContainerFactory = ContainerFactory;
exports.errorMsg = exports["default"] = exports.appInjector = void 0;
exports.injectComponents = injectComponents;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
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");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
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; }
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 errorMsg = exports.errorMsg = {
noState: "kepler.gl state doesnt 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",
wrongType: function wrongType(type) {
return "injectComponents takes an array of factories replacement pairs as input, " + "".concat(type, " is provided");
},
wrongPairType: "injectComponents takes an array of factories replacement pairs as input, " + "each pair be a array as [originalFactory, replacement]"
};
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_
* 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);
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(errorMsg.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: "componentWillMount",
value: function componentWillMount() {
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; // add a new entry to reducer
this.props.dispatch((0, _identityActions.registerEntry)({
id: id,
mint: mint,
mapboxApiAccessToken: mapboxApiAccessToken,
mapboxApiUrl: mapboxApiUrl,
mapStylesReplaceDefault: mapStylesReplaceDefault
}));
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
// check if id has changed, if true, copy state over
if (nextProps.id && nextProps.id !== this.props.id) {
this.props.dispatch((0, _identityActions.renameEntry)(this.props.id, nextProps.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);
// default id and address if not provided
(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);
} // entryPoint
function flattenDeps(allDeps, factory) {
var addToDeps = allDeps.concat([factory]);
return Array.isArray(factory.deps) && factory.deps.length ? factory.deps.reduce(function (accu, dep) {
return flattenDeps(accu, dep);
}, addToDeps) : addToDeps;
}
var allDependencies = 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(recipes) {
if (!Array.isArray(recipes)) {
_window.console.error(errorMsg.wrongType((0, _typeof2["default"])(recipes)));
return appInjector.get(ContainerFactory);
}
return recipes.reduce(function (inj, recipe) {
var _inj;
if (!Array.isArray(recipes)) {
_window.console.error(errorMsg.wrongPairType);
return inj;
} // collect dependencies of custom factories, if there is any.
// Add them to the injector
var customDependencies = flattenDeps([], recipe[1]);
inj = customDependencies.reduce(function (ij, factory) {
return ij.provide(factory, factory);
}, inj);
return (_inj = inj).provide.apply(_inj, (0, _toConsumableArray2["default"])(recipe));
}, appInjector).get(ContainerFactory);
}
var InjectedContainer = appInjector.get(ContainerFactory);
var _default = exports["default"] = InjectedContainer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci5qcyJdLCJuYW1lcyI6WyJlcnJvck1zZyIsIm5vU3RhdGUiLCJ3cm9uZ1R5cGUiLCJ0eXBlIiwid3JvbmdQYWlyVHlwZSIsIkNvbnRhaW5lckZhY3RvcnkiLCJkZXBzIiwiS2VwbGVyR2xGYWN0b3J5IiwiS2VwbGVyR2wiLCJDb250YWluZXIiLCJwcm9wcyIsImN0eCIsImdldFNlbGVjdG9yIiwiaWQiLCJnZXRTdGF0ZSIsInN0YXRlIiwiQ29uc29sZSIsImVycm9yIiwiZ2V0RGlzcGF0Y2giLCJkaXNwYXRjaCIsIm1pbnQiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIm1hcGJveEFwaVVybCIsIm1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0IiwibmV4dFByb3BzIiwic2VsZWN0b3IiLCJDb21wb25lbnQiLCJrZXBsZXJHbCIsIm1hcFN0YXRlVG9Qcm9wcyIsImRpc3BhdGNoVG9Qcm9wcyIsImZsYXR0ZW5EZXBzIiwiYWxsRGVwcyIsImZhY3RvcnkiLCJhZGRUb0RlcHMiLCJjb25jYXQiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJyZWR1Y2UiLCJhY2N1IiwiZGVwIiwiYWxsRGVwZW5kZW5jaWVzIiwiYXBwSW5qZWN0b3IiLCJpbmoiLCJwcm92aWRlIiwiaW5qZWN0Q29tcG9uZW50cyIsInJlY2lwZXMiLCJnZXQiLCJyZWNpcGUiLCJjdXN0b21EZXBlbmRlbmNpZXMiLCJpaiIsIkluamVjdGVkQ29udGFpbmVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7OztBQU1PLElBQU1BLFFBQVEsc0JBQUc7QUFDdEJDLEVBQUFBLE9BQU8sRUFDTCxrTUFGb0I7QUFNdEJDLEVBQUFBLFNBQVMsRUFBRSxtQkFBQUMsSUFBSTtBQUFBLFdBQUksd0ZBQ2RBLElBRGMsaUJB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REcsQ0FDSSxVQUFDWSxFQUFELEVBQUtsQixPQUFMO0FBQUEsYUFBaUJrQixFQUFFLENBQUNOLE9BQUgsQ0FBV1osT0FBWCxFQUFvQkEsT0FBcEIsQ0FBakI7QUFBQSxLQURKLEVBQ21EVyxHQURuRCxDQUFOO0FBR0EsV0FBTyxRQUFBQSxHQUFHLEVBQUNDLE9BQUosaURBQWVJLE1BQWYsRUFBUDtBQUNELEdBZEksRUFjRk4sV0FkRSxFQWVKSyxHQWZJLENBZUExQyxnQkFmQSxDQUFQO0FBZ0JEOztBQUVELElBQU04QyxpQkFBaUIsR0FBR1QsV0FBVyxDQUFDSyxHQUFaLENBQWdCMUMsZ0JBQWhCLENBQTFCOztvQ0FFZThDLGlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBtZW1vaXplIGZyb20gJ2xvZGFzaC5tZW1vaXplJztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCB7aW5qZWN0b3J9IGZyb20gJy4vaW5qZWN0b3InO1xuaW1wb3J0IEtlcGxlckdsRmFjdG9yeSBmcm9tICcuL2tlcGxlci1nbCc7XG5pbXBvcnQge2ZvcndhcmRUb30gZnJvbSAnYWN0aW9ucy9hY3Rpb24td3JhcHBlcic7XG5cbmltcG9ydCB7XG4gIHJlZ2lzdGVyRW50cnksXG4gIGRlbGV0ZUVudHJ5LFxuICByZW5hbWVFbnRyeVxufSBmcm9tICdhY3Rpb25zL2lkZW50aXR5LWFjdGlvbnMnO1xuXG5leHBvcnQgY29uc3QgZXJyb3JNc2cgPSB7XG4gIG5vU3RhdGU6XG4gICAgYGtlcGxlci5nbCBzdGF0ZSBkb2VzbnQgZXhpc3QuIGAgK1xuICAgIGBZb3UgbWlnaHQgZm9yZ2V0IHRvIG1vdW50IGtlcGxlckdsUmVkdWNlciBpbiB5b3VyIHJvb3QgcmVkdWNlci5gICtcbiAgICBgSWYgaXQgaXMgbm90IG1vdW50ZWQgYXMgc3RhdGUua2VwbGVyR2wgYnkgZGVmYXVsdCwgeW91IG5lZWQgdG8gcHJvdmlkZSBnZXRTdGF0ZSBhcyBhIHByb3BgLFxuXG4gIHdyb25nVHlwZTogdHlwZSA9PiBgaW5qZWN0Q29tcG9uZW50cyB0YWtlcyBhbiBhcnJheSBvZiBmYWN0b3JpZXMgcmVwbGFjZW1lbnQgcGFpcnMgYXMgaW5wdXQsIGAgK1xuICAgIGAke3R5cGV9IGlzIHByb3ZpZGVkYCxcblxuICB3cm9uZ1BhaXJUeXBlOiBgaW5qZWN0Q29tcG9uZW50cyB0YWtlcyBhbiBhcnJheSBvZiBmYWN0b3JpZXMgcmVwbGFjZW1lbnQgcGFpcnMgYXMgaW5wdXQsIGAgK1xuICBgZWFjaCBwYWlyIGJlIGEgYXJyYXkgYXMgW29yaWdpbmFsRmFjdG9yeSwgcmVwbGFjZW1lbnRdYFxufTtcblxuQ29udGFpbmVyRmFjdG9yeS5kZXBzID0gW0tlcGxlckdsRmFjdG9yeV07XG5cbmV4cG9ydCBmdW5jdGlvbiBDb250YWluZXJGYWN0b3J5KEtlcGxlckdsKSB7XG4gIC8qKiBAbGVuZHMgS2VwbGVyR2wgKi9cbiAgLyoqXG4gICAgKiBNYWluIEtlcGxlci5nbCBDb21wb25lbnRcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgICpcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wcy5pZCAtIF9yZXF1aXJlZF9cbiAgICAqXG4gICAgKiAtIERlZmF1bHQ6IGBtYXBgXG4gICAgKiBUaGUgaWQgb2YgdGhpcyBLZXBsZXJHbCBpbnN0YW5jZS4gYGlkYCBpcyByZXF1aXJlZCBpZiB5b3UgaGF2ZSBtdWx0aXBsZVxuICAgICogS2VwbGVyR2wgaW5zdGFuY2VzIGluIHlvdXIgYXBwLiBJdCBkZWZpbmVzIHRoZSBwcm9wIG5hbWUgb2YgdGhlIEtlcGxlckdsIHN0YXRlIHRoYXQgaXNcbiAgICAqIHN0b3JlZCBpbiB0aGUgS2VwbGVyR2wgcmVkdWNlci4gRm9yIGV4YW1wbGUsIHRoZSBzdGF0ZSBvZiB0aGUgS2VwbGVyR2wgY29tcG9uZW50IHdpdGggaWQgYGZvb2AgaXNcbiAgICAqIHN0b3JlZCBpbiBgc3RhdGUua2VwbGVyR2wuZm9vYC5cbiAgICAqXG4gICAgKiBJbiBjYXNlIHlvdSBjcmVhdGUgbXVsdGlwbGUga2VwbGVyLmdsIGluc3RhbmNlcyB1c2luZyB0aGUgc2FtZSBpZCwgdGhlIGtlcGxlci5nbCBzdGF0ZSBkZWZpbmVkIGJ5IHRoZSBlbnRyeSB3aWxsIGJlXG4gICAgKiBvdmVycmlkZGVuIGJ5IHRoZSBsYXRlc3QgaW5zdGFuY2UgYW5kIHJlc2V0IHRvIGEgYmxhbmsgc3RhdGUuXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcHMubWFwYm94QXBpQWNjZXNzVG9rZW4gLSBfcmVxdWlyZWRfXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcHMubWFwYm94QXBpVXJsIC0gX29wdGlvbmFsX1xuICAgICogQHBhcmFtIHtCb29sZWFufSBwcm9wcy5tYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCAtIF9vcHRpb25hbF9cblxuICAgICogWW91IGNhbiBjcmVhdGUgYSBmcmVlIGFjY291bnQgYXQgW3d3dy5tYXBib3guY29tXSh3d3cubWFwYm94LmNvbSkgYW5kIGNyZWF0ZSBhIHRva2VuIGF0XG4gICAgKiBbd3d3Lm1hcGJveC5jb20vYWNjb3VudC9hY2Nlc3MtdG9rZW5zXSh3d3cubWFwYm94LmNvbS9hY2NvdW50L2FjY2Vzcy10b2tlbnMpXG4gICAgKlxuICAgICpcbiAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm9wcy53aWR0aCAtIF9yZXF1aXJlZF8gV2lkdGggb2YgdGhlIEtlcGxlckdsIFVJLlxuICAgICogQHB1YmxpY1xuICAgKi9cbiAgY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICAvLyBkZWZhdWx0IGlkIGFuZCBhZGRyZXNzIGlmIG5vdCBwcm92aWRlZFxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICBpZDogJ21hcCcsXG4gICAgICBnZXRTdGF0ZTogc3RhdGUgPT4gc3RhdGUua2VwbGVyR2wsXG4gICAgICBtaW50OiB0cnVlXG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzLCBjdHgpIHtcbiAgICAgIHN1cGVyKHByb3BzLCBjdHgpO1xuXG4gICAgICB0aGlzLmdldFNlbGVjdG9yID0gbWVtb2l6ZSgoaWQsIGdldFN0YXRlKSA9PiBzdGF0ZSA9PiB7XG4gICAgICAgIGlmICghZ2V0U3RhdGUoc3RhdGUpKSB7XG4gICAgICAgICAgLy8gbG9nIGVycm9yXG4gICAgICAgICAgQ29uc29sZS5lcnJvcihlcnJvck1zZy5ub1N0YXRlKTtcblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRTdGF0ZShzdGF0ZSlbaWRdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdldERpc3BhdGNoID0gbWVtb2l6ZSgoaWQsIGRpc3BhdGNoKSA9PiBmb3J3YXJkVG8oaWQsIGRpc3BhdGNoKSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgY29uc3Qge2lkLCBtaW50LCBtYXBib3hBcGlBY2Nlc3NUb2tlbiwgbWFwYm94QXBpVXJsLCBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdH0gPSB0aGlzLnByb3BzO1xuICAgICAgLy8gYWRkIGEgbmV3IGVudHJ5IHRvIHJlZHVjZXJcbiAgICAgIHRoaXMucHJvcHMuZGlzcGF0Y2gocmVnaXN0ZXJFbnRyeSh7aWQsIG1pbnQsIG1hcGJveEFwaUFjY2Vzc1Rva2VuLCBtYXBib3hBcGlVcmwsIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0fSkpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICAvLyBjaGVjayBpZiBpZCBoYXMgY2hhbmdlZCwgaWYgdHJ1ZSwgY29weSBzdGF0ZSBvdmVyXG4gICAgICBpZiAobmV4dFByb3BzLmlkICYmIG5leHRQcm9wcy5pZCAhPT0gdGhpcy5wcm9wcy5pZCkge1xuICAgICAgICB0aGlzLnByb3BzLmRpc3BhdGNoKHJlbmFtZUVudHJ5KHRoaXMucHJvcHMuaWQsIG5leHRQcm9wcy5pZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKHRoaXMucHJvcHMubWludCAhPT0gZmFsc2UpIHtcbiAgICAgICAgLy8gZGVsZXRlIGVudHJ5IGluIHJlZHVjZXJcbiAgICAgICAgdGhpcy5wcm9wcy5kaXNwYXRjaChkZWxldGVFbnRyeSh0aGlzLnByb3BzLmlkKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2lkLCBnZXRTdGF0ZSwgZGlzcGF0Y2gsIHN0YXRlfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IoaWQsIGdldFN0YXRlKTtcblxuICAgICAgaWYgKCFzZWxlY3RvciB8fCAhc2VsZWN0b3Ioc3RhdGUpKSB7XG4gICAgICAgIC8vIGluc3RhbmNlIHN0YXRlIGhhc24ndCBiZWVuIG1vdW50ZWQgeWV0XG4gICAgICAgIHJldHVybiA8ZGl2IC8+O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8S2VwbGVyR2xcbiAgICAgICAgICB7Li4udGhpcy5wcm9wc31cbiAgICAgICAgICBpZD17aWR9XG4gICAgICAgICAgc2VsZWN0b3I9e3NlbGVjdG9yfVxuICAgICAgICAgIGRpc3BhdGNoPXt0aGlzLmdldERpc3BhdGNoKGlkLCBkaXNwYXRjaCl9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZSwgcHJvcHMpID0+ICh7c3RhdGUsIC4uLnByb3BzfSk7XG4gIGNvbnN0IGRpc3BhdGNoVG9Qcm9wcyA9IGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KTtcbiAgcmV0dXJuIGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBkaXNwYXRjaFRvUHJvcHMpKENvbnRhaW5lcik7XG59XG5cbi8vIGVudHJ5UG9pbnRcbmZ1bmN0aW9uIGZsYXR0ZW5EZXBzKGFsbERlcHMsIGZhY3RvcnkpIHtcbiAgY29uc3QgYWRkVG9EZXBzID0gYWxsRGVwcy5jb25jYXQoW2ZhY3RvcnldKTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmFjdG9yeS5kZXBzKSAmJiBmYWN0b3J5LmRlcHMubGVuZ3RoID9cbiAgICBmYWN0b3J5LmRlcHMucmVkdWNlKChhY2N1LCBkZXApID0+IGZsYXR0ZW5EZXBzKGFjY3UsIGRlcCksIGFkZFRvRGVwcykgOlxuICAgIGFkZFRvRGVwcztcbn1cblxuY29uc3QgYWxsRGVwZW5kZW5jaWVzID0gZmxhdHRlbkRlcHMoW10sIENvbnRhaW5lckZhY3RvcnkpO1xuXG4vLyBwcm92aWRlIGFsbCBkZXBlbmRlbmNpZXMgdG8gYXBwSW5qZWN0b3JcbmV4cG9ydCBjb25zdCBhcHBJbmplY3RvciA9IGFsbERlcGVuZGVuY2llc1xuICAucmVkdWNlKChpbmosIGZhY3RvcnkpID0+IGluai5wcm92aWRlKGZhY3RvcnksIGZhY3RvcnkpLCBpbmplY3RvcigpKTtcblxuLy8gSGVscGVyIHRvIGluamVjdCBjdXN0b20gY29tcG9uZW50cyBhbmQgcmV0dXJuIGtlcGxlci5nbCBjb250YWluZXJcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RDb21wb25lbnRzKHJlY2lwZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJlY2lwZXMpKSB7XG4gICAgQ29uc29sZS5lcnJvcihlcnJvck1zZy53cm9uZ1R5cGUodHlwZW9mKHJlY2lwZXMpKSk7XG4gICAgcmV0dXJuIGFwcEluamVjdG9yLmdldChDb250YWluZXJGYWN0b3J5KTtcbiAgfVxuXG4gIHJldHVybiByZWNpcGVzXG4gICAgLnJlZHVjZSgoaW5qLCByZWNpcGUpID0+IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZWNpcGVzKSkge1xuICAgICAgICBDb25zb2xlLmVycm9yKGVycm9yTXNnLndyb25nUGFpclR5cGUpO1xuICAgICAgICByZXR1cm4gaW5qO1xuICAgICAgfVxuXG4gICAgICAvLyBjb2xsZWN0IGRlcGVuZGVuY2llcyBvZiBjdXN0b20gZmFjdG9yaWVzLCBpZiB0aGVyZSBpcyBhbnkuXG4gICAgICAvLyBBZGQgdGhlbSB0byB0aGUgaW5qZWN0b3JcbiAgICAgIGNvbnN0IGN1c3RvbURlcGVuZGVuY2llcyA9IGZsYXR0ZW5EZXBzKFtdLCByZWNpcGVbMV0pO1xuICAgICAgaW5qID0gY3VzdG9tRGVwZW5kZW5jaWVzXG4gICAgICAgIC5yZWR1Y2UoKGlqLCBmYWN0b3J5KSA9PiBpai5wcm92aWRlKGZhY3RvcnksIGZhY3RvcnkpLCBpbmopO1xuXG4gICAgICByZXR1cm4gaW5qLnByb3ZpZGUoLi4ucmVjaXBlKTtcbiAgICB9LCBhcHBJbmplY3RvcilcbiAgICAuZ2V0KENvbnRhaW5lckZhY3RvcnkpO1xufVxuXG5jb25zdCBJbmplY3RlZENvbnRhaW5lciA9IGFwcEluamVjdG9yLmdldChDb250YWluZXJGYWN0b3J5KTtcblxuZXhwb3J0IGRlZmF1bHQgSW5qZWN0ZWRDb250YWluZXI7XG4iXX0=