kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
227 lines (223 loc) • 28.3 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createNewDataEntry = createNewDataEntry;
exports.getNewDatasetColor = getNewDatasetColor;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _lodash = _interopRequireDefault(require("lodash.uniq"));
var _keplerTable = _interopRequireDefault(require("./kepler-table"));
var _tasks = _interopRequireDefault(require("react-palm/tasks"));
var _constants = require("@kepler.gl/constants");
var _utils = require("@kepler.gl/utils");
var _pmtiles = require("@loaders.gl/pmtiles");
var _tilesetUtils = require("./tileset/tileset-utils");
var _vectorTileUtils = require("./tileset/vector-tile-utils");
var _excluded = ["info", "data"]; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
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; }
// apply a color for each dataset
// to use as label colors
var datasetColors = ['#8F2FBF', '#005CFF', '#C06C84', '#F8B195', '#547A82', '#3EACA8', '#A2D4AB'].map(_utils.hexToRgb);
function getNewDatasetColor(datasets) {
var presetColors = datasetColors.map(String);
var usedColors = (0, _lodash["default"])(Object.values(datasets).map(function (d) {
return String(d.color);
})).filter(function (c) {
return presetColors.includes(c);
});
if (usedColors.length === presetColors.length) {
// if we already depleted the pool of color
return _utils.datasetColorMaker.next().value;
}
var color = _utils.datasetColorMaker.next().value;
while (usedColors.includes(String(color))) {
color = _utils.datasetColorMaker.next().value;
}
return color;
}
/**
* Take datasets payload from addDataToMap, create datasets entry save to visState
*/
function createNewDataEntry(_ref) {
var _getApplicationConfig;
var info = _ref.info,
data = _ref.data,
opts = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var TableClass = (_getApplicationConfig = (0, _utils.getApplicationConfig)().table) !== null && _getApplicationConfig !== void 0 ? _getApplicationConfig : _keplerTable["default"];
var dataValidator = _utils.validateInputData;
if (typeof TableClass.getInputDataValidator === 'function') {
dataValidator = TableClass.getInputDataValidator();
}
var validatedData = dataValidator(data);
if (!validatedData) {
return null;
}
// check if dataset already exists, and update it when loading data by batches incrementally
if (info && info.id && datasets[info.id]) {
// get keplerTable from datasets
var keplerTable = datasets[info.id];
// update the data in keplerTable
return UPDATE_TABLE_TASK({
table: keplerTable,
data: validatedData
});
}
info = info || {};
var color = info.color || getNewDatasetColor(datasets);
return CREATE_TABLE_TASK({
info: info,
color: color,
opts: opts,
data: validatedData
});
}
function updateTable(_x) {
return _updateTable.apply(this, arguments);
}
function _updateTable() {
_updateTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref2) {
var table, data, updated;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
table = _ref2.table, data = _ref2.data;
_context.next = 3;
return table.update(data);
case 3:
updated = _context.sent;
return _context.abrupt("return", updated);
case 5:
case "end":
return _context.stop();
}
}, _callee);
}));
return _updateTable.apply(this, arguments);
}
function createTable(_x2) {
return _createTable.apply(this, arguments);
}
function _createTable() {
_createTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(datasetInfo) {
var _getApplicationConfig2;
var info, color, opts, data, refreshedMetadata, metadata, _metadata, TableClass, table;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
info = datasetInfo.info, color = datasetInfo.color, opts = datasetInfo.opts, data = datasetInfo.data; // update metadata for remote tiled datasets
_context2.next = 3;
return refreshRemoteData(datasetInfo);
case 3:
refreshedMetadata = _context2.sent;
metadata = opts.metadata;
if (refreshedMetadata) {
metadata = _objectSpread(_objectSpread({}, opts.metadata), refreshedMetadata);
data.fields = (_metadata = metadata) === null || _metadata === void 0 ? void 0 : _metadata.fields;
}
TableClass = (_getApplicationConfig2 = (0, _utils.getApplicationConfig)().table) !== null && _getApplicationConfig2 !== void 0 ? _getApplicationConfig2 : _keplerTable["default"];
table = new TableClass(_objectSpread(_objectSpread({
info: info,
color: color
}, opts), {}, {
metadata: metadata
}));
_context2.next = 10;
return table.importData({
data: data
});
case 10:
return _context2.abrupt("return", table);
case 11:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return _createTable.apply(this, arguments);
}
var UPDATE_TABLE_TASK = _tasks["default"].fromPromise(updateTable, 'UPDATE_TABLE_TASK');
var CREATE_TABLE_TASK = _tasks["default"].fromPromise(createTable, 'CREATE_TABLE_TASK');
/**
* Fetch metadata for vector tile layers using tilesetMetadataUrl from metadata
* @param datasetInfo
* @returns
*/
function refreshRemoteData(_x3) {
return _refreshRemoteData.apply(this, arguments);
}
function _refreshRemoteData() {
_refreshRemoteData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(datasetInfo) {
var _ref3, remoteTileFormat, tilesetMetadataUrl, tilesetDataUrl, rawMetadata, tileSource, metadata;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
if (!(datasetInfo.info.type !== _constants.DatasetType.VECTOR_TILE)) {
_context3.next = 2;
break;
}
return _context3.abrupt("return", null);
case 2:
_ref3 = datasetInfo.opts.metadata || {}, remoteTileFormat = _ref3.remoteTileFormat, tilesetMetadataUrl = _ref3.tilesetMetadataUrl, tilesetDataUrl = _ref3.tilesetDataUrl;
if (!(!(remoteTileFormat === _constants.RemoteTileFormat.PMTILES || remoteTileFormat === _constants.RemoteTileFormat.MVT) || typeof tilesetMetadataUrl !== 'string' || typeof tilesetDataUrl !== 'string')) {
_context3.next = 5;
break;
}
return _context3.abrupt("return", null);
case 5:
_context3.prev = 5;
rawMetadata = null;
if (!(remoteTileFormat === _constants.RemoteTileFormat.MVT)) {
_context3.next = 13;
break;
}
_context3.next = 10;
return (0, _tilesetUtils.getMVTMetadata)(tilesetMetadataUrl);
case 10:
rawMetadata = _context3.sent;
_context3.next = 17;
break;
case 13:
tileSource = _pmtiles.PMTilesSource.createDataSource(tilesetMetadataUrl, {});
_context3.next = 16;
return tileSource.metadata;
case 16:
rawMetadata = _context3.sent;
case 17:
if (!rawMetadata) {
_context3.next = 22;
break;
}
metadata = (0, _vectorTileUtils.parseVectorMetadata)(rawMetadata);
_context3.next = 21;
return (0, _vectorTileUtils.getFieldsFromTile)({
remoteTileFormat: remoteTileFormat,
tilesetUrl: tilesetDataUrl,
metadataUrl: tilesetMetadataUrl,
metadata: metadata
});
case 21:
return _context3.abrupt("return", metadata);
case 22:
_context3.next = 26;
break;
case 24:
_context3.prev = 24;
_context3.t0 = _context3["catch"](5);
case 26:
return _context3.abrupt("return", null);
case 27:
case "end":
return _context3.stop();
}
}, _callee3, null, [[5, 24]]);
}));
return _refreshRemoteData.apply(this, arguments);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfa2VwbGVyVGFibGUiLCJfdGFza3MiLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX3BtdGlsZXMiLCJfdGlsZXNldFV0aWxzIiwiX3ZlY3RvclRpbGVVdGlscyIsIl9leGNsdWRlZCIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiZGF0YXNldENvbG9ycyIsIm1hcCIsImhleFRvUmdiIiwiZ2V0TmV3RGF0YXNldENvbG9yIiwiZGF0YXNldHMiLCJwcmVzZXRDb2xvcnMiLCJTdHJpbmciLCJ1c2VkQ29sb3JzIiwidW5pcSIsInZhbHVlcyIsImQiLCJjb2xvciIsImMiLCJpbmNsdWRlcyIsImRhdGFzZXRDb2xvck1ha2VyIiwibmV4dCIsInZhbHVlIiwiY3JlYXRlTmV3RGF0YUVudHJ5IiwiX3JlZiIsIl9nZXRBcHBsaWNhdGlvbkNvbmZpZyIsImluZm8iLCJkYXRhIiwib3B0cyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJ1bmRlZmluZWQiLCJUYWJsZUNsYXNzIiwiZ2V0QXBwbGljYXRpb25Db25maWciLCJ0YWJsZSIsIktlcGxlclRhYmxlIiwiZGF0YVZhbGlkYXRvciIsInZhbGlkYXRlSW5wdXREYXRhIiwiZ2V0SW5wdXREYXRhVmFsaWRhdG9yIiwidmFsaWRhdGVkRGF0YSIsImlkIiwia2VwbGVyVGFibGUiLCJVUERBVEVfVEFCTEVfVEFTSyIsIkNSRUFURV9UQUJMRV9UQVNLIiwidXBkYXRlVGFibGUiLCJfeCIsIl91cGRhdGVUYWJsZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZjIiLCJ1cGRhdGVkIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwidXBkYXRlIiwic2VudCIsImFicnVwdCIsInN0b3AiLCJjcmVhdGVUYWJsZSIsIl94MiIsIl9jcmVhdGVUYWJsZSIsIl9jYWxsZWUyIiwiZGF0YXNldEluZm8iLCJfZ2V0QXBwbGljYXRpb25Db25maWcyIiwicmVmcmVzaGVkTWV0YWRhdGEiLCJtZXRhZGF0YSIsIl9tZXRhZGF0YSIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInJlZnJlc2hSZW1vdGVEYXRhIiwiZmllbGRzIiwiaW1wb3J0RGF0YSIsIlRhc2siLCJmcm9tUHJvbWlzZSIsIl94MyIsIl9yZWZyZXNoUmVtb3RlRGF0YSIsIl9jYWxsZWUzIiwiX3JlZjMiLCJyZW1vdGVUaWxlRm9ybWF0IiwidGlsZXNldE1ldGFkYXRhVXJsIiwidGlsZXNldERhdGFVcmwiLCJyYXdNZXRhZGF0YSIsInRpbGVTb3VyY2UiLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJ0eXBlIiwiRGF0YXNldFR5cGUiLCJWRUNUT1JfVElMRSIsIlJlbW90ZVRpbGVGb3JtYXQiLCJQTVRJTEVTIiwiTVZUIiwiZ2V0TVZUTWV0YWRhdGEiLCJQTVRpbGVzU291cmNlIiwiY3JlYXRlRGF0YVNvdXJjZSIsInBhcnNlVmVjdG9yTWV0YWRhdGEiLCJnZXRGaWVsZHNGcm9tVGlsZSIsInRpbGVzZXRVcmwiLCJtZXRhZGF0YVVybCIsInQwIl0sInNvdXJjZXMiOlsiLi4vc3JjL2RhdGFzZXQtdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuaW1wb3J0IEtlcGxlclRhYmxlLCB7RGF0YXNldHN9IGZyb20gJy4va2VwbGVyLXRhYmxlJztcbmltcG9ydCB7UHJvdG9EYXRhc2V0LCBSR0JDb2xvcn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQgVGFzayBmcm9tICdyZWFjdC1wYWxtL3Rhc2tzJztcblxuaW1wb3J0IHtEYXRhc2V0VHlwZSwgUmVtb3RlVGlsZUZvcm1hdCwgVmVjdG9yVGlsZURhdGFzZXRNZXRhZGF0YX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgaGV4VG9SZ2IsXG4gIHZhbGlkYXRlSW5wdXREYXRhLFxuICBkYXRhc2V0Q29sb3JNYWtlcixcbiAgZ2V0QXBwbGljYXRpb25Db25maWdcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge1BNVGlsZXNTb3VyY2UsIFBNVGlsZXNNZXRhZGF0YX0gZnJvbSAnQGxvYWRlcnMuZ2wvcG10aWxlcyc7XG5pbXBvcnQgey8qIE1WVFNvdXJjZSwqLyBUaWxlSlNPTn0gZnJvbSAnQGxvYWRlcnMuZ2wvbXZ0JztcblxuaW1wb3J0IHtnZXRNVlRNZXRhZGF0YX0gZnJvbSAnLi90aWxlc2V0L3RpbGVzZXQtdXRpbHMnO1xuaW1wb3J0IHtwYXJzZVZlY3Rvck1ldGFkYXRhLCBnZXRGaWVsZHNGcm9tVGlsZX0gZnJvbSAnLi90aWxlc2V0L3ZlY3Rvci10aWxlLXV0aWxzJztcblxuLy8gYXBwbHkgYSBjb2xvciBmb3IgZWFjaCBkYXRhc2V0XG4vLyB0byB1c2UgYXMgbGFiZWwgY29sb3JzXG5jb25zdCBkYXRhc2V0Q29sb3JzID0gW1xuICAnIzhGMkZCRicsXG4gICcjMDA1Q0ZGJyxcbiAgJyNDMDZDODQnLFxuICAnI0Y4QjE5NScsXG4gICcjNTQ3QTgyJyxcbiAgJyMzRUFDQTgnLFxuICAnI0EyRDRBQidcbl0ubWFwKGhleFRvUmdiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld0RhdGFzZXRDb2xvcihkYXRhc2V0czogRGF0YXNldHMpOiBSR0JDb2xvciB7XG4gIGNvbnN0IHByZXNldENvbG9ycyA9IGRhdGFzZXRDb2xvcnMubWFwKFN0cmluZyk7XG4gIGNvbnN0IHVzZWRDb2xvcnMgPSB1bmlxKE9iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcChkID0+IFN0cmluZyhkLmNvbG9yKSkpLmZpbHRlcihjID0+XG4gICAgcHJlc2V0Q29sb3JzLmluY2x1ZGVzKGMpXG4gICk7XG5cbiAgaWYgKHVzZWRDb2xvcnMubGVuZ3RoID09PSBwcmVzZXRDb2xvcnMubGVuZ3RoKSB7XG4gICAgLy8gaWYgd2UgYWxyZWFkeSBkZXBsZXRlZCB0aGUgcG9vbCBvZiBjb2xvclxuICAgIHJldHVybiBkYXRhc2V0Q29sb3JNYWtlci5uZXh0KCkudmFsdWU7XG4gIH1cblxuICBsZXQgY29sb3IgPSBkYXRhc2V0Q29sb3JNYWtlci5uZXh0KCkudmFsdWU7XG4gIHdoaWxlICh1c2VkQ29sb3JzLmluY2x1ZGVzKFN0cmluZyhjb2xvcikpKSB7XG4gICAgY29sb3IgPSBkYXRhc2V0Q29sb3JNYWtlci5uZXh0KCkudmFsdWU7XG4gIH1cblxuICByZXR1cm4gY29sb3I7XG59XG5cbi8qKlxuICogVGFrZSBkYXRhc2V0cyBwYXlsb2FkIGZyb20gYWRkRGF0YVRvTWFwLCBjcmVhdGUgZGF0YXNldHMgZW50cnkgc2F2ZSB0byB2aXNTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmV3RGF0YUVudHJ5KFxuICB7aW5mbywgZGF0YSwgLi4ub3B0c306IFByb3RvRGF0YXNldCxcbiAgZGF0YXNldHM6IERhdGFzZXRzID0ge31cbik6IERhdGFzZXRzIHwgbnVsbCB7XG4gIGNvbnN0IFRhYmxlQ2xhc3MgPSBnZXRBcHBsaWNhdGlvbkNvbmZpZygpLnRhYmxlID8/IEtlcGxlclRhYmxlO1xuICBsZXQgZGF0YVZhbGlkYXRvciA9IHZhbGlkYXRlSW5wdXREYXRhO1xuICBpZiAodHlwZW9mIFRhYmxlQ2xhc3MuZ2V0SW5wdXREYXRhVmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGF0YVZhbGlkYXRvciA9IFRhYmxlQ2xhc3MuZ2V0SW5wdXREYXRhVmFsaWRhdG9yKCk7XG4gIH1cblxuICBjb25zdCB2YWxpZGF0ZWREYXRhID0gZGF0YVZhbGlkYXRvcihkYXRhKTtcbiAgaWYgKCF2YWxpZGF0ZWREYXRhKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBjaGVjayBpZiBkYXRhc2V0IGFscmVhZHkgZXhpc3RzLCBhbmQgdXBkYXRlIGl0IHdoZW4gbG9hZGluZyBkYXRhIGJ5IGJhdGNoZXMgaW5jcmVtZW50YWxseVxuICBpZiAoaW5mbyAmJiBpbmZvLmlkICYmIGRhdGFzZXRzW2luZm8uaWRdKSB7XG4gICAgLy8gZ2V0IGtlcGxlclRhYmxlIGZyb20gZGF0YXNldHNcbiAgICBjb25zdCBrZXBsZXJUYWJsZSA9IGRhdGFzZXRzW2luZm8uaWRdO1xuICAgIC8vIHVwZGF0ZSB0aGUgZGF0YSBpbiBrZXBsZXJUYWJsZVxuICAgIHJldHVybiBVUERBVEVfVEFCTEVfVEFTSyh7dGFibGU6IGtlcGxlclRhYmxlLCBkYXRhOiB2YWxpZGF0ZWREYXRhfSk7XG4gIH1cblxuICBpbmZvID0gaW5mbyB8fCB7fTtcbiAgY29uc3QgY29sb3IgPSBpbmZvLmNvbG9yIHx8IGdldE5ld0RhdGFzZXRDb2xvcihkYXRhc2V0cyk7XG5cbiAgcmV0dXJuIENSRUFURV9UQUJMRV9UQVNLKHtcbiAgICBpbmZvLFxuICAgIGNvbG9yLFxuICAgIG9wdHMsXG4gICAgZGF0YTogdmFsaWRhdGVkRGF0YVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlVGFibGUoe3RhYmxlLCBkYXRhfSkge1xuICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGFibGUudXBkYXRlKGRhdGEpOyAvLyBBc3N1bWluZyBgdGFibGVgIGhhcyBhbiBgdXBkYXRlYCBtZXRob2RcbiAgcmV0dXJuIHVwZGF0ZWQ7XG59XG5cbnR5cGUgQ3JlYXRlVGFibGVQcm9wcyA9IHtcbiAgaW5mbzogYW55O1xuICBjb2xvcjogUkdCQ29sb3I7XG4gIG9wdHM6IHtcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9O1xuICBkYXRhOiBhbnk7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUYWJsZShkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wcykge1xuICBjb25zdCB7aW5mbywgY29sb3IsIG9wdHMsIGRhdGF9ID0gZGF0YXNldEluZm87XG5cbiAgLy8gdXBkYXRlIG1ldGFkYXRhIGZvciByZW1vdGUgdGlsZWQgZGF0YXNldHNcbiAgY29uc3QgcmVmcmVzaGVkTWV0YWRhdGEgPSBhd2FpdCByZWZyZXNoUmVtb3RlRGF0YShkYXRhc2V0SW5mbyk7XG4gIGxldCBtZXRhZGF0YSA9IG9wdHMubWV0YWRhdGE7XG4gIGlmIChyZWZyZXNoZWRNZXRhZGF0YSkge1xuICAgIG1ldGFkYXRhID0gey4uLm9wdHMubWV0YWRhdGEsIC4uLnJlZnJlc2hlZE1ldGFkYXRhfTtcbiAgICBkYXRhLmZpZWxkcyA9IG1ldGFkYXRhPy5maWVsZHM7XG4gIH1cblxuICBjb25zdCBUYWJsZUNsYXNzID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS50YWJsZSA/PyBLZXBsZXJUYWJsZTtcbiAgY29uc3QgdGFibGUgPSBuZXcgVGFibGVDbGFzcyh7XG4gICAgaW5mbyxcbiAgICBjb2xvcixcbiAgICAuLi5vcHRzLFxuICAgIG1ldGFkYXRhXG4gIH0pO1xuICBhd2FpdCB0YWJsZS5pbXBvcnREYXRhKHtkYXRhfSk7XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuY29uc3QgVVBEQVRFX1RBQkxFX1RBU0sgPSBUYXNrLmZyb21Qcm9taXNlKHVwZGF0ZVRhYmxlLCAnVVBEQVRFX1RBQkxFX1RBU0snKTtcbmNvbnN0IENSRUFURV9UQUJMRV9UQVNLID0gVGFzay5mcm9tUHJvbWlzZShjcmVhdGVUYWJsZSwgJ0NSRUFURV9UQUJMRV9UQVNLJyk7XG5cbi8qKlxuICogRmV0Y2ggbWV0YWRhdGEgZm9yIHZlY3RvciB0aWxlIGxheWVycyB1c2luZyB0aWxlc2V0TWV0YWRhdGFVcmwgZnJvbSBtZXRhZGF0YVxuICogQHBhcmFtIGRhdGFzZXRJbmZvXG4gKiBAcmV0dXJuc1xuICovXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoUmVtb3RlRGF0YShkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wcykge1xuICAvLyBzbyBmYXIgb25seSB2ZWN0b3IgdGlsZSBsYXllcnMgc2hvdWxkIHJlZnJlc2ggbWV0YWRhdGFcbiAgaWYgKGRhdGFzZXRJbmZvLmluZm8udHlwZSAhPT0gRGF0YXNldFR5cGUuVkVDVE9SX1RJTEUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHtyZW1vdGVUaWxlRm9ybWF0LCB0aWxlc2V0TWV0YWRhdGFVcmwsIHRpbGVzZXREYXRhVXJsfSA9XG4gICAgKGRhdGFzZXRJbmZvLm9wdHMubWV0YWRhdGEgYXMgVmVjdG9yVGlsZURhdGFzZXRNZXRhZGF0YSkgfHwge307XG5cbiAgaWYgKFxuICAgICEocmVtb3RlVGlsZUZvcm1hdCA9PT0gUmVtb3RlVGlsZUZvcm1hdC5QTVRJTEVTIHx8IHJlbW90ZVRpbGVGb3JtYXQgPT09IFJlbW90ZVRpbGVGb3JtYXQuTVZUKSB8fFxuICAgIHR5cGVvZiB0aWxlc2V0TWV0YWRhdGFVcmwgIT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHRpbGVzZXREYXRhVXJsICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbGV0IHJhd01ldGFkYXRhOiBQTVRpbGVzTWV0YWRhdGEgfCBUaWxlSlNPTiB8IG51bGwgPSBudWxsO1xuICAgIGlmIChyZW1vdGVUaWxlRm9ybWF0ID09PSBSZW1vdGVUaWxlRm9ybWF0Lk1WVCkge1xuICAgICAgcmF3TWV0YWRhdGEgPSBhd2FpdCBnZXRNVlRNZXRhZGF0YSh0aWxlc2V0TWV0YWRhdGFVcmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0aWxlU291cmNlID0gUE1UaWxlc1NvdXJjZS5jcmVhdGVEYXRhU291cmNlKHRpbGVzZXRNZXRhZGF0YVVybCwge30pO1xuICAgICAgcmF3TWV0YWRhdGEgPSBhd2FpdCB0aWxlU291cmNlLm1ldGFkYXRhO1xuICAgIH1cblxuICAgIGlmIChyYXdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZVZlY3Rvck1ldGFkYXRhKHJhd01ldGFkYXRhKTtcblxuICAgICAgYXdhaXQgZ2V0RmllbGRzRnJvbVRpbGUoe1xuICAgICAgICByZW1vdGVUaWxlRm9ybWF0LFxuICAgICAgICB0aWxlc2V0VXJsOiB0aWxlc2V0RGF0YVVybCxcbiAgICAgICAgbWV0YWRhdGFVcmw6IHRpbGVzZXRNZXRhZGF0YVVybCxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZ25vcmUgZm9yIG5vdywgYW5kIHVzZSBvbGQgbWV0YWRhdGE/XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUUsTUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUcsVUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBTUEsSUFBQUssUUFBQSxHQUFBTCxPQUFBO0FBR0EsSUFBQU0sYUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sZ0JBQUEsR0FBQVAsT0FBQTtBQUFtRixJQUFBUSxTQUFBLHFCQW5CbkY7QUFDQTtBQUFBLFNBQUFDLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFB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
;