UNPKG

kepler.gl

Version:

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

332 lines (328 loc) 38.3 kB
"use strict"; 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 _uniq = _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 _rasterTileUtils = require("./tileset/raster-tile-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, _uniq["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, 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); if (metadata.fields) { data.fields = 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 type; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: type = datasetInfo.info.type; _context3.t0 = type; _context3.next = _context3.t0 === _constants.DatasetType.VECTOR_TILE ? 4 : _context3.t0 === _constants.DatasetType.RASTER_TILE ? 7 : 10; break; case 4: _context3.next = 6; return refreshVectorTileMetadata(datasetInfo); case 6: return _context3.abrupt("return", _context3.sent); case 7: _context3.next = 9; return refreshRasterTileMetadata(datasetInfo); case 9: return _context3.abrupt("return", _context3.sent); case 10: return _context3.abrupt("return", null); case 11: case "end": return _context3.stop(); } }, _callee3); })); return _refreshRemoteData.apply(this, arguments); } function refreshVectorTileMetadata(_x4) { return _refreshVectorTileMetadata.apply(this, arguments); } function _refreshVectorTileMetadata() { _refreshVectorTileMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(datasetInfo) { var _ref3, remoteTileFormat, tilesetMetadataUrl, tilesetDataUrl, rawMetadata, tileSource, metadata; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _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')) { _context4.next = 3; break; } return _context4.abrupt("return", null); case 3: _context4.prev = 3; rawMetadata = null; if (!(remoteTileFormat === _constants.RemoteTileFormat.MVT)) { _context4.next = 11; break; } _context4.next = 8; return (0, _tilesetUtils.getMVTMetadata)(tilesetMetadataUrl); case 8: rawMetadata = _context4.sent; _context4.next = 15; break; case 11: tileSource = _pmtiles.PMTilesSource.createDataSource(tilesetMetadataUrl, {}); _context4.next = 14; return tileSource.metadata; case 14: rawMetadata = _context4.sent; case 15: if (!rawMetadata) { _context4.next = 20; break; } metadata = (0, _vectorTileUtils.parseVectorMetadata)(rawMetadata); _context4.next = 19; return (0, _vectorTileUtils.getFieldsFromTile)({ remoteTileFormat: remoteTileFormat, tilesetUrl: tilesetDataUrl, metadataUrl: tilesetMetadataUrl, metadata: metadata }); case 19: return _context4.abrupt("return", metadata); case 20: _context4.next = 24; break; case 22: _context4.prev = 22; _context4.t0 = _context4["catch"](3); case 24: return _context4.abrupt("return", null); case 25: case "end": return _context4.stop(); } }, _callee4, null, [[3, 22]]); })); return _refreshVectorTileMetadata.apply(this, arguments); } function refreshRasterTileMetadata(_x5) { return _refreshRasterTileMetadata.apply(this, arguments); } function _refreshRasterTileMetadata() { _refreshRasterTileMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(datasetInfo) { var _ref4, metadataUrl, pmtilesType, tileSource, rawMetadata, response, _rawMetadata, metadata; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: _ref4 = datasetInfo.opts.metadata || {}, metadataUrl = _ref4.metadataUrl, pmtilesType = _ref4.pmtilesType; if (!(typeof metadataUrl !== 'string')) { _context5.next = 3; break; } return _context5.abrupt("return", null); case 3: _context5.prev = 3; if (!(pmtilesType === _constants.PMTilesType.RASTER)) { _context5.next = 13; break; } tileSource = _pmtiles.PMTilesSource.createDataSource(metadataUrl, {}); _context5.next = 8; return tileSource.metadata; case 8: rawMetadata = _context5.sent; if (!rawMetadata) { _context5.next = 11; break; } return _context5.abrupt("return", (0, _vectorTileUtils.parseVectorMetadata)(rawMetadata)); case 11: _context5.next = 25; break; case 13: _context5.next = 15; return fetch(metadataUrl); case 15: response = _context5.sent; if (response.ok) { _context5.next = 18; break; } throw new Error("Failed Fetch ".concat(metadataUrl)); case 18: _context5.next = 20; return response.json(); case 20: _rawMetadata = _context5.sent; metadata = (0, _rasterTileUtils.parseRasterMetadata)(_rawMetadata, { allowCollections: true }); if (!(metadata instanceof Error)) { _context5.next = 24; break; } throw new Error("Failed to parse metadata ".concat(metadata.message)); case 24: return _context5.abrupt("return", metadata); case 25: _context5.next = 29; break; case 27: _context5.prev = 27; _context5.t0 = _context5["catch"](3); case 29: return _context5.abrupt("return", null); case 30: case "end": return _context5.stop(); } }, _callee5, null, [[3, 27]]); })); return _refreshRasterTileMetadata.apply(this, arguments); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2tlcGxlclRhYmxlIiwiX3Rhc2tzIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl9wbXRpbGVzIiwiX3RpbGVzZXRVdGlscyIsIl9yYXN0ZXJUaWxlVXRpbHMiLCJfdmVjdG9yVGlsZVV0aWxzIiwiX2V4Y2x1ZGVkIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkYXRhc2V0Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJnZXROZXdEYXRhc2V0Q29sb3IiLCJkYXRhc2V0cyIsInByZXNldENvbG9ycyIsIlN0cmluZyIsInVzZWRDb2xvcnMiLCJ1bmlxIiwidmFsdWVzIiwiZCIsImNvbG9yIiwiYyIsImluY2x1ZGVzIiwiZGF0YXNldENvbG9yTWFrZXIiLCJuZXh0IiwidmFsdWUiLCJjcmVhdGVOZXdEYXRhRW50cnkiLCJfcmVmIiwiX2dldEFwcGxpY2F0aW9uQ29uZmlnIiwiaW5mbyIsImRhdGEiLCJvcHRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsInVuZGVmaW5lZCIsIlRhYmxlQ2xhc3MiLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsInRhYmxlIiwiS2VwbGVyVGFibGUiLCJkYXRhVmFsaWRhdG9yIiwidmFsaWRhdGVJbnB1dERhdGEiLCJnZXRJbnB1dERhdGFWYWxpZGF0b3IiLCJ2YWxpZGF0ZWREYXRhIiwiaWQiLCJrZXBsZXJUYWJsZSIsIlVQREFURV9UQUJMRV9UQVNLIiwiQ1JFQVRFX1RBQkxFX1RBU0siLCJ1cGRhdGVUYWJsZSIsIl94IiwiX3VwZGF0ZVRhYmxlIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJfcmVmMiIsInVwZGF0ZWQiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJ1cGRhdGUiLCJzZW50IiwiYWJydXB0Iiwic3RvcCIsImNyZWF0ZVRhYmxlIiwiX3gyIiwiX2NyZWF0ZVRhYmxlIiwiX2NhbGxlZTIiLCJkYXRhc2V0SW5mbyIsIl9nZXRBcHBsaWNhdGlvbkNvbmZpZzIiLCJyZWZyZXNoZWRNZXRhZGF0YSIsIm1ldGFkYXRhIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwicmVmcmVzaFJlbW90ZURhdGEiLCJmaWVsZHMiLCJpbXBvcnREYXRhIiwiVGFzayIsImZyb21Qcm9taXNlIiwiX3gzIiwiX3JlZnJlc2hSZW1vdGVEYXRhIiwiX2NhbGxlZTMiLCJ0eXBlIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwidDAiLCJEYXRhc2V0VHlwZSIsIlZFQ1RPUl9USUxFIiwiUkFTVEVSX1RJTEUiLCJyZWZyZXNoVmVjdG9yVGlsZU1ldGFkYXRhIiwicmVmcmVzaFJhc3RlclRpbGVNZXRhZGF0YSIsIl94NCIsIl9yZWZyZXNoVmVjdG9yVGlsZU1ldGFkYXRhIiwiX2NhbGxlZTQiLCJfcmVmMyIsInJlbW90ZVRpbGVGb3JtYXQiLCJ0aWxlc2V0TWV0YWRhdGFVcmwiLCJ0aWxlc2V0RGF0YVVybCIsInJhd01ldGFkYXRhIiwidGlsZVNvdXJjZSIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsIlJlbW90ZVRpbGVGb3JtYXQiLCJQTVRJTEVTIiwiTVZUIiwiZ2V0TVZUTWV0YWRhdGEiLCJQTVRpbGVzU291cmNlIiwiY3JlYXRlRGF0YVNvdXJjZSIsInBhcnNlVmVjdG9yTWV0YWRhdGEiLCJnZXRGaWVsZHNGcm9tVGlsZSIsInRpbGVzZXRVcmwiLCJtZXRhZGF0YVVybCIsIl94NSIsIl9yZWZyZXNoUmFzdGVyVGlsZU1ldGFkYXRhIiwiX2NhbGxlZTUiLCJfcmVmNCIsInBtdGlsZXNUeXBlIiwicmVzcG9uc2UiLCJfcmF3TWV0YWRhdGEiLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJQTVRpbGVzVHlwZSIsIlJBU1RFUiIsImZldGNoIiwib2siLCJFcnJvciIsImNvbmNhdCIsImpzb24iLCJwYXJzZVJhc3Rlck1ldGFkYXRhIiwiYWxsb3dDb2xsZWN0aW9ucyIsIm1lc3NhZ2UiXSwic291cmNlcyI6WyIuLi9zcmMvZGF0YXNldC11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gvdW5pcSc7XG5pbXBvcnQgS2VwbGVyVGFibGUsIHtEYXRhc2V0c30gZnJvbSAnLi9rZXBsZXItdGFibGUnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXQsIFJHQkNvbG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCBUYXNrIGZyb20gJ3JlYWN0LXBhbG0vdGFza3MnO1xuXG5pbXBvcnQge1xuICBEYXRhc2V0VHlwZSxcbiAgUmFzdGVyVGlsZURhdGFzZXRNZXRhZGF0YSxcbiAgUE1UaWxlc1R5cGUsXG4gIFJlbW90ZVRpbGVGb3JtYXQsXG4gIFZlY3RvclRpbGVEYXRhc2V0TWV0YWRhdGFcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgaGV4VG9SZ2IsXG4gIHZhbGlkYXRlSW5wdXREYXRhLFxuICBkYXRhc2V0Q29sb3JNYWtlcixcbiAgZ2V0QXBwbGljYXRpb25Db25maWdcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge1BNVGlsZXNTb3VyY2UsIFBNVGlsZXNNZXRhZGF0YX0gZnJvbSAnQGxvYWRlcnMuZ2wvcG10aWxlcyc7XG5pbXBvcnQgey8qIE1WVFNvdXJjZSwqLyBUaWxlSlNPTn0gZnJvbSAnQGxvYWRlcnMuZ2wvbXZ0JztcblxuaW1wb3J0IHtnZXRNVlRNZXRhZGF0YX0gZnJvbSAnLi90aWxlc2V0L3RpbGVzZXQtdXRpbHMnO1xuaW1wb3J0IHtwYXJzZVJhc3Rlck1ldGFkYXRhfSBmcm9tICcuL3RpbGVzZXQvcmFzdGVyLXRpbGUtdXRpbHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VWZWN0b3JNZXRhZGF0YSxcbiAgZ2V0RmllbGRzRnJvbVRpbGUsXG4gIFZlY3RvclRpbGVNZXRhZGF0YVxufSBmcm9tICcuL3RpbGVzZXQvdmVjdG9yLXRpbGUtdXRpbHMnO1xuXG4vLyBhcHBseSBhIGNvbG9yIGZvciBlYWNoIGRhdGFzZXRcbi8vIHRvIHVzZSBhcyBsYWJlbCBjb2xvcnNcbmNvbnN0IGRhdGFzZXRDb2xvcnMgPSBbXG4gICcjOEYyRkJGJyxcbiAgJyMwMDVDRkYnLFxuICAnI0MwNkM4NCcsXG4gICcjRjhCMTk1JyxcbiAgJyM1NDdBODInLFxuICAnIzNFQUNBOCcsXG4gICcjQTJENEFCJ1xuXS5tYXAoaGV4VG9SZ2IpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV3RGF0YXNldENvbG9yKGRhdGFzZXRzOiBEYXRhc2V0cyk6IFJHQkNvbG9yIHtcbiAgY29uc3QgcHJlc2V0Q29sb3JzID0gZGF0YXNldENvbG9ycy5tYXAoU3RyaW5nKTtcbiAgY29uc3QgdXNlZENvbG9ycyA9IHVuaXEoT2JqZWN0LnZhbHVlcyhkYXRhc2V0cykubWFwKGQgPT4gU3RyaW5nKGQuY29sb3IpKSkuZmlsdGVyKGMgPT5cbiAgICBwcmVzZXRDb2xvcnMuaW5jbHVkZXMoYylcbiAgKTtcblxuICBpZiAodXNlZENvbG9ycy5sZW5ndGggPT09IHByZXNldENvbG9ycy5sZW5ndGgpIHtcbiAgICAvLyBpZiB3ZSBhbHJlYWR5IGRlcGxldGVkIHRoZSBwb29sIG9mIGNvbG9yXG4gICAgcmV0dXJuIGRhdGFzZXRDb2xvck1ha2VyLm5leHQoKS52YWx1ZTtcbiAgfVxuXG4gIGxldCBjb2xvciA9IGRhdGFzZXRDb2xvck1ha2VyLm5leHQoKS52YWx1ZTtcbiAgd2hpbGUgKHVzZWRDb2xvcnMuaW5jbHVkZXMoU3RyaW5nKGNvbG9yKSkpIHtcbiAgICBjb2xvciA9IGRhdGFzZXRDb2xvck1ha2VyLm5leHQoKS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBjb2xvcjtcbn1cblxuLyoqXG4gKiBUYWtlIGRhdGFzZXRzIHBheWxvYWQgZnJvbSBhZGREYXRhVG9NYXAsIGNyZWF0ZSBkYXRhc2V0cyBlbnRyeSBzYXZlIHRvIHZpc1N0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOZXdEYXRhRW50cnkoXG4gIHtpbmZvLCBkYXRhLCAuLi5vcHRzfTogUHJvdG9EYXRhc2V0LFxuICBkYXRhc2V0czogRGF0YXNldHMgPSB7fVxuKTogRGF0YXNldHMgfCBudWxsIHtcbiAgY29uc3QgVGFibGVDbGFzcyA9IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkudGFibGUgPz8gS2VwbGVyVGFibGU7XG4gIGxldCBkYXRhVmFsaWRhdG9yID0gdmFsaWRhdGVJbnB1dERhdGE7XG4gIGlmICh0eXBlb2YgVGFibGVDbGFzcy5nZXRJbnB1dERhdGFWYWxpZGF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkYXRhVmFsaWRhdG9yID0gVGFibGVDbGFzcy5nZXRJbnB1dERhdGFWYWxpZGF0b3IoKTtcbiAgfVxuXG4gIGNvbnN0IHZhbGlkYXRlZERhdGEgPSBkYXRhVmFsaWRhdG9yKGRhdGEpO1xuICBpZiAoIXZhbGlkYXRlZERhdGEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIGNoZWNrIGlmIGRhdGFzZXQgYWxyZWFkeSBleGlzdHMsIGFuZCB1cGRhdGUgaXQgd2hlbiBsb2FkaW5nIGRhdGEgYnkgYmF0Y2hlcyBpbmNyZW1lbnRhbGx5XG4gIGlmIChpbmZvICYmIGluZm8uaWQgJiYgZGF0YXNldHNbaW5mby5pZF0pIHtcbiAgICAvLyBnZXQga2VwbGVyVGFibGUgZnJvbSBkYXRhc2V0c1xuICAgIGNvbnN0IGtlcGxlclRhYmxlID0gZGF0YXNldHNbaW5mby5pZF07XG4gICAgLy8gdXBkYXRlIHRoZSBkYXRhIGluIGtlcGxlclRhYmxlXG4gICAgcmV0dXJuIFVQREFURV9UQUJMRV9UQVNLKHt0YWJsZToga2VwbGVyVGFibGUsIGRhdGE6IHZhbGlkYXRlZERhdGF9KTtcbiAgfVxuXG4gIGluZm8gPSBpbmZvIHx8IHt9O1xuICBjb25zdCBjb2xvciA9IGluZm8uY29sb3IgfHwgZ2V0TmV3RGF0YXNldENvbG9yKGRhdGFzZXRzKTtcblxuICByZXR1cm4gQ1JFQVRFX1RBQkxFX1RBU0soe1xuICAgIGluZm8sXG4gICAgY29sb3IsXG4gICAgb3B0cyxcbiAgICBkYXRhOiB2YWxpZGF0ZWREYXRhXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVUYWJsZSh7dGFibGUsIGRhdGF9KSB7XG4gIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0YWJsZS51cGRhdGUoZGF0YSk7IC8vIEFzc3VtaW5nIGB0YWJsZWAgaGFzIGFuIGB1cGRhdGVgIG1ldGhvZFxuICByZXR1cm4gdXBkYXRlZDtcbn1cblxudHlwZSBDcmVhdGVUYWJsZVByb3BzID0ge1xuICBpbmZvOiBhbnk7XG4gIGNvbG9yOiBSR0JDb2xvcjtcbiAgb3B0czoge1xuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH07XG4gIGRhdGE6IGFueTtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKGRhdGFzZXRJbmZvOiBDcmVhdGVUYWJsZVByb3BzKSB7XG4gIGNvbnN0IHtpbmZvLCBjb2xvciwgb3B0cywgZGF0YX0gPSBkYXRhc2V0SW5mbztcblxuICAvLyB1cGRhdGUgbWV0YWRhdGEgZm9yIHJlbW90ZSB0aWxlZCBkYXRhc2V0c1xuICBjb25zdCByZWZyZXNoZWRNZXRhZGF0YSA9IGF3YWl0IHJlZnJlc2hSZW1vdGVEYXRhKGRhdGFzZXRJbmZvKTtcbiAgbGV0IG1ldGFkYXRhID0gb3B0cy5tZXRhZGF0YTtcbiAgaWYgKHJlZnJlc2hlZE1ldGFkYXRhKSB7XG4gICAgbWV0YWRhdGEgPSB7Li4ub3B0cy5tZXRhZGF0YSwgLi4ucmVmcmVzaGVkTWV0YWRhdGF9O1xuICAgIGlmIChtZXRhZGF0YS5maWVsZHMpIHtcbiAgICAgIGRhdGEuZmllbGRzID0gbWV0YWRhdGEuZmllbGRzO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFRhYmxlQ2xhc3MgPSBnZXRBcHBsaWNhdGlvbkNvbmZpZygpLnRhYmxlID8/IEtlcGxlclRhYmxlO1xuICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUNsYXNzKHtcbiAgICBpbmZvLFxuICAgIGNvbG9yLFxuICAgIC4uLm9wdHMsXG4gICAgbWV0YWRhdGFcbiAgfSk7XG4gIGF3YWl0IHRhYmxlLmltcG9ydERhdGEoe2RhdGF9KTtcblxuICByZXR1cm4gdGFibGU7XG59XG5jb25zdCBVUERBVEVfVEFCTEVfVEFTSyA9IFRhc2suZnJvbVByb21pc2UodXBkYXRlVGFibGUsICdVUERBVEVfVEFCTEVfVEFTSycpO1xuY29uc3QgQ1JFQVRFX1RBQkxFX1RBU0sgPSBUYXNrLmZyb21Qcm9taXNlKGNyZWF0ZVRhYmxlLCAnQ1JFQVRFX1RBQkxFX1RBU0snKTtcblxuLyoqXG4gKiBGZXRjaCBtZXRhZGF0YSBmb3IgdmVjdG9yIHRpbGUgbGF5ZXJzIHVzaW5nIHRpbGVzZXRNZXRhZGF0YVVybCBmcm9tIG1ldGFkYXRhXG4gKiBAcGFyYW0gZGF0YXNldEluZm9cbiAqIEByZXR1cm5zXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hSZW1vdGVEYXRhKGRhdGFzZXRJbmZvOiBDcmVhdGVUYWJsZVByb3BzKTogUHJvbWlzZTxvYmplY3QgfCBudWxsPiB7XG4gIGNvbnN0IHt0eXBlfSA9IGRhdGFzZXRJbmZvLmluZm87XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgRGF0YXNldFR5cGUuVkVDVE9SX1RJTEU6XG4gICAgICByZXR1cm4gYXdhaXQgcmVmcmVzaFZlY3RvclRpbGVNZXRhZGF0YShkYXRhc2V0SW5mbyk7XG4gICAgY2FzZSBEYXRhc2V0VHlwZS5SQVNURVJfVElMRTpcbiAgICAgIHJldHVybiBhd2FpdCByZWZyZXNoUmFzdGVyVGlsZU1ldGFkYXRhKGRhdGFzZXRJbmZvKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaFZlY3RvclRpbGVNZXRhZGF0YShcbiAgZGF0YXNldEluZm86IENyZWF0ZVRhYmxlUHJvcHNcbik6IFByb21pc2U8VmVjdG9yVGlsZU1ldGFkYXRhIHwgbnVsbD4ge1xuICBjb25zdCB7cmVtb3RlVGlsZUZvcm1hdCwgdGlsZXNldE1ldGFkYXRhVXJsLCB0aWxlc2V0RGF0YVVybH0gPVxuICAgIChkYXRhc2V0SW5mby5vcHRzLm1ldGFkYXRhIGFzIFZlY3RvclRpbGVEYXRhc2V0TWV0YWRhdGEpIHx8IHt9O1xuXG4gIGlmIChcbiAgICAhKHJlbW90ZVRpbGVGb3JtYXQgPT09IFJlbW90ZVRpbGVGb3JtYXQuUE1USUxFUyB8fCByZW1vdGVUaWxlRm9ybWF0ID09PSBSZW1vdGVUaWxlRm9ybWF0Lk1WVCkgfHxcbiAgICB0eXBlb2YgdGlsZXNldE1ldGFkYXRhVXJsICE9PSAnc3RyaW5nJyB8fFxuICAgIHR5cGVvZiB0aWxlc2V0RGF0YVVybCAhPT0gJ3N0cmluZydcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGxldCByYXdNZXRhZGF0YTogUE1UaWxlc01ldGFkYXRhIHwgVGlsZUpTT04gfCBudWxsID0gbnVsbDtcbiAgICBpZiAocmVtb3RlVGlsZUZvcm1hdCA9PT0gUmVtb3RlVGlsZUZvcm1hdC5NVlQpIHtcbiAgICAgIHJhd01ldGFkYXRhID0gYXdhaXQgZ2V0TVZUTWV0YWRhdGEodGlsZXNldE1ldGFkYXRhVXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGlsZVNvdXJjZSA9IFBNVGlsZXNTb3VyY2UuY3JlYXRlRGF0YVNvdXJjZSh0aWxlc2V0TWV0YWRhdGFVcmwsIHt9KTtcbiAgICAgIHJhd01ldGFkYXRhID0gYXdhaXQgdGlsZVNvdXJjZS5tZXRhZGF0YTtcbiAgICB9XG5cbiAgICBpZiAocmF3TWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VWZWN0b3JNZXRhZGF0YShyYXdNZXRhZGF0YSk7XG5cbiAgICAgIGF3YWl0IGdldEZpZWxkc0Zyb21UaWxlKHtcbiAgICAgICAgcmVtb3RlVGlsZUZvcm1hdCxcbiAgICAgICAgdGlsZXNldFVybDogdGlsZXNldERhdGFVcmwsXG4gICAgICAgIG1ldGFkYXRhVXJsOiB0aWxlc2V0TWV0YWRhdGFVcmwsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gaWdub3JlIGZvciBub3csIGFuZCB1c2Ugb2xkIG1ldGFkYXRhXG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hSYXN0ZXJUaWxlTWV0YWRhdGEoZGF0YXNldEluZm86IENyZWF0ZVRhYmxlUHJvcHMpOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgY29uc3Qge21ldGFkYXRhVXJsLCBwbXRpbGVzVHlwZX0gPSAoZGF0YXNldEluZm8ub3B0cy5tZXRhZGF0YSBhcyBSYXN0ZXJUaWxlRGF0YXNldE1ldGFkYXRhKSB8fCB7fTtcblxuICBpZiAodHlwZW9mIG1ldGFkYXRhVXJsICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAocG10aWxlc1R5cGUgPT09IFBNVGlsZXNUeXBlLlJBU1RFUikge1xuICAgICAgY29uc3QgdGlsZVNvdXJjZSA9IFBNVGlsZXNTb3VyY2UuY3JlYXRlRGF0YVNvdXJjZShtZXRhZGF0YVVybCwge30pO1xuICAgICAgY29uc3QgcmF3TWV0YWRhdGE6IFBNVGlsZXNNZXRhZGF0YSA9IGF3YWl0IHRpbGVTb3VyY2UubWV0YWRhdGE7XG5cbiAgICAgIGlmIChyYXdNZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gcGFyc2VWZWN0b3JNZXRhZGF0YShyYXdNZXRhZGF0YSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGl0J3Mgc3RhYyByYXN0ZXIgdGlsZXNcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gobWV0YWRhdGFVcmwpO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCBGZXRjaCAke21ldGFkYXRhVXJsfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3TWV0YWRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VSYXN0ZXJNZXRhZGF0YShyYXdNZXRhZGF0YSwge2FsbG93Q29sbGVjdGlvbnM6IHRydWV9KTtcbiAgICAgIGlmIChtZXRhZGF0YSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIG1ldGFkYXRhICR7bWV0YWRhdGEubWVzc2FnZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gaWdub3JlIGZvciBub3csIGFuZCB1c2Ugb2xkIG1ldGFkYXRhXG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLE1BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQU9BLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQU1BLElB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