UNPKG

kepler.gl

Version:

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

256 lines (252 loc) 38.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _layers = require("@deck.gl/layers"); var _rasterLayerShaders = require("./raster-layer-shaders"); var _images = require("../images"); var _util = require("../util"); var _pipelineValidationPatch = require("../pipeline-validation-patch"); function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return 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 _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; } 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 defaultProps = _objectSpread(_objectSpread({}, _layers.BitmapLayer.defaultProps), {}, { modules: { type: 'array', value: [], compare: true }, images: { type: 'object', value: {}, compare: true }, moduleProps: { type: 'object', value: {}, compare: true }, onRedrawNeeded: { type: 'function', value: null, compare: false } }); var RasterLayer = exports["default"] = /*#__PURE__*/function (_BitmapLayer) { function RasterLayer() { var _this; (0, _classCallCheck2["default"])(this, RasterLayer); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, RasterLayer, [].concat(args)); (0, _defineProperty2["default"])(_this, "_redrawScheduled", false); return _this; } (0, _inherits2["default"])(RasterLayer, _BitmapLayer); return (0, _createClass2["default"])(RasterLayer, [{ key: "initializeState", value: function initializeState() { (0, _pipelineValidationPatch.patchPipelineValidation)(); (0, _rasterLayerShaders.ensureRasterHooksRegistered)(); this.setState({ images: {} }); _superPropGet(RasterLayer, "initializeState", this, 3)([]); } }, { key: "draw", value: function draw(_opts) { var _this$props$opacity; var _this$state = this.state, model = _this$state.model, images = _this$state.images, coordinateConversion = _this$state.coordinateConversion, bounds = _this$state.bounds; var _this$props = this.props, desaturate = _this$props.desaturate, transparentColor = _this$props.transparentColor, tintColor = _this$props.tintColor, moduleProps = _this$props.moduleProps; if (!model || !images || Object.keys(images).length === 0 || !Object.values(images).every(function (item) { return item; })) { return; } // Set UBO uniforms for the raster module model.shaderInputs.setProps({ raster: { desaturate: desaturate || 0, transparentColor: (transparentColor || [0, 0, 0, 0]).map(function (x) { return x ? x / 255 : 0; }), tintColor: (tintColor || [255, 255, 255]).slice(0, 3).map(function (x) { return x / 255; }), coordinateConversion: coordinateConversion || 0, bounds: bounds || [0, 0, 0, 0], opacity: (_this$props$opacity = this.props.opacity) !== null && _this$props$opacity !== void 0 ? _this$props$opacity : 1 } }); // Set props for each custom module through shaderInputs. // We call getUniforms ourselves to skip modules that return null (inactive). // Passing allModuleProps directly to setProps would cause the null-fallback // in ShaderInputs to treat the entire props bag as uniforms/bindings, // triggering expensive texture rebinding every frame. var allModuleProps = _objectSpread(_objectSpread({}, moduleProps), images); var modules = this.props.modules || []; var _iterator = _createForOfIteratorHelper(modules), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var mod = _step.value; if (mod.getUniforms) { var result = mod.getUniforms(allModuleProps); if (result) { model.shaderInputs.setProps((0, _defineProperty2["default"])({}, mod.name, result)); } } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } var drawSuccess = model.draw(this.context.renderPass); if (!drawSuccess) { this._scheduleRedraw(); } } }, { key: "_scheduleRedraw", value: function _scheduleRedraw() { var _this2 = this; if (this._redrawScheduled) return; this._redrawScheduled = true; requestAnimationFrame(function () { var _this2$context$layerM; _this2._redrawScheduled = false; if (_this2.context.deck) { // @ts-expect-error accessing private deck.gl property _this2.context.deck._needsRedraw = 'RasterLayer pipeline pending'; } (_this2$context$layerM = _this2.context.layerManager) === null || _this2$context$layerM === void 0 || _this2$context$layerM.setNeedsRedraw('RasterLayer pipeline pending'); if (typeof _this2.props.onRedrawNeeded === 'function') { _this2.props.onRedrawNeeded(); } }); } }, { key: "getShaders", value: function getShaders() { var _this$props$modules = this.props.modules, modules = _this$props$modules === void 0 ? [] : _this$props$modules; var lumaModules = (0, _rasterLayerShaders.prepareLumaModules)(modules); var parentShaders = _superPropGet(RasterLayer, "getShaders", this, 3)([]); return _objectSpread(_objectSpread({}, parentShaders), {}, { vs: (0, _rasterLayerShaders.buildRasterVertexShader)(), fs: (0, _rasterLayerShaders.buildRasterFragmentShader)(), modules: [].concat((0, _toConsumableArray2["default"])(parentShaders.modules || []), [_rasterLayerShaders.rasterUniforms], (0, _toConsumableArray2["default"])(lumaModules)) }); } // eslint-disable-next-line complexity }, { key: "updateState", value: function updateState(params) { var props = params.props, oldProps = params.oldProps, changeFlags = params.changeFlags; var modules = props && props.modules; var oldModules = oldProps && oldProps.modules; if (changeFlags.extensionsChanged || !(0, _util.modulesEqual)(modules, oldModules)) { var _this$state$model, _this$state$model$des, _this$getAttributeMan; (_this$state$model = this.state.model) === null || _this$state$model === void 0 || (_this$state$model$des = _this$state$model.destroy) === null || _this$state$model$des === void 0 || _this$state$model$des.call(_this$state$model); // @ts-expect-error _getModel is internal to BitmapLayer this.state.model = this._getModel(this.context.device || this.context.gl); (_this$getAttributeMan = this.getAttributeManager()) === null || _this$getAttributeMan === void 0 || _this$getAttributeMan.invalidateAll(); } if (props && props.images) { this.updateImages({ props: props, oldProps: oldProps }); } var attributeManager = this.getAttributeManager(); if (props.bounds !== oldProps.bounds) { var _this$state$model2; var oldMesh = this.state.mesh; var mesh = this._createMesh(); (_this$state$model2 = this.state.model) === null || _this$state$model2 === void 0 || _this$state$model2.setVertexCount(mesh.vertexCount); for (var key in mesh) { if (oldMesh && oldMesh[key] !== mesh[key]) { attributeManager === null || attributeManager === void 0 || attributeManager.invalidate(key); } } this.setState(_objectSpread({ mesh: mesh }, this._getCoordinateUniforms())); } else if (props._imageCoordinateSystem !== oldProps._imageCoordinateSystem) { this.setState(this._getCoordinateUniforms()); } } }, { key: "updateImages", value: function updateImages(_ref) { var props = _ref.props, oldProps = _ref.oldProps; var images = this.state.images; var device = this.context.device; var gl = (device === null || device === void 0 ? void 0 : device.gl) || this.context.gl; var newImages = (0, _images.loadImages)({ gl: gl, device: device, images: images, imagesData: props.images, oldImagesData: oldProps.images }); if (newImages) { this.setState({ images: newImages }); } } }, { key: "finalizeState", value: function finalizeState() { _superPropGet(RasterLayer, "finalizeState", this, 3)([this.context]); if (this.state.images) { for (var _i = 0, _Object$values = Object.values(this.state.images); _i < _Object$values.length; _i++) { var image = _Object$values[_i]; if (Array.isArray(image)) { image.map(function (x) { var _x$delete; return x && (x.destroy ? x.destroy() : (_x$delete = x["delete"]) === null || _x$delete === void 0 ? void 0 : _x$delete.call(x)); }); } else if (image) { var _image$delete; image.destroy ? image.destroy() : (_image$delete = image["delete"]) === null || _image$delete === void 0 ? void 0 : _image$delete.call(image); } } } } }]); }(_layers.BitmapLayer); RasterLayer.defaultProps = defaultProps; RasterLayer.layerName = 'RasterLayer'; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF5ZXJzIiwicmVxdWlyZSIsIl9yYXN0ZXJMYXllclNoYWRlcnMiLCJfaW1hZ2VzIiwiX3V0aWwiLCJfcGlwZWxpbmVWYWxpZGF0aW9uUGF0Y2giLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsIm93bktleXMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiZGVmYXVsdFByb3BzIiwiQml0bWFwTGF5ZXIiLCJtb2R1bGVzIiwidHlwZSIsImNvbXBhcmUiLCJpbWFnZXMiLCJtb2R1bGVQcm9wcyIsIm9uUmVkcmF3TmVlZGVkIiwiUmFzdGVyTGF5ZXIiLCJleHBvcnRzIiwiX0JpdG1hcExheWVyIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2xlbiIsImFyZ3MiLCJfa2V5IiwiY29uY2F0IiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJpbml0aWFsaXplU3RhdGUiLCJwYXRjaFBpcGVsaW5lVmFsaWRhdGlvbiIsImVuc3VyZVJhc3Rlckhvb2tzUmVnaXN0ZXJlZCIsInNldFN0YXRlIiwiZHJhdyIsIl9vcHRzIiwiX3RoaXMkcHJvcHMkb3BhY2l0eSIsIl90aGlzJHN0YXRlIiwic3RhdGUiLCJtb2RlbCIsImNvb3JkaW5hdGVDb252ZXJzaW9uIiwiYm91bmRzIiwiX3RoaXMkcHJvcHMiLCJwcm9wcyIsImRlc2F0dXJhdGUiLCJ0cmFuc3BhcmVudENvbG9yIiwidGludENvbG9yIiwidmFsdWVzIiwiZXZlcnkiLCJpdGVtIiwic2hhZGVySW5wdXRzIiwic2V0UHJvcHMiLCJyYXN0ZXIiLCJtYXAiLCJ4Iiwib3BhY2l0eSIsImFsbE1vZHVsZVByb3BzIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJtb2QiLCJnZXRVbmlmb3JtcyIsInJlc3VsdCIsImVyciIsImRyYXdTdWNjZXNzIiwiY29udGV4dCIsInJlbmRlclBhc3MiLCJfc2NoZWR1bGVSZWRyYXciLCJfdGhpczIiLCJfcmVkcmF3U2NoZWR1bGVkIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiX3RoaXMyJGNvbnRleHQkbGF5ZXJNIiwiZGVjayIsIl9uZWVkc1JlZHJhdyIsImxheWVyTWFuYWdlciIsInNldE5lZWRzUmVkcmF3IiwiZ2V0U2hhZGVycyIsIl90aGlzJHByb3BzJG1vZHVsZXMiLCJsdW1hTW9kdWxlcyIsInByZXBhcmVMdW1hTW9kdWxlcyIsInBhcmVudFNoYWRlcnMiLCJ2cyIsImJ1aWxkUmFzdGVyVmVydGV4U2hhZGVyIiwiZnMiLCJidWlsZFJhc3RlckZyYWdtZW50U2hhZGVyIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInJhc3RlclVuaWZvcm1zIiwidXBkYXRlU3RhdGUiLCJwYXJhbXMiLCJvbGRQcm9wcyIsImNoYW5nZUZsYWdzIiwib2xkTW9kdWxlcyIsImV4dGVuc2lvbnNDaGFuZ2VkIiwibW9kdWxlc0VxdWFsIiwiX3RoaXMkc3RhdGUkbW9kZWwiLCJfdGhpcyRzdGF0ZSRtb2RlbCRkZXMiLCJfdGhpcyRnZXRBdHRyaWJ1dGVNYW4iLCJkZXN0cm95IiwiX2dldE1vZGVsIiwiZGV2aWNlIiwiZ2wiLCJnZXRBdHRyaWJ1dGVNYW5hZ2VyIiwiaW52YWxpZGF0ZUFsbCIsInVwZGF0ZUltYWdlcyIsImF0dHJpYnV0ZU1hbmFnZXIiLCJfdGhpcyRzdGF0ZSRtb2RlbDIiLCJvbGRNZXNoIiwibWVzaCIsIl9jcmVhdGVNZXNoIiwic2V0VmVydGV4Q291bnQiLCJ2ZXJ0ZXhDb3VudCIsImludmFsaWRhdGUiLCJfZ2V0Q29vcmRpbmF0ZVVuaWZvcm1zIiwiX2ltYWdlQ29vcmRpbmF0ZVN5c3RlbSIsIl9yZWYiLCJuZXdJbWFnZXMiLCJsb2FkSW1hZ2VzIiwiaW1hZ2VzRGF0YSIsIm9sZEltYWdlc0RhdGEiLCJmaW5hbGl6ZVN0YXRlIiwiX2kiLCJfT2JqZWN0JHZhbHVlcyIsImltYWdlIiwiX3gkZGVsZXRlIiwiX2ltYWdlJGRlbGV0ZSIsImxheWVyTmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYXN0ZXIvcmFzdGVyLWxheWVyL3Jhc3Rlci1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1VwZGF0ZVBhcmFtZXRlcnN9IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtCaXRtYXBMYXllcn0gZnJvbSAnQGRlY2suZ2wvbGF5ZXJzJztcblxuaW1wb3J0IHtcbiAgYnVpbGRSYXN0ZXJGcmFnbWVudFNoYWRlcixcbiAgYnVpbGRSYXN0ZXJWZXJ0ZXhTaGFkZXIsXG4gIHJhc3RlclVuaWZvcm1zLFxuICBlbnN1cmVSYXN0ZXJIb29rc1JlZ2lzdGVyZWQsXG4gIHByZXBhcmVMdW1hTW9kdWxlc1xufSBmcm9tICcuL3Jhc3Rlci1sYXllci1zaGFkZXJzJztcbmltcG9ydCB7bG9hZEltYWdlc30gZnJvbSAnLi4vaW1hZ2VzJztcbmltcG9ydCB0eXBlIHtSYXN0ZXJMYXllckFkZGVkUHJvcHMsIEltYWdlU3RhdGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7bW9kdWxlc0VxdWFsfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7cGF0Y2hQaXBlbGluZVZhbGlkYXRpb259IGZyb20gJy4uL3BpcGVsaW5lLXZhbGlkYXRpb24tcGF0Y2gnO1xuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIC4uLkJpdG1hcExheWVyLmRlZmF1bHRQcm9wcyxcbiAgbW9kdWxlczoge3R5cGU6ICdhcnJheScsIHZhbHVlOiBbXSwgY29tcGFyZTogdHJ1ZX0sXG4gIGltYWdlczoge3R5cGU6ICdvYmplY3QnLCB2YWx1ZToge30sIGNvbXBhcmU6IHRydWV9LFxuICBtb2R1bGVQcm9wczoge3R5cGU6ICdvYmplY3QnLCB2YWx1ZToge30sIGNvbXBhcmU6IHRydWV9LFxuICBvblJlZHJhd05lZWRlZDoge3R5cGU6ICdmdW5jdGlvbicsIHZhbHVlOiBudWxsLCBjb21wYXJlOiBmYWxzZX1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhc3RlckxheWVyIGV4dGVuZHMgQml0bWFwTGF5ZXI8UmFzdGVyTGF5ZXJBZGRlZFByb3BzPiB7XG4gIGRlY2xhcmUgc3RhdGU6IEJpdG1hcExheWVyPFJhc3RlckxheWVyQWRkZWRQcm9wcz5bJ3N0YXRlJ10gJiB7XG4gICAgaW1hZ2VzOiBJbWFnZVN0YXRlO1xuICB9O1xuXG4gIF9yZWRyYXdTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBpbml0aWFsaXplU3RhdGUoKTogdm9pZCB7XG4gICAgcGF0Y2hQaXBlbGluZVZhbGlkYXRpb24oKTtcbiAgICBlbnN1cmVSYXN0ZXJIb29rc1JlZ2lzdGVyZWQoKTtcbiAgICB0aGlzLnNldFN0YXRlKHtpbWFnZXM6IHt9fSk7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZVN0YXRlKCk7XG4gIH1cblxuICBkcmF3KF9vcHRzOiB7c2hhZGVyTW9kdWxlUHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSk6IHZvaWQge1xuICAgIGNvbnN0IHttb2RlbCwgaW1hZ2VzLCBjb29yZGluYXRlQ29udmVyc2lvbiwgYm91bmRzfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3Qge2Rlc2F0dXJhdGUsIHRyYW5zcGFyZW50Q29sb3IsIHRpbnRDb2xvciwgbW9kdWxlUHJvcHN9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmIChcbiAgICAgICFtb2RlbCB8fFxuICAgICAgIWltYWdlcyB8fFxuICAgICAgT2JqZWN0LmtleXMoaW1hZ2VzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICFPYmplY3QudmFsdWVzKGltYWdlcykuZXZlcnkoaXRlbSA9PiBpdGVtKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldCBVQk8gdW5pZm9ybXMgZm9yIHRoZSByYXN0ZXIgbW9kdWxlXG4gICAgbW9kZWwuc2hhZGVySW5wdXRzLnNldFByb3BzKHtcbiAgICAgIHJhc3Rlcjoge1xuICAgICAgICBkZXNhdHVyYXRlOiBkZXNhdHVyYXRlIHx8IDAsXG4gICAgICAgIHRyYW5zcGFyZW50Q29sb3I6ICh0cmFuc3BhcmVudENvbG9yIHx8IFswLCAwLCAwLCAwXSkubWFwKHggPT4gKHggPyB4IC8gMjU1IDogMCkpLFxuICAgICAgICB0aW50Q29sb3I6ICh0aW50Q29sb3IgfHwgWzI1NSwgMjU1LCAyNTVdKS5zbGljZSgwLCAzKS5tYXAoeCA9PiB4IC8gMjU1KSxcbiAgICAgICAgY29vcmRpbmF0ZUNvbnZlcnNpb246IGNvb3JkaW5hdGVDb252ZXJzaW9uIHx8IDAsXG4gICAgICAgIGJvdW5kczogYm91bmRzIHx8IFswLCAwLCAwLCAwXSxcbiAgICAgICAgb3BhY2l0eTogdGhpcy5wcm9wcy5vcGFjaXR5ID8/IDFcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNldCBwcm9wcyBmb3IgZWFjaCBjdXN0b20gbW9kdWxlIHRocm91Z2ggc2hhZGVySW5wdXRzLlxuICAgIC8vIFdlIGNhbGwgZ2V0VW5pZm9ybXMgb3Vyc2VsdmVzIHRvIHNraXAgbW9kdWxlcyB0aGF0IHJldHVybiBudWxsIChpbmFjdGl2ZSkuXG4gICAgLy8gUGFzc2luZyBhbGxNb2R1bGVQcm9wcyBkaXJlY3RseSB0byBzZXRQcm9wcyB3b3VsZCBjYXVzZSB0aGUgbnVsbC1mYWxsYmFja1xuICAgIC8vIGluIFNoYWRlcklucHV0cyB0byB0cmVhdCB0aGUgZW50aXJlIHByb3BzIGJhZyBhcyB1bmlmb3Jtcy9iaW5kaW5ncyxcbiAgICAvLyB0cmlnZ2VyaW5nIGV4cGVuc2l2ZSB0ZXh0dXJlIHJlYmluZGluZyBldmVyeSBmcmFtZS5cbiAgICBjb25zdCBhbGxNb2R1bGVQcm9wcyA9IHsuLi5tb2R1bGVQcm9wcywgLi4uaW1hZ2VzfTtcbiAgICBjb25zdCBtb2R1bGVzID0gdGhpcy5wcm9wcy5tb2R1bGVzIHx8IFtdO1xuICAgIGZvciAoY29uc3QgbW9kIG9mIG1vZHVsZXMpIHtcbiAgICAgIGlmIChtb2QuZ2V0VW5pZm9ybXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbW9kLmdldFVuaWZvcm1zKGFsbE1vZHVsZVByb3BzKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIG1vZGVsLnNoYWRlcklucHV0cy5zZXRQcm9wcyh7W21vZC5uYW1lXTogcmVzdWx0fSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkcmF3U3VjY2VzcyA9IG1vZGVsLmRyYXcodGhpcy5jb250ZXh0LnJlbmRlclBhc3MpO1xuICAgIGlmICghZHJhd1N1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlUmVkcmF3KCk7XG4gICAgfVxuICB9XG5cbiAgX3NjaGVkdWxlUmVkcmF3KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yZWRyYXdTY2hlZHVsZWQpIHJldHVybjtcbiAgICB0aGlzLl9yZWRyYXdTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLl9yZWRyYXdTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmNvbnRleHQuZGVjaykge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGFjY2Vzc2luZyBwcml2YXRlIGRlY2suZ2wgcHJvcGVydHlcbiAgICAgICAgdGhpcy5jb250ZXh0LmRlY2suX25lZWRzUmVkcmF3ID0gJ1Jhc3RlckxheWVyIHBpcGVsaW5lIHBlbmRpbmcnO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250ZXh0LmxheWVyTWFuYWdlcj8uc2V0TmVlZHNSZWRyYXcoJ1Jhc3RlckxheWVyIHBpcGVsaW5lIHBlbmRpbmcnKTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5vblJlZHJhd05lZWRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnByb3BzLm9uUmVkcmF3TmVlZGVkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRTaGFkZXJzKCk6IGFueSB7XG4gICAgY29uc3Qge21vZHVsZXMgPSBbXX0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgbHVtYU1vZHVsZXMgPSBwcmVwYXJlTHVtYU1vZHVsZXMobW9kdWxlcyk7XG4gICAgY29uc3QgcGFyZW50U2hhZGVycyA9IHN1cGVyLmdldFNoYWRlcnMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJlbnRTaGFkZXJzLFxuICAgICAgdnM6IGJ1aWxkUmFzdGVyVmVydGV4U2hhZGVyKCksXG4gICAgICBmczogYnVpbGRSYXN0ZXJGcmFnbWVudFNoYWRlcigpLFxuICAgICAgbW9kdWxlczogWy4uLihwYXJlbnRTaGFkZXJzLm1vZHVsZXMgfHwgW10pLCByYXN0ZXJVbmlmb3JtcywgLi4ubHVtYU1vZHVsZXNdXG4gICAgfTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHVwZGF0ZVN0YXRlKHBhcmFtczogVXBkYXRlUGFyYW1ldGVyczxCaXRtYXBMYXllcjxSYXN0ZXJMYXllckFkZGVkUHJvcHM+Pik6IHZvaWQge1xuICAgIGNvbnN0IHtwcm9wcywgb2xkUHJvcHMsIGNoYW5nZUZsYWdzfSA9IHBhcmFtcztcbiAgICBjb25zdCBtb2R1bGVzID0gcHJvcHMgJiYgcHJvcHMubW9kdWxlcztcbiAgICBjb25zdCBvbGRNb2R1bGVzID0gb2xkUHJvcHMgJiYgb2xkUHJvcHMubW9kdWxlcztcblxuICAgIGlmIChjaGFuZ2VGbGFncy5leHRlbnNpb25zQ2hhbmdlZCB8fCAhbW9kdWxlc0VxdWFsKG1vZHVsZXMsIG9sZE1vZHVsZXMpKSB7XG4gICAgICB0aGlzLnN0YXRlLm1vZGVsPy5kZXN0cm95Py4oKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgX2dldE1vZGVsIGlzIGludGVybmFsIHRvIEJpdG1hcExheWVyXG4gICAgICB0aGlzLnN0YXRlLm1vZGVsID0gdGhpcy5fZ2V0TW9kZWwodGhpcy5jb250ZXh0LmRldmljZSB8fCB0aGlzLmNvbnRleHQuZ2wpO1xuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGVNYW5hZ2VyKCk/LmludmFsaWRhdGVBbGwoKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMgJiYgcHJvcHMuaW1hZ2VzKSB7XG4gICAgICB0aGlzLnVwZGF0ZUltYWdlcyh7cHJvcHMsIG9sZFByb3BzfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlTWFuYWdlciA9IHRoaXMuZ2V0QXR0cmlidXRlTWFuYWdlcigpO1xuXG4gICAgaWYgKHByb3BzLmJvdW5kcyAhPT0gb2xkUHJvcHMuYm91bmRzKSB7XG4gICAgICBjb25zdCBvbGRNZXNoID0gdGhpcy5zdGF0ZS5tZXNoO1xuICAgICAgY29uc3QgbWVzaCA9IHRoaXMuX2NyZWF0ZU1lc2goKTtcbiAgICAgIHRoaXMuc3RhdGUubW9kZWw/LnNldFZlcnRleENvdW50KG1lc2gudmVydGV4Q291bnQpO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWVzaCkge1xuICAgICAgICBpZiAob2xkTWVzaCAmJiBvbGRNZXNoW2tleV0gIT09IG1lc2hba2V5XSkge1xuICAgICAgICAgIGF0dHJpYnV0ZU1hbmFnZXI/LmludmFsaWRhdGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZSh7bWVzaCwgLi4udGhpcy5fZ2V0Q29vcmRpbmF0ZVVuaWZvcm1zKCl9KTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLl9pbWFnZUNvb3JkaW5hdGVTeXN0ZW0gIT09IG9sZFByb3BzLl9pbWFnZUNvb3JkaW5hdGVTeXN0ZW0pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5fZ2V0Q29vcmRpbmF0ZVVuaWZvcm1zKCkpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUltYWdlcyh7XG4gICAgcHJvcHMsXG4gICAgb2xkUHJvcHNcbiAgfToge1xuICAgIHByb3BzOiBSYXN0ZXJMYXllckFkZGVkUHJvcHM7XG4gICAgb2xkUHJvcHM6IFJhc3RlckxheWVyQWRkZWRQcm9wcztcbiAgfSk6IHZvaWQge1xuICAgIGNvbnN0IHtpbWFnZXN9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBkZXZpY2UgPSB0aGlzLmNvbnRleHQuZGV2aWNlO1xuICAgIGNvbnN0IGdsID0gZGV2aWNlPy5nbCB8fCB0aGlzLmNvbnRleHQuZ2w7XG5cbiAgICBjb25zdCBuZXdJbWFnZXMgPSBsb2FkSW1hZ2VzKHtcbiAgICAgIGdsLFxuICAgICAgZGV2aWNlLFxuICAgICAgaW1hZ2VzLFxuICAgICAgaW1hZ2VzRGF0YTogcHJvcHMuaW1hZ2VzLFxuICAgICAgb2xkSW1hZ2VzRGF0YTogb2xkUHJvcHMuaW1hZ2VzXG4gICAgfSk7XG4gICAgaWYgKG5ld0ltYWdlcykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aW1hZ2VzOiBuZXdJbWFnZXN9KTtcbiAgICB9XG4gIH1cblxuICBmaW5hbGl6ZVN0YXRlKCk6IHZvaWQge1xuICAgIHN1cGVyLmZpbmFsaXplU3RhdGUodGhpcy5jb250ZXh0KTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmltYWdlcykge1xuICAgICAgZm9yIChjb25zdCBpbWFnZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3RhdGUuaW1hZ2VzKSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbWFnZSkpIHtcbiAgICAgICAgICBpbWFnZS5tYXAoeCA9PiB4ICYmICh4LmRlc3Ryb3kgPyB4LmRlc3Ryb3koKSA6IHguZGVsZXRlPy4oKSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGltYWdlKSB7XG4gICAgICAgICAgaW1hZ2UuZGVzdHJveSA/IGltYWdlLmRlc3Ryb3koKSA6IGltYWdlLmRlbGV0ZT8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuUmFzdGVyTGF5ZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuUmFzdGVyTGF5ZXIubGF5ZXJOYW1lID0gJ1Jhc3RlckxheWVyJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBRUEsSUFBQUMsbUJBQUEsR0FBQUQsT0FBQTtBQU9BLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLEtBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLHdCQUFBLEdBQUFKLE9BQUE7QUFBcUUsU0FBQUssMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJBQUFFLENBQUEsUUFBQUcsS0FBQSxDQUFBQyxPQUFBLENBQUFOLENBQUEsTUFBQUUsQ0FBQSxHQUFBSywyQkFBQSxDQUFBUCxDQUFBLE1BQUFDLENBQUEsSUFBQUQsQ0FBQSx1QkFBQUEsQ0FBQSxD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