kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
245 lines (210 loc) • 30.6 kB
JavaScript
"use strict";
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 _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _core = require("@deck.gl/core");
var _geoLayers = require("@deck.gl/geo-layers");
var _layers = require("@deck.gl/layers");
var _pbf = _interopRequireDefault(require("pbf"));
var _vectorTile = require("@mapbox/vector-tile");
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; } }
// import debounce from 'lodash.debounce';
// function calculateTargetPopulation(range, gender) {}
// const range = ['pop_f_50_54', 'pop_f_55_59', 'pop_f_65_69'];
// inDebounce = 0;
// clearTimeout(inDebounce);
// inDebounce = setTimeout(() => {
// clearTimeout(inDebounce);
// inDebounce = 0;
// }, 300);
// function debounce(inner, ms = 0) {
// let timer = null;
// let resolves = [];
// return function(...args) {
// // Run the function after a certain amount of time
// clearTimeout(timer);
// timer = setTimeout(() => {
// // Get the result of the inner function, then apply it to the resolve function of
// // each promise that has been created since the last time the inner function was run
// let result = inner(...args);
// resolves.forEach(r => r(result));
// resolves = [];
// }, ms);
// return new Promise(r => resolves.push(r));
// };
// }
function _getTileData(host, viewportLoading, range, _ref) {
var x = _ref.x,
y = _ref.y,
z = _ref.z;
var mapSource = // `https://test-viz-geoiq.s3.ap-south-1.amazonaws.com/ind_pop/` +
// `${z}/${x}/${y}` +
// `.pbf`;
// if (viewportLoading === true) {
// mapSource = '';
// }
"http://13.232.107.248:5010/tiles/" + "".concat(z, "/").concat(x, "/").concat(y) + ".mvt";
return fetch(mapSource).then(function (response) {
return response.arrayBuffer();
}).then(function (buffer) {
var tile = new _vectorTile.VectorTile(new _pbf["default"](buffer));
var features = [];
for (var layerName in tile.layers) {
var vectorTileLayer = tile.layers[layerName];
var _loop = function _loop() {
var vectorTileFeature = vectorTileLayer.feature(k);
var feature = vectorTileFeature.toGeoJSON(x, y, z);
var total_target_pop = range.reduce(function (accu, prop) {
return accu + feature.properties[prop];
}, 0);
feature.properties = {};
feature.properties.total_target_pop = total_target_pop;
features.push(feature);
};
for (var k = 0; k < vectorTileLayer.length; k++) {
_loop();
}
}
return features;
});
}
var DeckGLMVTLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
(0, _inherits2["default"])(DeckGLMVTLayer, _CompositeLayer);
var _super = _createSuper(DeckGLMVTLayer);
function DeckGLMVTLayer() {
(0, _classCallCheck2["default"])(this, DeckGLMVTLayer);
return _super.apply(this, arguments);
}
(0, _createClass2["default"])(DeckGLMVTLayer, [{
key: "initialiseState",
value: function initialiseState() {
this.state = {
features: [],
getFillColor: {
filterVals: [0, 630]
}
};
} // inDebounce = 0;
// componentWillRecieveProps(nextProps) {
// console.log('reaching inside componentWillRecieveProps');
// if (
// !_.isEqual(this.props.mapState, nextProps.mapState) &&
// nextProps.layers &&
// nextProps.widget.config.bounds
// ) {
// this.setState({viewportLoading: true});
// clearTimeout(this.inDebounce);
// this.inDebounce = setTimeout(() => {
// this.setState({viewportLoading: false});
// this.renderLayers();
// clearTimeout(this.inDebounce);
// this.inDebounce = 0;
// }, 1000);
// }
// }
}, {
key: "renderLayers",
value: function renderLayers() {
var _this = this;
var dataset = this.props.dataset;
var viewportLoading = this.state.viewportLoading;
console.log('viewportLoading inside renderLayers', viewportLoading);
console.log('state inside renderLayers inside tile layer', this.state);
console.log('this should contsain componentWillRecieveProps', this);
var tileLayer = new _geoLayers.TileLayer({
visible: false,
maxCacheSize: null,
onViewportLoaded: function onViewportLoaded(data) {
if (data.length > 0) {
var finalData = data.flat();
_this.props.loadEDLinkData({
type: 'FeatureCollection',
features: finalData,
crs: {
type: 'name',
properties: 'urn:ogc:def:crs:OGC:1.3:CRS84'
}
}, _this.props.url);
}
},
getTileData: function getTileData(args) {
return _getTileData(dataset, viewportLoading, dataset.populationRange, args);
} // minZoom: 10,
// renderSubLayers: this.renderSubLayers.bind(this),
// updateTriggers: this.props.updateTriggers
});
var geoJsonData = [];
if (this.props.dataset.data && this.props.dataset.data.length) {
geoJsonData = this.props.dataset.data.map(function (d) {
return d[0];
});
}
var layerProps = {
lineWidthScale: this.props.lineWidthScale
};
var newGLayer = new _layers.GeoJsonLayer(_objectSpread(_objectSpread({}, layerProps), {}, {
data: geoJsonData,
// parameters: {depthMask: false},
// extruded: true,
opacity: this.props.opacity,
filled: this.props.filled,
stroked: this.props.stroked,
lineMiterLimit: 4,
// getElevation: feature => feature.properties.height || 0,
getFillColor: mapPropertyToValueColorField(this.props.cScale, this.props.getEncodedChannelValue, this.props.colorField, this.props.color),
getLineColor: mapPropertyToValueLineColor(this.props.scScale, this.props.getEncodedChannelValue, this.props.strokeColorField, this.props.strokeColor, this.props.color),
getLineWidth: mapPropertyToValueLineWidth(this.props.sScale, this.props.getEncodedChannelValue, this.props.sizeField),
updateTriggers: {
getFillColor: mapPropertyToValueColorField(this.props.cScale, this.props.getEncodedChannelValue, this.props.colorField, this.props.color),
getLineColor: mapPropertyToValueLineColor(this.props.scScale, this.props.getEncodedChannelValue, this.props.strokeColorField, this.props.strokeColor, this.props.color),
getLineWidth: mapPropertyToValueLineWidth(this.props.sScale, this.props.getEncodedChannelValue, this.props.sizeField)
},
// lightSetting: {
// ambientRatio: 0.2
// },
getPosition: function getPosition(d) {
return d.position;
},
pickable: true,
autoHighlight: true,
rounded: true,
onHover: function onHover(info) {
return console.log('geojson layer hovered', info.object);
},
onClick: function onClick(info) {
return console.log('geojson layer clicked', info.object);
}
}));
return [tileLayer, newGLayer];
}
}]);
return DeckGLMVTLayer;
}(_core.CompositeLayer);
function mapPropertyToValueColorField(cScale, getEncodedChannelValue, colorField, color) {
return function (f) {
return colorField ? getEncodedChannelValue(cScale, f.properties[colorField.name], colorField) : color; // }
};
}
function mapPropertyToValueLineColor(scScale, getEncodedChannelValue, strokeColorField, strokeColor, color) {
return function (f) {
return scScale ? getEncodedChannelValue(scScale, f.properties[strokeColorField.name], strokeColorField) : f.properties.lineColor || strokeColor || color;
};
}
function mapPropertyToValueLineWidth(sScale, getEncodedChannelValue, sizeField) {
return function (f) {
console.log();
return sScale ? getEncodedChannelValue(sScale, f.properties[sizeField.name], sizeField) : 1;
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzL212dC1nZW9qc29uLWxheWVyL212dC1nZW9qc29uLWxheWVyLmpzIl0sIm5hbWVzIjpbImdldFRpbGVEYXRhIiwiaG9zdCIsInZpZXdwb3J0TG9hZGluZyIsInJhbmdlIiwieCIsInkiLCJ6IiwibWFwU291cmNlIiwiZmV0Y2giLCJ0aGVuIiwicmVzcG9uc2UiLCJhcnJheUJ1ZmZlciIsImJ1ZmZlciIsInRpbGUiLCJWZWN0b3JUaWxlIiwiUHJvdG9idWYiLCJmZWF0dXJlcyIsImxheWVyTmFtZSIsImxheWVycyIsInZlY3RvclRpbGVMYXllciIsInZlY3RvclRpbGVGZWF0dXJlIiwiZmVhdHVyZSIsImsiLCJ0b0dlb0pTT04iLCJ0b3RhbF90YXJnZXRfcG9wIiwicmVkdWNlIiwiYWNjdSIsInByb3AiLCJwcm9wZXJ0aWVzIiwicHVzaCIsImxlbmd0aCIsIkRlY2tHTE1WVExheWVyIiwic3RhdGUiLCJnZXRGaWxsQ29sb3IiLCJmaWx0ZXJWYWxzIiwiZGF0YXNldCIsInByb3BzIiwiY29uc29sZSIsImxvZyIsInRpbGVMYXllciIsIkRlY2tHTFRpbGVMYXllciIsInZpc2libGUiLCJtYXhDYWNoZVNpemUiLCJvblZpZXdwb3J0TG9hZGVkIiwiZGF0YSIsImZpbmFsRGF0YSIsImZsYXQiLCJsb2FkRURMaW5rRGF0YSIsInR5cGUiLCJjcnMiLCJ1cmwiLCJhcmdzIiwicG9wdWxhdGlvblJhbmdlIiwiZ2VvSnNvbkRhdGEiLCJtYXAiLCJkIiwibGF5ZXJQcm9wcyIsImxpbmVXaWR0aFNjYWxlIiwibmV3R0xheWVyIiwiR2VvSnNvbkxheWVyIiwib3BhY2l0eSIsImZpbGxlZCIsInN0cm9rZWQiLCJsaW5lTWl0ZXJMaW1pdCIsIm1hcFByb3BlcnR5VG9WYWx1ZUNvbG9yRmllbGQiLCJjU2NhbGUiLCJnZXRFbmNvZGVkQ2hhbm5lbFZhbHVlIiwiY29sb3JGaWVsZCIsImNvbG9yIiwiZ2V0TGluZUNvbG9yIiwibWFwUHJvcGVydHlUb1ZhbHVlTGluZUNvbG9yIiwic2NTY2FsZSIsInN0cm9rZUNvbG9yRmllbGQiLCJzdHJva2VDb2xvciIsImdldExpbmVXaWR0aCIsIm1hcFByb3BlcnR5VG9WYWx1ZUxpbmVXaWR0aCIsInNTY2FsZSIsInNpemVGaWVsZCIsInVwZGF0ZVRyaWdnZXJzIiwiZ2V0UG9zaXRpb24iLCJwb3NpdGlvbiIsInBpY2thYmxlIiwiYXV0b0hpZ2hsaWdodCIsInJvdW5kZWQiLCJvbkhvdmVyIiwiaW5mbyIsIm9iamVjdCIsIm9uQ2xpY2siLCJDb21wb3NpdGVMYXllciIsImYiLCJuYW1lIiwibGluZUNvbG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBLFNBQVNBLFlBQVQsQ0FBcUJDLElBQXJCLEVBQTJCQyxlQUEzQixFQUE0Q0MsS0FBNUMsUUFBOEQ7QUFBQSxNQUFWQyxDQUFVLFFBQVZBLENBQVU7QUFBQSxNQUFQQyxDQUFPLFFBQVBBLENBQU87QUFBQSxNQUFKQyxDQUFJLFFBQUpBLENBQUk7QUFDNUQsTUFBSUMsU0FBUyxHQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLGtEQUF5Q0QsQ0FBekMsY0FBOENGLENBQTlDLGNBQW1EQyxDQUFuRCxVQVJGO0FBU0EsU0FBT0csS0FBSyxDQUFDRCxTQUFELENBQUwsQ0FDSkUsSUFESSxDQUNDLFVBQUFDLFFBQVE7QUFBQSxXQUFJQSxRQUFRLENBQUNDLFdBQVQsRUFBSjtBQUFBLEdBRFQsRUFFSkYsSUFGSSxDQUVDLFVBQUFHLE1BQU0sRUFBSTtBQUNkLFFBQU1DLElBQUksR0FBRyxJQUFJQyxzQkFBSixDQUFlLElB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a0IsSUFBOUIsQ0FGb0IsRUFHcEJsQixnQkFIb0IsQ0FEWixHQU1WaUIsQ0FBQyxDQUFDN0QsVUFBRixDQUFhK0QsU0FBYixJQUEwQmxCLFdBQTFCLElBQXlDTCxLQU43QztBQU9ELEdBUkQ7QUFTRDs7QUFFRCxTQUFTTywyQkFBVCxDQUNFQyxNQURGLEVBRUVWLHNCQUZGLEVBR0VXLFNBSEYsRUFJRTtBQUNBLFNBQU8sVUFBQVksQ0FBQyxFQUFJO0FBQ1ZwRCxJQUFBQSxPQUFPLENBQUNDLEdBQVI7QUFDQSxXQUFPc0MsTUFBTSxHQUNUVixzQkFBc0IsQ0FBQ1UsTUFBRCxFQUFTYSxDQUFDLENBQUM3RCxVQUFGLENBQWFpRCxTQUFTLENBQUNhLElBQXZCLENBQVQsRUFBdUNiLFNBQXZDLENBRGIsR0FFVCxDQUZKO0FBR0QsR0FMRDtBQU1EIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtDb21wb3NpdGVMYXllciwgTGF5ZXJFeHRlbnNpb259IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtUaWxlTGF5ZXIgYXMgRGVja0dMVGlsZUxheWVyfSBmcm9tICdAZGVjay5nbC9nZW8tbGF5ZXJzJztcbmltcG9ydCB7R2VvSnNvbkxheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IFByb3RvYnVmIGZyb20gJ3BiZic7XG5pbXBvcnQge1ZlY3RvclRpbGV9IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuXG4vLyBpbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcblxuLy8gZnVuY3Rpb24gY2FsY3VsYXRlVGFyZ2V0UG9wdWxhdGlvbihyYW5nZSwgZ2VuZGVyKSB7fVxuXG4vLyBjb25zdCByYW5nZSA9IFsncG9wX2ZfNTBfNTQnLCAncG9wX2ZfNTVfNTknLCAncG9wX2ZfNjVfNjknXTtcbi8vIGluRGVib3VuY2UgPSAwO1xuXG4vLyBjbGVhclRpbWVvdXQoaW5EZWJvdW5jZSk7XG4vLyBpbkRlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG5cbi8vICAgY2xlYXJUaW1lb3V0KGluRGVib3VuY2UpO1xuLy8gICBpbkRlYm91bmNlID0gMDtcbi8vIH0sIDMwMCk7XG5cbi8vIGZ1bmN0aW9uIGRlYm91bmNlKGlubmVyLCBtcyA9IDApIHtcbi8vICAgbGV0IHRpbWVyID0gbnVsbDtcbi8vICAgbGV0IHJlc29sdmVzID0gW107XG5cbi8vICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbi8vICAgICAvLyBSdW4gdGhlIGZ1bmN0aW9uIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZVxuLy8gICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4vLyAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbi8vICAgICAgIC8vIEdldCB0aGUgcmVzdWx0IG9mIHRoZSBpbm5lciBmdW5jdGlvbiwgdGhlbiBhcHBseSBpdCB0byB0aGUgcmVzb2x2ZSBmdW5jdGlvbiBvZlxuLy8gICAgICAgLy8gZWFjaCBwcm9taXNlIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBpbm5lciBmdW5jdGlvbiB3YXMgcnVuXG4vLyAgICAgICBsZXQgcmVzdWx0ID0gaW5uZXIoLi4uYXJncyk7XG4vLyAgICAgICByZXNvbHZlcy5mb3JFYWNoKHIgPT4gcihyZXN1bHQpKTtcbi8vICAgICAgIHJlc29sdmVzID0gW107XG4vLyAgICAgfSwgbXMpO1xuXG4vLyAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHIgPT4gcmVzb2x2ZXMucHVzaChyKSk7XG4vLyAgIH07XG4vLyB9XG5cbmZ1bmN0aW9uIGdldFRpbGVEYXRhKGhvc3QsIHZpZXdwb3J0TG9hZGluZywgcmFuZ2UsIHt4LCB5LCB6fSkge1xuICB2YXIgbWFwU291cmNlID1cbiAgICAvLyBgaHR0cHM6Ly90ZXN0LXZpei1nZW9pcS5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vaW5kX3BvcC9gICtcbiAgICAvLyBgJHt6fS8ke3h9LyR7eX1gICtcbiAgICAvLyBgLnBiZmA7XG4gICAgLy8gaWYgKHZpZXdwb3J0TG9hZGluZyA9PT0gdHJ1ZSkge1xuICAgIC8vICAgbWFwU291cmNlID0gJyc7XG4gICAgLy8gfVxuXG4gICAgYGh0dHA6Ly8xMy4yMzIuMTA3LjI0ODo1MDEwL3RpbGVzL2AgKyBgJHt6fS8ke3h9LyR7eX1gICsgYC5tdnRgO1xuICByZXR1cm4gZmV0Y2gobWFwU291cmNlKVxuICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpXG4gICAgLnRoZW4oYnVmZmVyID0+IHtcbiAgICAgIGNvbnN0IHRpbGUgPSBuZXcgVmVjdG9yVGlsZShuZXcgUHJvdG9idWYoYnVmZmVyKSk7XG4gICAgICBjb25zdCBmZWF0dXJlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBsYXllck5hbWUgaW4gdGlsZS5sYXllcnMpIHtcbiAgICAgICAgY29uc3QgdmVjdG9yVGlsZUxheWVyID0gdGlsZS5sYXllcnNbbGF5ZXJOYW1lXTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB2ZWN0b3JUaWxlTGF5ZXIubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICBjb25zdCB2ZWN0b3JUaWxlRmVhdHVyZSA9IHZlY3RvclRpbGVMYXllci5mZWF0dXJlKGspO1xuICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSB2ZWN0b3JUaWxlRmVhdHVyZS50b0dlb0pTT04oeCwgeSwgeik7XG4gICAgICAgICAgY29uc3QgdG90YWxfdGFyZ2V0X3BvcCA9IHJhbmdlLnJlZHVjZSgoYWNjdSwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjY3UgKyBmZWF0dXJlLnByb3BlcnRpZXNbcHJvcF07XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzID0ge307XG4gICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLnRvdGFsX3RhcmdldF9wb3AgPSB0b3RhbF90YXJnZXRfcG9wO1xuICAgICAgICAgIGZlYXR1cmVzLnB1c2goZmVhdHVyZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmZWF0dXJlcztcbiAgICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVja0dMTVZUTGF5ZXIgZXh0ZW5kcyBDb21wb3NpdGVMYXllciB7XG4gIGluaXRpYWxpc2VTdGF0ZSgpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgZ2V0RmlsbENvbG9yOiB7ZmlsdGVyVmFsczogWzAsIDYzMF19XG4gICAgfTtcbiAgfVxuXG4gIC8vIGluRGVib3VuY2UgPSAwO1xuXG4gIC8vIGNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMobmV4dFByb3BzKSB7XG4gIC8vICAgY29uc29sZS5sb2coJ3JlYWNoaW5nIGluc2lkZSBjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzJyk7XG4gIC8vICAgaWYgKFxuICAvLyAgICAgIV8uaXNFcXVhbCh0aGlzLnByb3BzLm1hcFN0YXRlLCBuZXh0UHJvcHMubWFwU3RhdGUpICYmXG4gIC8vICAgICBuZXh0UHJvcHMubGF5ZXJzICYmXG4gIC8vICAgICBuZXh0UHJvcHMud2lkZ2V0LmNvbmZpZy5ib3VuZHNcbiAgLy8gICApIHtcbiAgLy8gICAgIHRoaXMuc2V0U3RhdGUoe3ZpZXdwb3J0TG9hZGluZzogdHJ1ZX0pO1xuXG4gIC8vICAgICBjbGVhclRpbWVvdXQodGhpcy5pbkRlYm91bmNlKTtcbiAgLy8gICAgIHRoaXMuaW5EZWJvdW5jZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAvLyAgICAgICB0aGlzLnNldFN0YXRlKHt2aWV3cG9ydExvYWRpbmc6IGZhbHNlfSk7XG4gIC8vICAgICAgIHRoaXMucmVuZGVyTGF5ZXJzKCk7XG4gIC8vICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmluRGVib3VuY2UpO1xuICAvLyAgICAgICB0aGlzLmluRGVib3VuY2UgPSAwO1xuICAvLyAgICAgfSwgMTAwMCk7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgcmVuZGVyTGF5ZXJzKCkge1xuICAgIGNvbnN0IHtkYXRhc2V0fSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge3ZpZXdwb3J0TG9hZGluZ30gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnNvbGUubG9nKCd2aWV3cG9ydExvYWRpbmcgaW5zaWRlIHJlbmRlckxheWVycycsIHZpZXdwb3J0TG9hZGluZyk7XG4gICAgY29uc29sZS5sb2coJ3N0YXRlIGluc2lkZSByZW5kZXJMYXllcnMgaW5zaWRlIHRpbGUgbGF5ZXInLCB0aGlzLnN0YXRlKTtcbiAgICBjb25zb2xlLmxvZygndGhpcyBzaG91bGQgY29udHNhaW4gY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcycsIHRoaXMpO1xuICAgIGNvbnN0IHRpbGVMYXllciA9IG5ldyBEZWNrR0xUaWxlTGF5ZXIoe1xuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBtYXhDYWNoZVNpemU6IG51bGwsXG4gICAgICBvblZpZXdwb3J0TG9hZGVkOiBkYXRhID0+IHtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGZpbmFsRGF0YSA9IGRhdGEuZmxhdCgpO1xuICAgICAgICAgIHRoaXMucHJvcHMubG9hZEVETGlua0RhdGEoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgIGZlYXR1cmVzOiBmaW5hbERhdGEsXG4gICAgICAgICAgICAgIGNyczoge3R5cGU6ICduYW1lJywgcHJvcGVydGllczogJ3VybjpvZ2M6ZGVmOmNyczpPR0M6MS4zOkNSUzg0J31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnByb3BzLnVybFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRUaWxlRGF0YTogYXJncyA9PlxuICAgICAgICBnZXRUaWxlRGF0YShkYXRhc2V0LCB2aWV3cG9ydExvYWRpbmcsIGRhdGFzZXQucG9wdWxhdGlvblJhbmdlLCBhcmdzKVxuICAgICAgLy8gbWluWm9vbTogMTAsXG4gICAgICAvLyByZW5kZXJTdWJMYXllcnM6IHRoaXMucmVuZGVyU3ViTGF5ZXJzLmJpbmQodGhpcyksXG4gICAgICAvLyB1cGRhdGVUcmlnZ2VyczogdGhpcy5wcm9wcy51cGRhdGVUcmlnZ2Vyc1xuICAgIH0pO1xuICAgIHZhciBnZW9Kc29uRGF0YSA9IFtdO1xuICAgIGlmICh0aGlzLnByb3BzLmRhdGFzZXQuZGF0YSAmJiB0aGlzLnByb3BzLmRhdGFzZXQuZGF0YS5sZW5ndGgpIHtcbiAgICAgIGdlb0pzb25EYXRhID0gdGhpcy5wcm9wcy5kYXRhc2V0LmRhdGEubWFwKGQgPT4gZFswXSk7XG4gICAgfVxuICAgIGNvbnN0IGxheWVyUHJvcHMgPSB7XG4gICAgICBsaW5lV2lkdGhTY2FsZTogdGhpcy5wcm9wcy5saW5lV2lkdGhTY2FsZVxuICAgIH07XG4gICAgY29uc3QgbmV3R0xheWVyID0gbmV3IEdlb0pzb25MYXllcih7XG4gICAgICAvLyBhbGxEYXRhOiB0aGlzLnN0YXRlLmZlYXR1cmVzLFxuICAgICAgLi4ubGF5ZXJQcm9wcyxcbiAgICAgIGRhdGE6IGdlb0pzb25EYXRhLFxuICAgICAgLy8gcGFyYW1ldGVyczoge2RlcHRoTWFzazogZmFsc2V9LFxuICAgICAgLy8gZXh0cnVkZWQ6IHRydWUsXG4gICAgICBvcGFjaXR5OiB0aGlzLnByb3BzLm9wYWNpdHksXG4gICAgICBmaWxsZWQ6IHRoaXMucHJvcHMuZmlsbGVkLFxuICAgICAgc3Ryb2tlZDogdGhpcy5wcm9wcy5zdHJva2VkLFxuICAgICAgbGluZU1pdGVyTGltaXQ6IDQsXG4gICAgICAvLyBnZXRFbGV2YXRpb246IGZlYXR1cmUgPT4gZmVhdHVyZS5wcm9wZXJ0aWVzLmhlaWdodCB8fCAwLFxuICAgICAgZ2V0RmlsbENvbG9yOiBtYXBQcm9wZXJ0eVRvVmFsdWVDb2xvckZpZWxkKFxuICAgICAgICB0aGlzLnByb3BzLmNTY2FsZSxcbiAgICAgICAgdGhpcy5wcm9wcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlLFxuICAgICAgICB0aGlzLnByb3BzLmNvbG9yRmllbGQsXG4gICAgICAgIHRoaXMucHJvcHMuY29sb3JcbiAgICAgICksXG4gICAgICBnZXRMaW5lQ29sb3I6IG1hcFByb3BlcnR5VG9WYWx1ZUxpbmVDb2xvcihcbiAgICAgICAgdGhpcy5wcm9wcy5zY1NjYWxlLFxuICAgICAgICB0aGlzLnByb3BzLmdldEVuY29kZWRDaGFubmVsVmFsdWUsXG4gICAgICAgIHRoaXMucHJvcHMuc3Ryb2tlQ29sb3JGaWVsZCxcbiAgICAgICAgdGhpcy5wcm9wcy5zdHJva2VDb2xvcixcbiAgICAgICAgdGhpcy5wcm9wcy5jb2xvclxuICAgICAgKSxcbiAgICAgIGdldExpbmVXaWR0aDogbWFwUHJvcGVydHlUb1ZhbHVlTGluZVdpZHRoKFxuICAgICAgICB0aGlzLnByb3BzLnNTY2FsZSxcbiAgICAgICAgdGhpcy5wcm9wcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlLFxuICAgICAgICB0aGlzLnByb3BzLnNpemVGaWVsZFxuICAgICAgKSxcbiAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgIGdldEZpbGxDb2xvcjogbWFwUHJvcGVydHlUb1ZhbHVlQ29sb3JGaWVsZChcbiAgICAgICAgICB0aGlzLnByb3BzLmNTY2FsZSxcbiAgICAgICAgICB0aGlzLnByb3BzLmdldEVuY29kZWRDaGFubmVsVmFsdWUsXG4gICAgICAgICAgdGhpcy5wcm9wcy5jb2xvckZpZWxkLFxuICAgICAgICAgIHRoaXMucHJvcHMuY29sb3JcbiAgICAgICAgKSxcbiAgICAgICAgZ2V0TGluZUNvbG9yOiBtYXBQcm9wZXJ0eVRvVmFsdWVMaW5lQ29sb3IoXG4gICAgICAgICAgdGhpcy5wcm9wcy5zY1NjYWxlLFxuICAgICAgICAgIHRoaXMucHJvcHMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSxcbiAgICAgICAgICB0aGlzLnByb3BzLnN0cm9rZUNvbG9yRmllbGQsXG4gICAgICAgICAgdGhpcy5wcm9wcy5zdHJva2VDb2xvcixcbiAgICAgICAgICB0aGlzLnByb3BzLmNvbG9yXG4gICAgICAgICksXG4gICAgICAgIGdldExpbmVXaWR0aDogbWFwUHJvcGVydHlUb1ZhbHVlTGluZVdpZHRoKFxuICAgICAgICAgIHRoaXMucHJvcHMuc1NjYWxlLFxuICAgICAgICAgIHRoaXMucHJvcHMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSxcbiAgICAgICAgICB0aGlzLnByb3BzLnNpemVGaWVsZFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgLy8gbGlnaHRTZXR0aW5nOiB7XG4gICAgICAvLyAgIGFtYmllbnRSYXRpbzogMC4yXG4gICAgICAvLyB9LFxuICAgICAgZ2V0UG9zaXRpb246IGQgPT4gZC5wb3NpdGlvbixcbiAgICAgIHBpY2thYmxlOiB0cnVlLFxuICAgICAgYXV0b0hpZ2hsaWdodDogdHJ1ZSxcbiAgICAgIHJvdW5kZWQ6IHRydWUsXG4gICAgICBvbkhvdmVyOiBpbmZvID0+IGNvbnNvbGUubG9nKCdnZW9qc29uIGxheWVyIGhvdmVyZWQnLCBpbmZvLm9iamVjdCksXG4gICAgICBvbkNsaWNrOiBpbmZvID0+IGNvbnNvbGUubG9nKCdnZW9qc29uIGxheWVyIGNsaWNrZWQnLCBpbmZvLm9iamVjdClcbiAgICB9KTtcbiAgICByZXR1cm4gW3RpbGVMYXllciwgbmV3R0xheWVyXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBQcm9wZXJ0eVRvVmFsdWVDb2xvckZpZWxkKFxuICBjU2NhbGUsXG4gIGdldEVuY29kZWRDaGFubmVsVmFsdWUsXG4gIGNvbG9yRmllbGQsXG4gIGNvbG9yXG4pIHtcbiAgcmV0dXJuIGYgPT4ge1xuICAgIHJldHVybiBjb2xvckZpZWxkXG4gICAgICA/IGdldEVuY29kZWRDaGFubmVsVmFsdWUoXG4gICAgICAgICAgY1NjYWxlLFxuICAgICAgICAgIGYucHJvcGVydGllc1tjb2xvckZpZWxkLm5hbWVdLFxuICAgICAgICAgIGNvbG9yRmllbGRcbiAgICAgICAgKVxuICAgICAgOiBjb2xvcjtcbiAgICAvLyB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1hcFByb3BlcnR5VG9WYWx1ZUxpbmVDb2xvcihcbiAgc2NTY2FsZSxcbiAgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSxcbiAgc3Ryb2tlQ29sb3JGaWVsZCxcbiAgc3Ryb2tlQ29sb3IsXG4gIGNvbG9yXG4pIHtcbiAgcmV0dXJuIGYgPT4ge1xuICAgIHJldHVybiBzY1NjYWxlXG4gICAgICA/IGdldEVuY29kZWRDaGFubmVsVmFsdWUoXG4gICAgICAgICAgc2NTY2FsZSxcbiAgICAgICAgICBmLnByb3BlcnRpZXNbc3Ryb2tlQ29sb3JGaWVsZC5uYW1lXSxcbiAgICAgICAgICBzdHJva2VDb2xvckZpZWxkXG4gICAgICAgIClcbiAgICAgIDogZi5wcm9wZXJ0aWVzLmxpbmVDb2xvciB8fCBzdHJva2VDb2xvciB8fCBjb2xvcjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWFwUHJvcGVydHlUb1ZhbHVlTGluZVdpZHRoKFxuICBzU2NhbGUsXG4gIGdldEVuY29kZWRDaGFubmVsVmFsdWUsXG4gIHNpemVGaWVsZFxuKSB7XG4gIHJldHVybiBmID0+IHtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIHJldHVybiBzU2NhbGVcbiAgICAgID8gZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShzU2NhbGUsIGYucHJvcGVydGllc1tzaXplRmllbGQubmFtZV0sIHNpemVGaWVsZClcbiAgICAgIDogMTtcbiAgfTtcbn1cbiJdfQ==