UNPKG

kepler.gl.geoiq

Version:

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

162 lines (133 loc) 19.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); 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 _deck = require("deck.gl"); var _constants = _interopRequireDefault(require("@luma.gl/constants")); var _shaderUtils = require("../layer-utils/shader-utils"); function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } 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; } } 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; } var defaultProps = _objectSpread(_objectSpread({}, _deck.LineLayer.defaultProps), {}, { // show arc if source is in brush brushSource: true, // show arc if target is in brush brushTarget: true, enableBrushing: true, getWidth: function getWidth(d) { return d.strokeWidth; }, getTargetColor: function getTargetColor(x) { return x.color || [0, 0, 0, 255]; }, strokeScale: 1, // brush radius in meters brushRadius: 100000, mousePosition: [0, 0] }); function addBrushingVsShader(vs) { var targetColorVs = (0, _shaderUtils.editShader)(vs, 'line target color vs', 'attribute vec4 instanceColors;', 'attribute vec4 instanceColors; attribute vec4 instanceTargetColors;'); var brushingVs = (0, _shaderUtils.editShader)(targetColorVs, 'line brushing vs', 'vec2 offset = getExtrusionOffset(target.xy - source.xy, positions.y, widthPixels);', 'vec2 offset = brushing_getExtrusionOffset(target.xy - source.xy, positions.y, project_uViewportSize, vec4(instanceSourcePositions.xy, instanceTargetPositions.xy), instanceWidths);'); return (0, _shaderUtils.editShader)(brushingVs, 'line color vs', 'vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;', "vec4 color = mix(instanceColors, instanceTargetColors, positions.x) / 255.;" + "vColor = vec4(color.rgb, color.a * opacity);"); } var LineBrushingLayer = exports["default"] = /*#__PURE__*/function (_LineLayer) { (0, _inherits2["default"])(LineBrushingLayer, _LineLayer); var _super = _createSuper(LineBrushingLayer); function LineBrushingLayer() { (0, _classCallCheck2["default"])(this, LineBrushingLayer); return _super.apply(this, arguments); } (0, _createClass2["default"])(LineBrushingLayer, [{ key: "getShaders", value: function getShaders() { var shaders = (0, _get2["default"])((0, _getPrototypeOf2["default"])(LineBrushingLayer.prototype), "getShaders", this).call(this); // const addons = getExtrusion + isPicked + isPtInRange; return { // ...shaders, vs: addBrushingVsShader(shaders.vs), fs: shaders.fs, // vs: this.props.fp64 ? addons + vs64 : addons + vs, modules: shaders.modules.concat(['brushing']) }; } }, { key: "initializeState", value: function initializeState() { (0, _get2["default"])((0, _getPrototypeOf2["default"])(LineBrushingLayer.prototype), "initializeState", this).call(this); var attributeManager = this.state.attributeManager; attributeManager.addInstanced({ instanceTargetColors: { size: 4, type: _constants["default"].UNSIGNED_BYTE, accessor: 'getTargetColor', update: this.calculateInstanceTargetColors } }); } }, { key: "draw", value: function draw(_ref) { var uniforms = _ref.uniforms; var _this$props = this.props, brushSource = _this$props.brushSource, brushTarget = _this$props.brushTarget, brushRadius = _this$props.brushRadius, enableBrushing = _this$props.enableBrushing, mousePosition = _this$props.mousePosition, strokeScale = _this$props.strokeScale; (0, _get2["default"])((0, _getPrototypeOf2["default"])(LineBrushingLayer.prototype), "draw", this).call(this, { uniforms: _objectSpread(_objectSpread({}, uniforms), {}, { brushing_uBrushSource: brushSource ? 1 : 0, brushing_uBrushTarget: brushTarget ? 1 : 0, brushing_uBrushRadius: brushRadius, brushing_uEnableBrushing: enableBrushing ? 1 : 0, brushing_uStrokeScale: strokeScale, brushing_uMousePosition: mousePosition ? new Float32Array(this.unproject(mousePosition)) : defaultProps.mousePosition }) }); } }, { key: "calculateInstanceTargetColors", value: function calculateInstanceTargetColors(attribute) { var _this$props2 = this.props, data = _this$props2.data, getTargetColor = _this$props2.getTargetColor; var value = attribute.value, size = attribute.size; var i = 0; var _iterator = _createForOfIteratorHelper(data), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var object = _step.value; var color = getTargetColor(object); value[i + 0] = color[0]; value[i + 1] = color[1]; value[i + 2] = color[2]; value[i + 3] = isNaN(color[3]) ? 255 : color[3]; i += size; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } }]); return LineBrushingLayer; }(_deck.LineLayer); LineBrushingLayer.layerName = 'LineBrushingLayer'; LineBrushingLayer.defaultProps = defaultProps; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzL2xpbmUtbGF5ZXIvbGluZS1sYXllci5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0UHJvcHMiLCJMaW5lTGF5ZXIiLCJicnVzaFNvdXJjZSIsImJydXNoVGFyZ2V0IiwiZW5hYmxlQnJ1c2hpbmciLCJnZXRXaWR0aCIsImQiLCJzdHJva2VXaWR0aCIsImdldFRhcmdldENvbG9yIiwieCIsImNvbG9yIiwic3Ryb2tlU2NhbGUiLCJicnVzaFJhZGl1cyIsIm1vdXNlUG9zaXRpb24iLCJhZGRCcnVzaGluZ1ZzU2hhZGVyIiwidnMiLCJ0YXJnZXRDb2xvclZzIiwiYnJ1c2hpbmdWcyIsIkxpbmVCcnVzaGluZ0xheWVyIiwic2hhZGVycyIsImZzIiwibW9kdWxlcyIsImNvbmNhdCIsImF0dHJpYnV0ZU1hbmFnZXIiLCJzdGF0ZSIsImFkZEluc3RhbmNlZCIsImluc3RhbmNlVGFyZ2V0Q29sb3JzIiwic2l6ZSIsInR5cGUiLCJHTCIsIlVOU0lHTkVEX0JZVEUiLCJhY2Nlc3NvciIsInVwZGF0ZSIsImNhbGN1bGF0ZUluc3RhbmNlVGFyZ2V0Q29sb3JzIiwidW5pZm9ybXMiLCJwcm9wcyIsImJydXNoaW5nX3VCcnVzaFNvdXJjZSIsImJydXNoaW5nX3VCcnVzaFRhcmdldCIsImJydXNoaW5nX3VCcnVzaFJhZGl1cyIsImJydXNoaW5nX3VFbmFibGVCcnVzaGluZyIsImJydXNoaW5nX3VTdHJva2VTY2FsZSIsImJydXNoaW5nX3VNb3VzZVBvc2l0aW9uIiwiRmxvYXQzMkFycmF5IiwidW5wcm9qZWN0IiwiYXR0cmlidXRlIiwiZGF0YSIsInZhbHVlIiwiaSIsIm9iamVjdCIsImlzTmFOIiwibGF5ZXJOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLFlBQVksbUNBQ2JDLGdCQUFVRCxZQURHO0FBRWhCO0FBQ0FFLEVBQUFB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aG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtMaW5lTGF5ZXJ9IGZyb20gJ2RlY2suZ2wnO1xuaW1wb3J0IEdMIGZyb20gJ0BsdW1hLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge2VkaXRTaGFkZXJ9IGZyb20gJ2RlY2tnbC1sYXllcnMvbGF5ZXItdXRpbHMvc2hhZGVyLXV0aWxzJztcblxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAuLi5MaW5lTGF5ZXIuZGVmYXVsdFByb3BzLFxuICAvLyBzaG93IGFyYyBpZiBzb3VyY2UgaXMgaW4gYnJ1c2hcbiAgYnJ1c2hTb3VyY2U6IHRydWUsXG4gIC8vIHNob3cgYXJjIGlmIHRhcmdldCBpcyBpbiBicnVzaFxuICBicnVzaFRhcmdldDogdHJ1ZSxcbiAgZW5hYmxlQnJ1c2hpbmc6IHRydWUsXG4gIGdldFdpZHRoOiBkID0+IGQuc3Ryb2tlV2lkdGgsXG4gIGdldFRhcmdldENvbG9yOiB4ID0+IHguY29sb3IgfHwgWzAsIDAsIDAsIDI1NV0sXG4gIHN0cm9rZVNjYWxlOiAxLFxuXG4gIC8vIGJydXNoIHJhZGl1cyBpbiBtZXRlcnNcbiAgYnJ1c2hSYWRpdXM6IDEwMDAwMCxcbiAgbW91c2VQb3NpdGlvbjogWzAsIDBdXG59O1xuXG5mdW5jdGlvbiBhZGRCcnVzaGluZ1ZzU2hhZGVyKHZzKSB7XG4gIGNvbnN0IHRhcmdldENvbG9yVnMgPSBlZGl0U2hhZGVyKFxuICAgIHZzLFxuICAgICdsaW5lIHRhcmdldCBjb2xvciB2cycsXG4gICAgJ2F0dHJpYnV0ZSB2ZWM0IGluc3RhbmNlQ29sb3JzOycsXG4gICAgJ2F0dHJpYnV0ZSB2ZWM0IGluc3RhbmNlQ29sb3JzOyBhdHRyaWJ1dGUgdmVjNCBpbnN0YW5jZVRhcmdldENvbG9yczsnXG4gICk7XG5cbiAgY29uc3QgYnJ1c2hpbmdWcyA9IGVkaXRTaGFkZXIoXG4gICAgdGFyZ2V0Q29sb3JWcyxcbiAgICAnbGluZSBicnVzaGluZyB2cycsXG4gICAgJ3ZlYzIgb2Zmc2V0ID0gZ2V0RXh0cnVzaW9uT2Zmc2V0KHRhcmdldC54eSAtIHNvdXJjZS54eSwgcG9zaXRpb25zLnksIHdpZHRoUGl4ZWxzKTsnLFxuICAgICd2ZWMyIG9mZnNldCA9IGJydXNoaW5nX2dldEV4dHJ1c2lvbk9mZnNldCh0YXJnZXQueHkgLSBzb3VyY2UueHksIHBvc2l0aW9ucy55LCBwcm9qZWN0X3VWaWV3cG9ydFNpemUsIHZlYzQoaW5zdGFuY2VTb3VyY2VQb3NpdGlvbnMueHksIGluc3RhbmNlVGFyZ2V0UG9zaXRpb25zLnh5KSwgaW5zdGFuY2VXaWR0aHMpOydcbiAgKTtcblxuICByZXR1cm4gZWRpdFNoYWRlcihcbiAgICBicnVzaGluZ1ZzLFxuICAgICdsaW5lIGNvbG9yIHZzJyxcbiAgICAndkNvbG9yID0gdmVjNChpbnN0YW5jZUNvbG9ycy5yZ2IsIGluc3RhbmNlQ29sb3JzLmEgKiBvcGFjaXR5KSAvIDI1NS47JyxcbiAgICBgdmVjNCBjb2xvciA9IG1peChpbnN0YW5jZUNvbG9ycywgaW5zdGFuY2VUYXJnZXRDb2xvcnMsIHBvc2l0aW9ucy54KSAvIDI1NS47YCArXG4gICAgYHZDb2xvciA9IHZlYzQoY29sb3IucmdiLCBjb2xvci5hICogb3BhY2l0eSk7YFxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmVCcnVzaGluZ0xheWVyIGV4dGVuZHMgTGluZUxheWVyIHtcbiAgZ2V0U2hhZGVycygpIHtcbiAgICBjb25zdCBzaGFkZXJzID0gc3VwZXIuZ2V0U2hhZGVycygpO1xuICAgIC8vIGNvbnN0IGFkZG9ucyA9IGdldEV4dHJ1c2lvbiArIGlzUGlja2VkICsgaXNQdEluUmFuZ2U7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gLi4uc2hhZGVycyxcbiAgICAgIHZzOiBhZGRCcnVzaGluZ1ZzU2hhZGVyKHNoYWRlcnMudnMpLFxuICAgICAgZnM6IHNoYWRlcnMuZnMsXG4gICAgICAvLyB2czogdGhpcy5wcm9wcy5mcDY0ID8gYWRkb25zICsgdnM2NCA6IGFkZG9ucyArIHZzLFxuICAgICAgbW9kdWxlczogc2hhZGVycy5tb2R1bGVzLmNvbmNhdChbJ2JydXNoaW5nJ10pXG4gICAgfTtcbiAgfVxuXG4gIGluaXRpYWxpemVTdGF0ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplU3RhdGUoKTtcbiAgICBjb25zdCB7YXR0cmlidXRlTWFuYWdlcn0gPSB0aGlzLnN0YXRlO1xuICAgIGF0dHJpYnV0ZU1hbmFnZXIuYWRkSW5zdGFuY2VkKHtcbiAgICAgIGluc3RhbmNlVGFyZ2V0Q29sb3JzOiB7XG4gICAgICAgIHNpemU6IDQsXG4gICAgICAgIHR5cGU6IEdMLlVOU0lHTkVEX0JZVEUsXG4gICAgICAgIGFjY2Vzc29yOiAnZ2V0VGFyZ2V0Q29sb3InLFxuICAgICAgICB1cGRhdGU6IHRoaXMuY2FsY3VsYXRlSW5zdGFuY2VUYXJnZXRDb2xvcnNcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRyYXcoe3VuaWZvcm1zfSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGJydXNoU291cmNlLFxuICAgICAgYnJ1c2hUYXJnZXQsXG4gICAgICBicnVzaFJhZGl1cyxcbiAgICAgIGVuYWJsZUJydXNoaW5nLFxuICAgICAgbW91c2VQb3NpdGlvbixcbiAgICAgIHN0cm9rZVNjYWxlXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBzdXBlci5kcmF3KHtcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIC4uLnVuaWZvcm1zLFxuICAgICAgICBicnVzaGluZ191QnJ1c2hTb3VyY2U6IGJydXNoU291cmNlID8gMSA6IDAsXG4gICAgICAgIGJydXNoaW5nX3VCcnVzaFRhcmdldDogYnJ1c2hUYXJnZXQgPyAxIDogMCxcbiAgICAgICAgYnJ1c2hpbmdfdUJydXNoUmFkaXVzOiBicnVzaFJhZGl1cyxcbiAgICAgICAgYnJ1c2hpbmdfdUVuYWJsZUJydXNoaW5nOiBlbmFibGVCcnVzaGluZyA/IDEgOiAwLFxuICAgICAgICBicnVzaGluZ191U3Ryb2tlU2NhbGU6IHN0cm9rZVNjYWxlLFxuICAgICAgICBicnVzaGluZ191TW91c2VQb3NpdGlvbjogbW91c2VQb3NpdGlvblxuICAgICAgICAgID8gbmV3IEZsb2F0MzJBcnJheSh0aGlzLnVucHJvamVjdChtb3VzZVBvc2l0aW9uKSlcbiAgICAgICAgICA6IGRlZmF1bHRQcm9wcy5tb3VzZVBvc2l0aW9uXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjYWxjdWxhdGVJbnN0YW5jZVRhcmdldENvbG9ycyhhdHRyaWJ1dGUpIHtcbiAgICBjb25zdCB7ZGF0YSwgZ2V0VGFyZ2V0Q29sb3J9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7dmFsdWUsIHNpemV9ID0gYXR0cmlidXRlO1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBkYXRhKSB7XG4gICAgICBjb25zdCBjb2xvciA9IGdldFRhcmdldENvbG9yKG9iamVjdCk7XG4gICAgICB2YWx1ZVtpICsgMF0gPSBjb2xvclswXTtcbiAgICAgIHZhbHVlW2kgKyAxXSA9IGNvbG9yWzFdO1xuICAgICAgdmFsdWVbaSArIDJdID0gY29sb3JbMl07XG4gICAgICB2YWx1ZVtpICsgM10gPSBpc05hTihjb2xvclszXSkgPyAyNTUgOiBjb2xvclszXTtcbiAgICAgIGkgKz0gc2l6ZTtcbiAgICB9XG4gIH1cbn1cblxuTGluZUJydXNoaW5nTGF5ZXIubGF5ZXJOYW1lID0gJ0xpbmVCcnVzaGluZ0xheWVyJztcbkxpbmVCcnVzaGluZ0xheWVyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbiJdfQ==