kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
208 lines (206 loc) • 30.6 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
exports.getDatasetAttributesFromVectorTile = getDatasetAttributesFromVectorTile;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react"));
var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components"));
var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/common-utils/src");
var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src");
var _src3 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/table/src");
var _useFetchVectorTileMetadata = _interopRequireDefault(require("../../hooks/use-fetch-vector-tile-metadata"));
var _common = require("../../common");
var _templateObject, _templateObject2; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
var TilesetInputContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: grid;\n grid-template-rows: repeat(3, 1fr);\n row-gap: 18px;\n font-size: 12px;\n"])));
var TilesetInputDescription = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n text-align: center;\n color: ", ";\n font-size: 11px;\n"])), function (props) {
return props.theme.AZURE200;
});
function getDatasetAttributesFromVectorTile(_ref) {
var name = _ref.name,
dataUrl = _ref.dataUrl,
metadataUrl = _ref.metadataUrl;
return {
name: name,
type: _src2.DatasetType.VECTOR_TILE,
metadata: {
type: _src2.REMOTE_TILE,
remoteTileFormat: (0, _src.isPMTilesUrl)(dataUrl) ? _src2.RemoteTileFormat.PMTILES : _src2.RemoteTileFormat.MVT,
tilesetDataUrl: dataUrl,
tilesetMetadataUrl: metadataUrl
}
};
}
var TilesetVectorForm = function TilesetVectorForm(_ref2) {
var setResponse = _ref2.setResponse;
var _useState = (0, _react.useState)(''),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
tileName = _useState2[0],
setTileName = _useState2[1];
var _useState3 = (0, _react.useState)(''),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
tileUrl = _useState4[0],
setTileUrl = _useState4[1];
var _useState5 = (0, _react.useState)(''),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
metadataUrl = _useState6[0],
setMetadataUrl = _useState6[1];
var _useState7 = (0, _react.useState)(null),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
initialFetchError = _useState8[0],
setInitialFetchError = _useState8[1];
var onTileNameChange = (0, _react.useCallback)(function (event) {
event.preventDefault();
setTileName(event.target.value);
}, [setTileName]);
var onTileMetaUrlChange = (0, _react.useCallback)(function (event) {
event.preventDefault();
setMetadataUrl(event.target.value);
}, [setMetadataUrl]);
var onTileUrlChange = (0, _react.useCallback)( /*#__PURE__*/function () {
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event) {
var newTileUrl, usePMTiles, potentialMetadataUrl, resp;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
event.preventDefault();
newTileUrl = event.target.value;
setTileUrl(newTileUrl);
usePMTiles = (0, _src.isPMTilesUrl)(newTileUrl);
potentialMetadataUrl = usePMTiles ? newTileUrl : (0, _src3.getMetaUrl)(newTileUrl);
if (!(!metadataUrl && potentialMetadataUrl)) {
_context.next = 17;
break;
}
if (!usePMTiles) {
_context.next = 10;
break;
}
_context.t0 = {
ok: true
};
_context.next = 13;
break;
case 10:
_context.next = 12;
return fetch(potentialMetadataUrl);
case 12:
_context.t0 = _context.sent;
case 13:
resp = _context.t0;
if (resp.ok) {
setInitialFetchError(null);
setMetadataUrl(potentialMetadataUrl);
} else {
setInitialFetchError(new Error("Metadata loading failed: ".concat(resp.status, " ").concat(resp.statusText)));
}
_context.next = 18;
break;
case 17:
setInitialFetchError(null);
case 18:
if (!tileName) {
setTileName(newTileUrl.split('/').pop() || newTileUrl);
}
case 19:
case "end":
return _context.stop();
}
}, _callee);
}));
return function (_x) {
return _ref3.apply(this, arguments);
};
}(), [setTileUrl, tileName, setMetadataUrl, metadataUrl]);
var process = (0, _react.useMemo)(function () {
return function (value) {
return (0, _src3.parseVectorMetadata)(value, {
tileUrl: metadataUrl
});
};
}, [metadataUrl]);
var _useFetchVectorTileMe = (0, _useFetchVectorTileMetadata["default"])({
metadataUrl: metadataUrl,
tilesetUrl: tileUrl,
remoteTileFormat: (0, _src.isPMTilesUrl)(metadataUrl) ? _src2.RemoteTileFormat.PMTILES : _src2.RemoteTileFormat.MVT,
process: process
}),
metadata = _useFetchVectorTileMe.data,
loading = _useFetchVectorTileMe.loading,
metaError = _useFetchVectorTileMe.error;
// reset initial fetch error if the metadata is available
if (metadata && initialFetchError) {
setInitialFetchError(null);
}
(0, _react.useEffect)(function () {
if (tileName && tileUrl) {
if ((metadata === null || metadata === void 0 ? void 0 : metadata.pmtilesType) === _src2.PMTilesType.RASTER) {
return setResponse({
metadata: metadata,
dataset: null,
loading: loading,
error: new Error('For .pmtiles in raster format, please use the Raster Tile form.')
});
}
var dataset = getDatasetAttributesFromVectorTile({
name: tileName,
dataUrl: tileUrl,
metadataUrl: metadataUrl !== null && metadataUrl !== void 0 ? metadataUrl : undefined
});
setResponse({
metadata: metadata,
dataset: dataset,
loading: loading,
error: metaError || initialFetchError
});
} else {
setResponse({
metadata: metadata,
dataset: null,
loading: loading,
error: metaError || initialFetchError
});
}
}, [setResponse, metadata, loading, metaError, initialFetchError, tileUrl, tileName, metadataUrl]);
(0, _react.useEffect)(function () {
if (metadata) {
var name = metadata.name;
if (name) {
setTileName(name);
}
}
}, [metadata]);
return /*#__PURE__*/_react["default"].createElement(TilesetInputContainer, null, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "tileset-name"
}, "Name"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, {
id: "tileset-name",
placeholder: "Name your tileset",
value: tileName,
onChange: onTileNameChange
})), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "tile-url"
}, "Tileset URL"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, {
id: "tile-url",
placeholder: "Tileset URL",
value: tileUrl,
onChange: onTileUrlChange
}), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Requires {x}, {y}, {z} placeholders in URL or .pmtile extension.")), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "tile-metadata"
}, "Tileset metadata URL"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, {
id: "tile-metadata",
placeholder: "Tileset metadata",
value: metadataUrl !== null && metadataUrl !== void 0 ? metadataUrl : undefined,
onChange: onTileMetaUrlChange
}), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Optional, but recommended. Supports json, txt")));
};
var _default = exports["default"] = TilesetVectorForm;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3JjIiwiX3NyYzIiLCJfc3JjMyIsIl91c2VGZXRjaFZlY3RvclRpbGVNZXRhZGF0YSIsIl9jb21tb24iLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiVGlsZXNldElucHV0Q29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJUaWxlc2V0SW5wdXREZXNjcmlwdGlvbiIsInByb3BzIiwidGhlbWUiLCJBWlVSRTIwMCIsImdldERhdGFzZXRBdHRyaWJ1dGVzRnJvbVZlY3RvclRpbGUiLCJfcmVmIiwibmFtZSIsImRhdGFVcmwiLCJtZXRhZGF0YVVybCIsInR5cGUiLCJEYXRhc2V0VHlwZSIsIlZFQ1RPUl9USUxFIiwibWV0YWRhdGEiLCJSRU1PVEVfVElMRSIsInJlbW90ZVRpbGVGb3JtYXQiLCJpc1BNVGlsZXNVcmwiLCJSZW1vdGVUaWxlRm9ybWF0IiwiUE1USUxFUyIsIk1WVCIsInRpbGVzZXREYXRhVXJsIiwidGlsZXNldE1ldGFkYXRhVXJsIiwiVGlsZXNldFZlY3RvckZvcm0iLCJfcmVmMiIsInNldFJlc3BvbnNlIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwidGlsZU5hbWUiLCJzZXRUaWxlTmFtZSIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwidGlsZVVybCIsInNldFRpbGVVcmwiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsInNldE1ldGFkYXRhVXJsIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJpbml0aWFsRmV0Y2hFcnJvciIsInNldEluaXRpYWxGZXRjaEVycm9yIiwib25UaWxlTmFtZUNoYW5nZSIsInVzZUNhbGxiYWNrIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInRhcmdldCIsInZhbHVlIiwib25UaWxlTWV0YVVybENoYW5nZSIsIm9uVGlsZVVybENoYW5nZSIsIl9yZWYzIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJuZXdUaWxlVXJsIiwidXNlUE1UaWxlcyIsInBvdGVudGlhbE1ldGFkYXRhVXJsIiwicmVzcCIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJnZXRNZXRhVXJsIiwidDAiLCJvayIsImZldGNoIiwic2VudCIsIkVycm9yIiwiY29uY2F0Iiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInNwbGl0IiwicG9wIiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJwcm9jZXNzIiwidXNlTWVtbyIsInBhcnNlVmVjdG9yTWV0YWRhdGEiLCJfdXNlRmV0Y2hWZWN0b3JUaWxlTWUiLCJ1c2VGZXRjaFZlY3RvclRpbGVNZXRhZGF0YSIsInRpbGVzZXRVcmwiLCJkYXRhIiwibG9hZGluZyIsIm1ldGFFcnJvciIsImVycm9yIiwidXNlRWZmZWN0IiwicG10aWxlc1R5cGUiLCJQTVRpbGVzVHlwZSIsIlJBU1RFUiIsImRhdGFzZXQiLCJ1bmRlZmluZWQiLCJjcmVhdGVFbGVtZW50IiwiaHRtbEZvciIsIklucHV0TGlnaHQiLCJpZCIsInBsYWNlaG9sZGVyIiwib25DaGFuZ2UiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zcmMvbW9kYWxzL3RpbGVzZXRzLW1vZGFscy90aWxlc2V0LXZlY3Rvci1mb3JtLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZSwgdXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7aXNQTVRpbGVzVXJsfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge1xuICBEYXRhc2V0VHlwZSxcbiAgUE1UaWxlc1R5cGUsXG4gIFJlbW90ZVRpbGVGb3JtYXQsXG4gIFZlY3RvclRpbGVEYXRhc2V0TWV0YWRhdGEsXG4gIFJFTU9URV9USUxFXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7VGlsZUpTT059IGZyb20gJ0Bsb2FkZXJzLmdsL212dCc7XG5pbXBvcnQge1BNVGlsZXNNZXRhZGF0YX0gZnJvbSAnQGxvYWRlcnMuZ2wvcG10aWxlcyc7XG5pbXBvcnQge2dldE1ldGFVcmwsIHBhcnNlVmVjdG9yTWV0YWRhdGEsIFZlY3RvclRpbGVNZXRhZGF0YX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge01lcmdlfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuaW1wb3J0IHtkZWZhdWx0IGFzIHVzZUZldGNoVmVjdG9yVGlsZU1ldGFkYXRhfSBmcm9tICcuLi8uLi9ob29rcy91c2UtZmV0Y2gtdmVjdG9yLXRpbGUtbWV0YWRhdGEnO1xuaW1wb3J0IHtEYXRhc2V0Q3JlYXRpb25BdHRyaWJ1dGVzLCBNZXRhUmVzcG9uc2V9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7SW5wdXRMaWdodH0gZnJvbSAnLi4vLi4vY29tbW9uJztcblxuY29uc3QgVGlsZXNldElucHV0Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQoMywgMWZyKTtcbiAgcm93LWdhcDogMThweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuYDtcblxuY29uc3QgVGlsZXNldElucHV0RGVzY3JpcHRpb24gPSBzdHlsZWQuZGl2YFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLkFaVVJFMjAwfTtcbiAgZm9udC1zaXplOiAxMXB4O1xuYDtcblxuZXhwb3J0IHR5cGUgVmVjdG9yVGlsZXNldEZvcm1EYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRhdGFVcmw6IHN0cmluZztcbiAgbWV0YWRhdGFVcmw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBWZWN0b3JUaWxlRGF0YXNldENyZWF0aW9uQXR0cmlidXRlcyA9IE1lcmdlPFxuICBEYXRhc2V0Q3JlYXRpb25BdHRyaWJ1dGVzLFxuICB7XG4gICAgbWV0YWRhdGE6IFZlY3RvclRpbGVEYXRhc2V0TWV0YWRhdGE7XG4gIH1cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhc2V0QXR0cmlidXRlc0Zyb21WZWN0b3JUaWxlKHtcbiAgbmFtZSxcbiAgZGF0YVVybCxcbiAgbWV0YWRhdGFVcmxcbn06IFZlY3RvclRpbGVzZXRGb3JtRGF0YSk6IFZlY3RvclRpbGVEYXRhc2V0Q3JlYXRpb25BdHRyaWJ1dGVzIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IERhdGFzZXRUeXBlLlZFQ1RPUl9USUxFLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICB0eXBlOiBSRU1PVEVfVElMRSxcbiAgICAgIHJlbW90ZVRpbGVGb3JtYXQ6IGlzUE1UaWxlc1VybChkYXRhVXJsKSA/IFJlbW90ZVRpbGVGb3JtYXQuUE1USUxFUyA6IFJlbW90ZVRpbGVGb3JtYXQuTVZULFxuICAgICAgdGlsZXNldERhdGFVcmw6IGRhdGFVcmwsXG4gICAgICB0aWxlc2V0TWV0YWRhdGFVcmw6IG1ldGFkYXRhVXJsXG4gICAgfVxuICB9O1xufVxuXG50eXBlIFRpbGVzZXRWZWN0b3JGb3JtUHJvcHMgPSB7XG4gIHNldFJlc3BvbnNlOiAocmVzcG9uc2U6IE1ldGFSZXNwb25zZSkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IFRpbGVzZXRWZWN0b3JGb3JtOiBSZWFjdC5GQzxUaWxlc2V0VmVjdG9yRm9ybVByb3BzPiA9ICh7c2V0UmVzcG9uc2V9KSA9PiB7XG4gIGNvbnN0IFt0aWxlTmFtZSwgc2V0VGlsZU5hbWVdID0gdXNlU3RhdGU8c3RyaW5nPignJyk7XG4gIGNvbnN0IFt0aWxlVXJsLCBzZXRUaWxlVXJsXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xuICBjb25zdCBbbWV0YWRhdGFVcmwsIHNldE1ldGFkYXRhVXJsXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KCcnKTtcbiAgY29uc3QgW2luaXRpYWxGZXRjaEVycm9yLCBzZXRJbml0aWFsRmV0Y2hFcnJvcl0gPSB1c2VTdGF0ZTxFcnJvciB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IG9uVGlsZU5hbWVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2V0VGlsZU5hbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuICAgIFtzZXRUaWxlTmFtZV1cbiAgKTtcblxuICBjb25zdCBvblRpbGVNZXRhVXJsQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldE1ldGFkYXRhVXJsKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSxcbiAgICBbc2V0TWV0YWRhdGFVcmxdXG4gICk7XG5cbiAgY29uc3Qgb25UaWxlVXJsQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IG5ld1RpbGVVcmwgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICBzZXRUaWxlVXJsKG5ld1RpbGVVcmwpO1xuXG4gICAgICBjb25zdCB1c2VQTVRpbGVzID0gaXNQTVRpbGVzVXJsKG5ld1RpbGVVcmwpO1xuICAgICAgY29uc3QgcG90ZW50aWFsTWV0YWRhdGFVcmwgPSB1c2VQTVRpbGVzID8gbmV3VGlsZVVybCA6IGdldE1ldGFVcmwobmV3VGlsZVVybCk7XG4gICAgICBpZiAoIW1ldGFkYXRhVXJsICYmIHBvdGVudGlhbE1ldGFkYXRhVXJsKSB7XG4gICAgICAgIC8vIGNoZWNrIGlmIFVSTCBleGlzdHMgYmVmb3JlIHNldHRpbmcgaXQgYXMgdGhlIG1ldGFkYXRhIFVSTFxuICAgICAgICAvLyBOb3RlOiBUaGUge21ldGhvZDogSEVBRH0gcmVxdWVzdCBvZnRlbiBmYWlscywgbGlrZWx5IGR1ZSB0byBpbmRpdmlkdWFsIHN0b3JhZ2Ugc2V0dGluZ3MuXG4gICAgICAgIGNvbnN0IHJlc3AgPSB1c2VQTVRpbGVzID8gKHtvazogdHJ1ZX0gYXMgUmVzcG9uc2UpIDogYXdhaXQgZmV0Y2gocG90ZW50aWFsTWV0YWRhdGFVcmwpO1xuICAgICAgICBpZiAocmVzcC5vaykge1xuICAgICAgICAgIHNldEluaXRpYWxGZXRjaEVycm9yKG51bGwpO1xuICAgICAgICAgIHNldE1ldGFkYXRhVXJsKHBvdGVudGlhbE1ldGFkYXRhVXJsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRJbml0aWFsRmV0Y2hFcnJvcihcbiAgICAgICAgICAgIG5ldyBFcnJvcihgTWV0YWRhdGEgbG9hZGluZyBmYWlsZWQ6ICR7cmVzcC5zdGF0dXN9ICR7cmVzcC5zdGF0dXNUZXh0fWApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SW5pdGlhbEZldGNoRXJyb3IobnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRpbGVOYW1lKSB7XG4gICAgICAgIHNldFRpbGVOYW1lKG5ld1RpbGVVcmwuc3BsaXQoJy8nKS5wb3AoKSB8fCBuZXdUaWxlVXJsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzZXRUaWxlVXJsLCB0aWxlTmFtZSwgc2V0TWV0YWRhdGFVcmwsIG1ldGFkYXRhVXJsXVxuICApO1xuXG4gIGNvbnN0IHByb2Nlc3MgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gKHZhbHVlOiBQTVRpbGVzTWV0YWRhdGEgfCBUaWxlSlNPTikgPT5cbiAgICAgIHBhcnNlVmVjdG9yTWV0YWRhdGEodmFsdWUsIHt0aWxlVXJsOiBtZXRhZGF0YVVybH0pO1xuICB9LCBbbWV0YWRhdGFVcmxdKTtcblxuICBjb25zdCB7XG4gICAgZGF0YTogbWV0YWRhdGEsXG4gICAgbG9hZGluZyxcbiAgICBlcnJvcjogbWV0YUVycm9yXG4gIH0gPSB1c2VGZXRjaFZlY3RvclRpbGVNZXRhZGF0YSh7XG4gICAgbWV0YWRhdGFVcmwsXG4gICAgdGlsZXNldFVybDogdGlsZVVybCxcbiAgICByZW1vdGVUaWxlRm9ybWF0OiBpc1BNVGlsZXNVcmwobWV0YWRhdGFVcmwpID8gUmVtb3RlVGlsZUZvcm1hdC5QTVRJTEVTIDogUmVtb3RlVGlsZUZvcm1hdC5NVlQsXG4gICAgcHJvY2Vzc1xuICB9KTtcblxuICAvLyByZXNldCBpbml0aWFsIGZldGNoIGVycm9yIGlmIHRoZSBtZXRhZGF0YSBpcyBhdmFpbGFibGVcbiAgaWYgKG1ldGFkYXRhICYmIGluaXRpYWxGZXRjaEVycm9yKSB7XG4gICAgc2V0SW5pdGlhbEZldGNoRXJyb3IobnVsbCk7XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0aWxlTmFtZSAmJiB0aWxlVXJsKSB7XG4gICAgICBpZiAobWV0YWRhdGE/LnBtdGlsZXNUeXBlID09PSBQTVRpbGVzVHlwZS5SQVNURVIpIHtcbiAgICAgICAgcmV0dXJuIHNldFJlc3BvbnNlKHtcbiAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICBkYXRhc2V0OiBudWxsLFxuICAgICAgICAgIGxvYWRpbmcsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcignRm9yIC5wbXRpbGVzIGluIHJhc3RlciBmb3JtYXQsIHBsZWFzZSB1c2UgdGhlIFJhc3RlciBUaWxlIGZvcm0uJylcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXQgPSBnZXREYXRhc2V0QXR0cmlidXRlc0Zyb21WZWN0b3JUaWxlKHtcbiAgICAgICAgbmFtZTogdGlsZU5hbWUsXG4gICAgICAgIGRhdGFVcmw6IHRpbGVVcmwsXG4gICAgICAgIG1ldGFkYXRhVXJsOiBtZXRhZGF0YVVybCA/PyB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgc2V0UmVzcG9uc2Uoe1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgZGF0YXNldCxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgZXJyb3I6IG1ldGFFcnJvciB8fCBpbml0aWFsRmV0Y2hFcnJvclxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFJlc3BvbnNlKHtcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGRhdGFzZXQ6IG51bGwsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIGVycm9yOiBtZXRhRXJyb3IgfHwgaW5pdGlhbEZldGNoRXJyb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW1xuICAgIHNldFJlc3BvbnNlLFxuICAgIG1ldGFkYXRhLFxuICAgIGxvYWRpbmcsXG4gICAgbWV0YUVycm9yLFxuICAgIGluaXRpYWxGZXRjaEVycm9yLFxuICAgIHRpbGVVcmwsXG4gICAgdGlsZU5hbWUsXG4gICAgbWV0YWRhdGFVcmxcbiAgXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSAobWV0YWRhdGEgYXMgVmVjdG9yVGlsZU1ldGFkYXRhKS5uYW1lO1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgc2V0VGlsZU5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbbWV0YWRhdGFdKTtcblxuICByZXR1cm4gKFxuICAgIDxUaWxlc2V0SW5wdXRDb250YWluZXI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInRpbGVzZXQtbmFtZVwiPk5hbWU8L2xhYmVsPlxuICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgIGlkPVwidGlsZXNldC1uYW1lXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5hbWUgeW91ciB0aWxlc2V0XCJcbiAgICAgICAgICB2YWx1ZT17dGlsZU5hbWV9XG4gICAgICAgICAgb25DaGFuZ2U9e29uVGlsZU5hbWVDaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZS11cmxcIj5UaWxlc2V0IFVSTDwvbGFiZWw+XG4gICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgaWQ9XCJ0aWxlLXVybFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUaWxlc2V0IFVSTFwiXG4gICAgICAgICAgdmFsdWU9e3RpbGVVcmx9XG4gICAgICAgICAgb25DaGFuZ2U9e29uVGlsZVVybENoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgICAgPFRpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgICAgIFJlcXVpcmVzICYjMTIzO3gmIzEyNTssICYjMTIzO3kmIzEyNTssICYjMTIzO3omIzEyNTsgcGxhY2Vob2xkZXJzIGluIFVSTCBvciAucG10aWxlXG4gICAgICAgICAgZXh0ZW5zaW9uLlxuICAgICAgICA8L1RpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInRpbGUtbWV0YWRhdGFcIj5UaWxlc2V0IG1ldGFkYXRhIFVSTDwvbGFiZWw+XG4gICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgaWQ9XCJ0aWxlLW1ldGFkYXRhXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRpbGVzZXQgbWV0YWRhdGFcIlxuICAgICAgICAgIHZhbHVlPXttZXRhZGF0YVVybCA/PyB1bmRlZmluZWR9XG4gICAgICAgICAgb25DaGFuZ2U9e29uVGlsZU1ldGFVcmxDaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICAgIDxUaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5cbiAgICAgICAgICBPcHRpb25hbCwgYnV0IHJlY29tbWVuZGVkLiBTdXBwb3J0cyBqc29uLCB0eHRcbiAgICAgICAgPC9UaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvVGlsZXNldElucHV0Q29udGFpbmVyPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVGlsZXNldFZlY3RvckZvcm07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUcsSUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBSixPQUFBO0FBU0EsSUFBQUssS0FBQSxHQUFBTCxPQUFBO0FBR0EsSUFBQU0sMkJBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFPLE9BQUEsR0FBQVAsT0FBQTtBQUF3QyxJQUFBUSxlQUFBLEVBQUFDLGdCQUFBLEVBckJ4QztBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJ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QUlBLElBQUksRUFBRTtRQUNSdUIsV0FBVyxDQUFDdkIsSUFBSSxDQUFDO01BQ25CO0lBQ0Y7RUFDRixDQUFDLEVBQUUsQ0FBQ00sUUFBUSxDQUFDLENBQUM7RUFFZCxvQkFDRWhELE1BQUEsWUFBQWtJLGFBQUEsQ0FBQ2xHLHFCQUFxQixxQkFDcEJoQyxNQUFBLFlBQUFrSSxhQUFBLDJCQUNFbEksTUFBQSxZQUFBa0ksYUFBQTtJQUFPQyxPQUFPLEVBQUM7RUFBYyxHQUFDLE1BQVcsQ0FBQyxlQUMxQ25JLE1BQUEsWUFBQWtJLGFBQUEsQ0FBQ3pILE9BQUEsQ0FBQTJILFVBQVU7SUFDVEMsRUFBRSxFQUFDLGNBQWM7SUFDakJDLFdBQVcsRUFBQyxtQkFBbUI7SUFDL0JwRCxLQUFLLEVBQUVsQixRQUFTO0lBQ2hCdUUsUUFBUSxFQUFFMUQ7RUFBaUIsQ0FDNUIsQ0FDRSxDQUFDLGVBQ043RSxNQUFBLFlBQUFrSSxhQUFBLDJCQUNFbEksTUFBQSxZQUFBa0ksYUFBQTtJQUFPQyxPQUFPLEVBQUM7RUFBVSxHQUFDLGFBQWtCLENBQUMsZUFDN0NuSSxNQUFBLFlBQUFrSSxhQUFBLENBQUN6SCxPQUFBLENBQUEySCxVQUFVO0lBQ1RDLEVBQUUsRUFBQyxVQUFVO0lBQ2JDLFdBQVcsRUFBQyxhQUFhO0lBQ3pCcEQsS0FBSyxFQUFFZCxPQUFRO0lBQ2ZtRSxRQUFRLEVBQUVuRDtFQUFnQixDQUMzQixDQUFDLGVBQ0ZwRixNQUFBLFlBQUFrSSxhQUFBLENBQUM5Rix1QkFBdUIsUUFBQyxrRUFHQSxDQUN0QixDQUFDLGVBQ05wQyxNQUFBLFlBQUFrSSxhQUFBLDJCQUNFbEksTUFBQSxZQUFBa0ksYUFBQTtJQUFPQyxPQUFPLEVBQUM7RUFBZSxHQUFDLHNCQUEyQixDQUFDLGVBQzNEbkksTUFBQSxZQUFBa0ksYUFBQSxDQUFDekgsT0FBQSxDQUFBMkgsVUFBVTtJQUNUQyxFQUFFLEVBQUMsZUFBZTtJQUNsQkMsV0FBVyxFQUFDLGtCQUFrQjtJQUM5QnBELEtBQUssRUFBRXRDLFdBQVcsYUFBWEEsV0FBVyxjQUFYQSxXQUFXLEdBQUlxRixTQUFVO0lBQ2hDTSxRQUFRLEVBQUVwRDtFQUFvQixDQUMvQixDQUFDLGVBQ0ZuRixNQUFBLFlBQUFrSSxhQUFBLENBQUM5Rix1QkFBdUIsUUFBQywrQ0FFQSxDQUN0QixDQUNnQixDQUFDO0FBRTVCLENBQUM7QUFBQyxJQUFBb0csUUFBQSxHQUFBQyxPQUFBLGNBRWFoRixpQkFBaUIiLCJpZ25vcmVMaXN0IjpbXX0=
;