kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
159 lines (128 loc) • 17.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
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 _deck = require("deck.gl");
var _luma = require("luma.gl");
var _h3Utils = require("../../layers/h3-hexagon-layer/h3-utils");
var _shaderUtils = require("../layer-utils/shader-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 addInstanceCoverage(vs) {
var addDecl = (0, _shaderUtils.editShader)(vs, 'hexagon cell vs add instance', 'attribute vec3 instancePickingColors;', "attribute vec3 instancePickingColors;\n attribute float instanceCoverage;");
return (0, _shaderUtils.editShader)(addDecl, 'hexagon cell vs add instance', 'float dotRadius = project_scale(radius) * mix(coverage, 0.0, noRender);', 'float dotRadius = project_scale(radius) * mix(coverage * instanceCoverage, 0.0, noRender);');
} // TODO: export all dekc.gl layers from kepler.gl
var H3HexagonCellLayer =
/*#__PURE__*/
function (_HexagonCellLayer) {
(0, _inherits2["default"])(H3HexagonCellLayer, _HexagonCellLayer);
function H3HexagonCellLayer() {
(0, _classCallCheck2["default"])(this, H3HexagonCellLayer);
return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(H3HexagonCellLayer).apply(this, arguments));
}
(0, _createClass2["default"])(H3HexagonCellLayer, [{
key: "getShaders",
value: function getShaders() {
var shaders = (0, _get2["default"])((0, _getPrototypeOf2["default"])(H3HexagonCellLayer.prototype), "getShaders", this).call(this);
return _objectSpread({}, shaders, {
vs: addInstanceCoverage(shaders.vs)
});
}
}, {
key: "getCylinderGeometry",
value: function getCylinderGeometry(radius) {
var distortion = this.getDistortion();
var cylinderGeometry = new _luma.CylinderGeometry({
radius: radius,
topRadius: radius,
bottomRadius: radius,
topCap: true,
bottomCap: true,
height: 1,
verticalAxis: 'z',
nradial: 6,
nvertical: 1
});
if (distortion) {
var pos = cylinderGeometry.attributes.positions.value;
var adjusted = (0, _h3Utils.distortCylinderPositions)(pos, distortion);
cylinderGeometry.attributes.positions.value = adjusted;
}
return cylinderGeometry;
}
}, {
key: "getDistortion",
value: function getDistortion() {
var _this = this;
var _this$props = this.props,
hexagonVertices = _this$props.hexagonVertices,
hexagonCenter = _this$props.hexagonCenter;
if (Array.isArray(hexagonVertices) && hexagonVertices.length >= 6 && Array.isArray(hexagonCenter)) {
var screenVertices = hexagonVertices.map(function (d) {
return _this.projectFlat(d);
});
var screenCentroid = this.projectFlat(hexagonCenter);
return (0, _h3Utils.getH3VerticeTransform)(screenVertices, screenCentroid);
}
return null;
}
}, {
key: "updateRadiusAngle",
value: function updateRadiusAngle() {
var _this$props2 = this.props,
angle = _this$props2.angle,
radius = _this$props2.radius;
var hexagonVertices = this.props.hexagonVertices;
if (Array.isArray(hexagonVertices) && hexagonVertices.length >= 6) {
var viewport = this.context.viewport; // calculate angle and vertices from hexagonVertices if provided
var vertices = this.props.hexagonVertices;
var vertex0 = vertices[0];
var vertex3 = vertices[3]; // project to space coordinates
var _viewport$getDistance = viewport.getDistanceScales(),
pixelsPerMeter = _viewport$getDistance.pixelsPerMeter;
var spaceCoord0 = this.projectFlat(vertex0);
var spaceCoord3 = this.projectFlat(vertex3);
angle = (0, _h3Utils.getAngle)(spaceCoord0, spaceCoord3);
radius = (0, _h3Utils.getRadius)(spaceCoord0, spaceCoord3) / pixelsPerMeter[0];
}
this.setState({
angle: angle,
radius: radius
});
}
}, {
key: "draw",
value: function draw(opts) {
var uniforms = opts.uniforms;
(0, _get2["default"])((0, _getPrototypeOf2["default"])(H3HexagonCellLayer.prototype), "draw", this).call(this, _objectSpread({}, opts, {
uniforms: _objectSpread({}, uniforms, {
picking_uHighlightScale: this.props.extruded ? 1.4 : 0.0
})
}));
}
}, {
key: "initializeState",
value: function initializeState() {
(0, _get2["default"])((0, _getPrototypeOf2["default"])(H3HexagonCellLayer.prototype), "initializeState", this).call(this);
this.getAttributeManager().addInstanced({
instanceCoverage: {
size: 1,
accessor: 'getCoverage'
}
});
}
}]);
return H3HexagonCellLayer;
}(_deck.HexagonCellLayer);
exports["default"] = H3HexagonCellLayer;
H3HexagonCellLayer.layerName = 'H3HexagonCellLayer';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzL2gzLWhleGFnb24tY2VsbC1sYXllci9oMy1oZXhhZ29uLWNlbGwtbGF5ZXIuanMiXSwibmFtZXMiOlsiYWRkSW5zdGFuY2VDb3ZlcmFnZSIsInZzIiwiYWRkRGVjbCIsIkgzSGV4YWdvbkNlbGxMYXllciIsInNoYWRlcnMiLCJyYWRpdXMiLCJkaXN0b3J0aW9uIiwiZ2V0RGlzdG9ydGlvbiIsImN5bGluZGVyR2VvbWV0cnkiLCJDeWxpbmRlckdlb21ldHJ5IiwidG9wUmFkaXVzIiwiYm90dG9tUmFkaXVzIiwidG9wQ2FwIiwiYm90dG9tQ2FwIiwiaGVpZ2h0IiwidmVydGljYWxBeGlzIiwibnJhZGlhbCIsIm52ZXJ0aWNhbCIsInBvcyIsImF0dHJpYnV0ZXMiLCJwb3NpdGlvbnMiLCJ2YWx1ZSIsImFkanVzdGVkIiwicHJvcHMiLCJoZXhhZ29uVmVydGljZXMiLCJoZXhhZ29uQ2VudGVyIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwic2NyZWVuVmVydGljZXMiLCJtYXAiLCJkIiwicHJvamVjdEZsYXQiLCJzY3JlZW5DZW50cm9pZCIsImFuZ2xlIiwidmlld3BvcnQiLCJjb250ZXh0IiwidmVydGljZXMiLCJ2ZXJ0ZXgwIiwidmVydGV4MyIsImdldERpc3RhbmNlU2NhbGVzIiwicGl4ZWxzUGVyTWV0ZXIiLCJzcGFjZUNvb3JkMCIsInNwYWNlQ29vcmQzIiwic2V0U3RhdGUiLCJvcHRzIiwidW5pZm9ybXMiLCJwaWNraW5nX3VIaWdobGlnaHRTY2FsZSIsImV4dHJ1ZGVkIiwiZ2V0QXR0cmlidXRlTWFuYWdlciIsImFkZEluc3RhbmNlZCIsImluc3RhbmNlQ292ZXJhZ2UiLCJzaXplIiwiYWNjZXNzb3IiLCJIZXhhZ29uQ2VsbExheWVyIiwibGF5ZXJOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsU0FBU0EsbUJB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O0FBQUEsWUFTMURDLGNBVDBELHlCQVMxREEsY0FUMEQ7O0FBVWpFLFlBQU1DLFdBQVcsR0FBRyxLQUFLVixXQUFMLENBQWlCTSxPQUFqQixDQUFwQjtBQUNBLFlBQU1LLFdBQVcsR0FBRyxLQUFLWCxXQUFMLENBQWlCTyxPQUFqQixDQUFwQjtBQUVBTCxRQUFBQSxLQUFLLEdBQUcsdUJBQVNRLFdBQVQsRUFBc0JDLFdBQXRCLENBQVI7QUFDQXRDLFFBQUFBLE1BQU0sR0FBRyx3QkFBVXFDLFdBQVYsRUFBdUJDLFdBQXZCLElBQXFDRixjQUFjLENBQUMsQ0FBRCxDQUE1RDtBQUNEOztBQUVELFdBQUtHLFFBQUwsQ0FBYztBQUFDVixRQUFBQSxLQUFLLEVBQUxBLEtBQUQ7QUFBUTdCLFFBQUFBLE1BQU0sRUFBTkE7QUFBUixPQUFkO0FBQ0Q7Ozt5QkFFSXdDLEksRUFBTTtBQUFBLFVBQ0ZDLFFBREUsR0FDVUQsSUFEVixDQUNGQyxRQURFO0FBR1QsdUlBQ0tELElBREw7QUFFRUMsUUFBQUEsUUFBUSxvQkFDSEEsUUFERztBQUVOQyxVQUFBQSx1QkFBdUIsRUFBRSxLQUFLeEIsS0FBTCxDQUFXeUIsUUFBWCxHQUFzQixHQUF0QixHQUE0QjtBQUYvQztBQUZWO0FBT0Q7OztzQ0FFaUI7QUFDaEI7QUFFQSxXQUFLQyxtQkFBTCxHQUEyQkMsWUFBM0IsQ0FBd0M7QUFDdENDLFFBQUFBLGdCQUFnQixFQUFFO0FBQUNDLFVBQUFBLElBQUksRUFBRSxDQUFQO0FBQVVDLFVBQUFBLFFBQVEsRUFBRTtBQUFwQjtBQURvQixPQUF4QztBQUdEOzs7RUEzRjZDQyxzQjs7O0FBOEZoRG5ELGtCQUFrQixDQUFDb0QsU0FBbkIsR0FBK0Isb0JBQS9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtIZXhhZ29uQ2VsbExheWVyfSBmcm9tICdkZWNrLmdsJztcbmltcG9ydCB7Q3lsaW5kZXJHZW9tZXRyeX0gZnJvbSAnbHVtYS5nbCc7XG5pbXBvcnQge2dldEFuZ2xlLCBnZXRSYWRpdXMsIGdldEgzVmVydGljZVRyYW5zZm9ybSwgZGlzdG9ydEN5bGluZGVyUG9zaXRpb25zfSBmcm9tICdsYXllcnMvaDMtaGV4YWdvbi1sYXllci9oMy11dGlscyc7XG5pbXBvcnQge2VkaXRTaGFkZXJ9IGZyb20gJ2RlY2tnbC1sYXllcnMvbGF5ZXItdXRpbHMvc2hhZGVyLXV0aWxzJztcblxuZnVuY3Rpb24gYWRkSW5zdGFuY2VDb3ZlcmFnZSh2cykge1xuICBjb25zdCBhZGREZWNsID0gZWRpdFNoYWRlcihcbiAgICB2cyxcbiAgICAnaGV4YWdvbiBjZWxsIHZzIGFkZCBpbnN0YW5jZScsXG4gICAgJ2F0dHJpYnV0ZSB2ZWMzIGluc3RhbmNlUGlja2luZ0NvbG9yczsnLFxuICAgIGBhdHRyaWJ1dGUgdmVjMyBpbnN0YW5jZVBpY2tpbmdDb2xvcnM7XG4gICAgIGF0dHJpYnV0ZSBmbG9hdCBpbnN0YW5jZUNvdmVyYWdlO2BcbiAgKTtcblxuICByZXR1cm4gZWRpdFNoYWRlcihcbiAgICBhZGREZWNsLFxuICAgICdoZXhhZ29uIGNlbGwgdnMgYWRkIGluc3RhbmNlJyxcbiAgICAnZmxvYXQgZG90UmFkaXVzID0gcHJvamVjdF9zY2FsZShyYWRpdXMpICogbWl4KGNvdmVyYWdlLCAwLjAsIG5vUmVuZGVyKTsnLFxuICAgICdmbG9hdCBkb3RSYWRpdXMgPSBwcm9qZWN0X3NjYWxlKHJhZGl1cykgKiBtaXgoY292ZXJhZ2UgKiBpbnN0YW5jZUNvdmVyYWdlLCAwLjAsIG5vUmVuZGVyKTsnXG4gICk7XG59XG5cbi8vIFRPRE86IGV4cG9ydCBhbGwgZGVrYy5nbCBsYXllcnMgZnJvbSBrZXBsZXIuZ2xcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEgzSGV4YWdvbkNlbGxMYXllciBleHRlbmRzIEhleGFnb25DZWxsTGF5ZXIge1xuXG4gIGdldFNoYWRlcnMoKSB7XG4gICAgY29uc3Qgc2hhZGVycyA9IHN1cGVyLmdldFNoYWRlcnMoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGFkZXJzLFxuICAgICAgdnM6IGFkZEluc3RhbmNlQ292ZXJhZ2Uoc2hhZGVycy52cylcbiAgICB9O1xuICB9XG5cbiAgZ2V0Q3lsaW5kZXJHZW9tZXRyeShyYWRpdXMpIHtcbiAgICBjb25zdCBkaXN0b3J0aW9uID0gdGhpcy5nZXREaXN0b3J0aW9uKCk7XG5cbiAgICBjb25zdCBjeWxpbmRlckdlb21ldHJ5ID0gbmV3IEN5bGluZGVyR2VvbWV0cnkoe1xuICAgICAgcmFkaXVzLFxuICAgICAgdG9wUmFkaXVzOiByYWRpdXMsXG4gICAgICBib3R0b21SYWRpdXM6IHJhZGl1cyxcbiAgICAgIHRvcENhcDogdHJ1ZSxcbiAgICAgIGJvdHRvbUNhcDogdHJ1ZSxcbiAgICAgIGhlaWdodDogMSxcbiAgICAgIHZlcnRpY2FsQXhpczogJ3onLFxuICAgICAgbnJhZGlhbDogNixcbiAgICAgIG52ZXJ0aWNhbDogMVxuICAgIH0pO1xuXG4gICAgaWYgKGRpc3RvcnRpb24pIHtcbiAgICAgIGNvbnN0IHBvcyA9IGN5bGluZGVyR2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbnMudmFsdWU7XG4gICAgICBjb25zdCBhZGp1c3RlZCA9IGRpc3RvcnRDeWxpbmRlclBvc2l0aW9ucyhwb3MsIGRpc3RvcnRpb24pO1xuICAgICAgY3lsaW5kZXJHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9ucy52YWx1ZSA9IGFkanVzdGVkO1xuICAgIH1cblxuICAgIHJldHVybiBjeWxpbmRlckdlb21ldHJ5O1xuICB9XG5cbiAgZ2V0RGlzdG9ydGlvbigpIHtcbiAgICBjb25zdCB7aGV4YWdvblZlcnRpY2VzLCBoZXhhZ29uQ2VudGVyfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZXhhZ29uVmVydGljZXMpICYmXG4gICAgICBoZXhhZ29uVmVydGljZXMubGVuZ3RoID49IDYgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoaGV4YWdvbkNlbnRlcikpIHtcbiAgICAgICAgY29uc3Qgc2NyZWVuVmVydGljZXMgPSBoZXhhZ29uVmVydGljZXMubWFwKGQgPT4gdGhpcy5wcm9qZWN0RmxhdChkKSk7XG4gICAgICAgIGNvbnN0IHNjcmVlbkNlbnRyb2lkID0gdGhpcy5wcm9qZWN0RmxhdChoZXhhZ29uQ2VudGVyKTtcbiAgICAgICAgcmV0dXJuIGdldEgzVmVydGljZVRyYW5zZm9ybShzY3JlZW5WZXJ0aWNlcywgc2NyZWVuQ2VudHJvaWQpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdXBkYXRlUmFkaXVzQW5nbGUoKSB7XG4gICAgbGV0IHthbmdsZSwgcmFkaXVzfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge2hleGFnb25WZXJ0aWNlc30gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGV4YWdvblZlcnRpY2VzKSAmJiBoZXhhZ29uVmVydGljZXMubGVuZ3RoID49IDYpIHtcbiAgICAgIGNvbnN0IHt2aWV3cG9ydH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAvLyBjYWxjdWxhdGUgYW5nbGUgYW5kIHZlcnRpY2VzIGZyb20gaGV4YWdvblZlcnRpY2VzIGlmIHByb3ZpZGVkXG4gICAgICBjb25zdCB2ZXJ0aWNlcyA9IHRoaXMucHJvcHMuaGV4YWdvblZlcnRpY2VzO1xuXG4gICAgICBjb25zdCB2ZXJ0ZXgwID0gdmVydGljZXNbMF07XG4gICAgICBjb25zdCB2ZXJ0ZXgzID0gdmVydGljZXNbM107XG5cbiAgICAgIC8vIHByb2plY3QgdG8gc3BhY2UgY29vcmRpbmF0ZXNcbiAgICAgIGNvbnN0IHtwaXhlbHNQZXJNZXRlcn0gPSB2aWV3cG9ydC5nZXREaXN0YW5jZVNjYWxlcygpO1xuICAgICAgY29uc3Qgc3BhY2VDb29yZDAgPSB0aGlzLnByb2plY3RGbGF0KHZlcnRleDApO1xuICAgICAgY29uc3Qgc3BhY2VDb29yZDMgPSB0aGlzLnByb2plY3RGbGF0KHZlcnRleDMpO1xuXG4gICAgICBhbmdsZSA9IGdldEFuZ2xlKHNwYWNlQ29vcmQwLCBzcGFjZUNvb3JkMyk7XG4gICAgICByYWRpdXMgPSBnZXRSYWRpdXMoc3BhY2VDb29yZDAsIHNwYWNlQ29vcmQzKSAvcGl4ZWxzUGVyTWV0ZXJbMF07XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7YW5nbGUsIHJhZGl1c30pO1xuICB9XG5cbiAgZHJhdyhvcHRzKSB7XG4gICAgY29uc3Qge3VuaWZvcm1zfSA9IG9wdHM7XG5cbiAgICBzdXBlci5kcmF3KHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICAuLi51bmlmb3JtcyxcbiAgICAgICAgcGlja2luZ191SGlnaGxpZ2h0U2NhbGU6IHRoaXMucHJvcHMuZXh0cnVkZWQgPyAxLjQgOiAwLjBcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgaW5pdGlhbGl6ZVN0YXRlKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemVTdGF0ZSgpO1xuXG4gICAgdGhpcy5nZXRBdHRyaWJ1dGVNYW5hZ2VyKCkuYWRkSW5zdGFuY2VkKHtcbiAgICAgIGluc3RhbmNlQ292ZXJhZ2U6IHtzaXplOiAxLCBhY2Nlc3NvcjogJ2dldENvdmVyYWdlJ31cbiAgICB9KTtcbiAgfVxufVxuXG5IM0hleGFnb25DZWxsTGF5ZXIubGF5ZXJOYW1lID0gJ0gzSGV4YWdvbkNlbGxMYXllcic7XG4iXX0=