UNPKG

kepler.gl

Version:

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

206 lines (205 loc) 32.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; 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("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _commonUtils = require("@kepler.gl/common-utils"); var _constants = require("@kepler.gl/constants"); var _table = require("@kepler.gl/table"); var _common = require("../../common"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6; // 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, auto);\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; }); var ExampleUrlsContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n text-align: left;\n color: ", ";\n font-size: 11px;\n"])), function (props) { return props.theme.AZURE200; }); var ExampleTabs = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n gap: 6px;\n margin-top: 6px;\n margin-bottom: 6px;\n"]))); var ExampleTab = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 3px 8px;\n border-radius: 3px;\n cursor: pointer;\n font-size: 11px;\n white-space: nowrap;\n background: ", ";\n color: ", ";\n border: 1px solid ", ";\n\n &:hover {\n background: ", ";\n }\n"])), function (props) { return props.active ? props.theme.AZURE400 : 'transparent'; }, function (props) { return props.active ? props.theme.WHITE : props.theme.AZURE200; }, function (props) { return props.active ? props.theme.AZURE400 : props.theme.AZURE400; }, function (props) { return props.active ? props.theme.AZURE400 : props.theme.AZURE500; }); var ExampleUrl = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n word-break: break-all;\n cursor: pointer;\n color: ", ";\n font-size: 11px;\n\n &:hover {\n color: ", ";\n }\n"])), function (props) { return props.theme.AZURE200; }, function (props) { return props.theme.AZURE100; }); var WMS_EXAMPLES = [{ label: 'OSM', name: 'OpenStreetMap WMS', url: 'https://ows.terrestris.de/osm/service' }, { label: 'NOAA Radar', name: 'NOAA CONUS Radar', url: 'https://opengeo.ncep.noaa.gov/geoserver/conus/conus_cref_qcd/ows' }, { label: 'NASA GIBS', name: 'NASA GIBS', url: 'https://gibs.earthdata.nasa.gov/wms/epsg4326/best/wms.cgi' }]; var TilesetWMSForm = function TilesetWMSForm(_ref) { var setResponse = _ref.setResponse; var _useState = (0, _react.useState)(''), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), layerName = _useState2[0], setLayerName = _useState2[1]; var _useState3 = (0, _react.useState)(''), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), wmsUrl = _useState4[0], setWmsUrl = _useState4[1]; var _useState5 = (0, _react.useState)(false), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), loading = _useState6[0], setLoading = _useState6[1]; var _useState7 = (0, _react.useState)(null), _useState8 = (0, _slicedToArray2["default"])(_useState7, 2), error = _useState8[0], setError = _useState8[1]; var _useState9 = (0, _react.useState)(null), _useState10 = (0, _slicedToArray2["default"])(_useState9, 2), wmsData = _useState10[0], setWMSData = _useState10[1]; var _useState11 = (0, _react.useState)(0), _useState12 = (0, _slicedToArray2["default"])(_useState11, 2), exampleTab = _useState12[0], setExampleTab = _useState12[1]; var onLayerNameChange = (0, _react.useCallback)(function (event) { event.preventDefault(); setLayerName(event.target.value); }, [setLayerName]); var onExampleClick = (0, _react.useCallback)(function (url, name) { setWmsUrl(url); setLayerName(name); }, [setWmsUrl, setLayerName]); var onWmsUrlChange = (0, _react.useCallback)( /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event) { var newWmsUrl, data, datasetMetadata, serviceTitle; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: event.preventDefault(); newWmsUrl = event.target.value; setWmsUrl(newWmsUrl); if ((0, _commonUtils.validateUrl)(newWmsUrl)) { _context.next = 6; break; } setWMSData(null); return _context.abrupt("return"); case 6: _context.prev = 6; setLoading(true); setError(null); _context.next = 11; return (0, _table.getWMSCapabilities)(newWmsUrl); case 11: data = _context.sent; datasetMetadata = (0, _table.wmsCapabilitiesToDatasetMetadata)(data); // Extract name or title from GetCapabilities response serviceTitle = (data === null || data === void 0 ? void 0 : data.title) || (data === null || data === void 0 ? void 0 : data.name); if (serviceTitle && !layerName) { setLayerName(serviceTitle); } setWMSData({ metadata: data, layers: datasetMetadata.layers, version: datasetMetadata.version }); _context.next = 22; break; case 18: _context.prev = 18; _context.t0 = _context["catch"](6); setError(_context.t0 instanceof Error ? _context.t0 : new Error('Unknown error')); setWMSData(null); case 22: _context.prev = 22; setLoading(false); return _context.finish(22); case 25: case "end": return _context.stop(); } }, _callee, null, [[6, 18, 22, 25]]); })); return function (_x) { return _ref2.apply(this, arguments); }; }(), [layerName]); (0, _react.useEffect)(function () { if (layerName && wmsUrl) { var _wmsData$metadata; var dataset = { name: layerName, type: _constants.DatasetType.WMS_TILE, metadata: { type: _constants.REMOTE_TILE, remoteTileFormat: _constants.RemoteTileFormat.WMS, tilesetDataUrl: wmsUrl, tilesetMetadataUrl: "".concat(wmsUrl, "?service=WMS&request=GetCapabilities"), layers: (wmsData === null || wmsData === void 0 ? void 0 : wmsData.layers) || [], wmsVersion: (wmsData === null || wmsData === void 0 ? void 0 : wmsData.version) || '1.3.0' } }; setResponse({ metadata: (_wmsData$metadata = wmsData === null || wmsData === void 0 ? void 0 : wmsData.metadata) !== null && _wmsData$metadata !== void 0 ? _wmsData$metadata : null, dataset: dataset, loading: loading, error: error }); } else { setResponse({ metadata: null, dataset: null, loading: loading, error: error }); } }, [setResponse, layerName, wmsUrl, wmsData, loading, error]); return /*#__PURE__*/_react["default"].createElement(TilesetInputContainer, null, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", { htmlFor: "layer-name" }, "Name"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, { id: "layer-name", placeholder: "Name your WMS layer", value: layerName, onChange: onLayerNameChange })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", { htmlFor: "wms-url" }, "WMS URL"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, { id: "wms-url", placeholder: "Enter WMS URL", value: wmsUrl, onChange: onWmsUrlChange }), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Provide a valid WMS service URL.")), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "For example, try a public WMS URL:"), /*#__PURE__*/_react["default"].createElement(ExampleUrlsContainer, null, /*#__PURE__*/_react["default"].createElement(ExampleTabs, null, WMS_EXAMPLES.map(function (ex, i) { return /*#__PURE__*/_react["default"].createElement(ExampleTab, { key: ex.label, active: exampleTab === i, onClick: function onClick() { setExampleTab(i); onExampleClick(ex.url, ex.name); } }, ex.label); })), /*#__PURE__*/_react["default"].createElement(ExampleUrl, { onClick: function onClick() { return onExampleClick(WMS_EXAMPLES[exampleTab].url, WMS_EXAMPLES[exampleTab].name); } }, WMS_EXAMPLES[exampleTab].url)))); }; var _default = exports["default"] = TilesetWMSForm; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX3RhYmxlIiwiX2NvbW1vbiIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl90ZW1wbGF0ZU9iamVjdDUiLCJfdGVtcGxhdGVPYmplY3Q2IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiVGlsZXNldElucHV0Q29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJUaWxlc2V0SW5wdXREZXNjcmlwdGlvbiIsInByb3BzIiwidGhlbWUiLCJBWlVSRTIwMCIsIkV4YW1wbGVVcmxzQ29udGFpbmVyIiwiRXhhbXBsZVRhYnMiLCJFeGFtcGxlVGFiIiwiYWN0aXZlIiwiQVpVUkU0MDAiLCJXSElURSIsIkFaVVJFNTAwIiwiRXhhbXBsZVVybCIsIkFaVVJFMTAwIiwiV01TX0VYQU1QTEVTIiwibGFiZWwiLCJuYW1lIiwidXJsIiwiVGlsZXNldFdNU0Zvcm0iLCJfcmVmIiwic2V0UmVzcG9uc2UiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJsYXllck5hbWUiLCJzZXRMYXllck5hbWUiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsIndtc1VybCIsInNldFdtc1VybCIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwibG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsImVycm9yIiwic2V0RXJyb3IiLCJfdXNlU3RhdGU5IiwiX3VzZVN0YXRlMTAiLCJ3bXNEYXRhIiwic2V0V01TRGF0YSIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJleGFtcGxlVGFiIiwic2V0RXhhbXBsZVRhYiIsIm9uTGF5ZXJOYW1lQ2hhbmdlIiwidXNlQ2FsbGJhY2siLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwidGFyZ2V0IiwidmFsdWUiLCJvbkV4YW1wbGVDbGljayIsIm9uV21zVXJsQ2hhbmdlIiwiX3JlZjIiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIm5ld1dtc1VybCIsImRhdGEiLCJkYXRhc2V0TWV0YWRhdGEiLCJzZXJ2aWNlVGl0bGUiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwidmFsaWRhdGVVcmwiLCJhYnJ1cHQiLCJnZXRXTVNDYXBhYmlsaXRpZXMiLCJzZW50Iiwid21zQ2FwYWJpbGl0aWVzVG9EYXRhc2V0TWV0YWRhdGEiLCJ0aXRsZSIsIm1ldGFkYXRhIiwibGF5ZXJzIiwidmVyc2lvbiIsInQwIiwiRXJyb3IiLCJmaW5pc2giLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsInVzZUVmZmVjdCIsIl93bXNEYXRhJG1ldGFkYXRhIiwiZGF0YXNldCIsInR5cGUiLCJEYXRhc2V0VHlwZSIsIldNU19USUxFIiwiUkVNT1RFX1RJTEUiLCJyZW1vdGVUaWxlRm9ybWF0IiwiUmVtb3RlVGlsZUZvcm1hdCIsIldNUyIsInRpbGVzZXREYXRhVXJsIiwidGlsZXNldE1ldGFkYXRhVXJsIiwiY29uY2F0Iiwid21zVmVyc2lvbiIsImNyZWF0ZUVsZW1lbnQiLCJodG1sRm9yIiwiSW5wdXRMaWdodCIsImlkIiwicGxhY2Vob2xkZXIiLCJvbkNoYW5nZSIsIm1hcCIsImV4Iiwia2V5Iiwib25DbGljayIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RhbHMvdGlsZXNldHMtbW9kYWxzL3RpbGVzZXQtd21zLWZvcm0udHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7V01TQ2FwYWJpbGl0aWVzfSBmcm9tICdAbG9hZGVycy5nbC93bXMnO1xuXG5pbXBvcnQge3ZhbGlkYXRlVXJsfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge0RhdGFzZXRUeXBlLCBSRU1PVEVfVElMRSwgUmVtb3RlVGlsZUZvcm1hdCwgV01TRGF0YXNldE1ldGFkYXRhfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge2dldFdNU0NhcGFiaWxpdGllcywgd21zQ2FwYWJpbGl0aWVzVG9EYXRhc2V0TWV0YWRhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuXG5pbXBvcnQge01ldGFSZXNwb25zZX0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtJbnB1dExpZ2h0fSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5jb25zdCBUaWxlc2V0SW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgzLCBhdXRvKTtcbiAgcm93LWdhcDogMThweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuYDtcblxuY29uc3QgVGlsZXNldElucHV0RGVzY3JpcHRpb24gPSBzdHlsZWQuZGl2YFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLkFaVVJFMjAwfTtcbiAgZm9udC1zaXplOiAxMXB4O1xuYDtcblxuY29uc3QgRXhhbXBsZVVybHNDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5BWlVSRTIwMH07XG4gIGZvbnQtc2l6ZTogMTFweDtcbmA7XG5cbmNvbnN0IEV4YW1wbGVUYWJzID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA2cHg7XG4gIG1hcmdpbi10b3A6IDZweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuYDtcblxuY29uc3QgRXhhbXBsZVRhYiA9IHN0eWxlZC5kaXY8e2FjdGl2ZTogYm9vbGVhbn0+YFxuICBwYWRkaW5nOiAzcHggOHB4O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC1zaXplOiAxMXB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBiYWNrZ3JvdW5kOiAke3Byb3BzID0+IChwcm9wcy5hY3RpdmUgPyBwcm9wcy50aGVtZS5BWlVSRTQwMCA6ICd0cmFuc3BhcmVudCcpfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gKHByb3BzLmFjdGl2ZSA/IHByb3BzLnRoZW1lLldISVRFIDogcHJvcHMudGhlbWUuQVpVUkUyMDApfTtcbiAgYm9yZGVyOiAxcHggc29saWQgJHtwcm9wcyA9PiAocHJvcHMuYWN0aXZlID8gcHJvcHMudGhlbWUuQVpVUkU0MDAgOiBwcm9wcy50aGVtZS5BWlVSRTQwMCl9O1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6ICR7cHJvcHMgPT4gKHByb3BzLmFjdGl2ZSA/IHByb3BzLnRoZW1lLkFaVVJFNDAwIDogcHJvcHMudGhlbWUuQVpVUkU1MDApfTtcbiAgfVxuYDtcblxuY29uc3QgRXhhbXBsZVVybCA9IHN0eWxlZC5kaXZgXG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5BWlVSRTIwMH07XG4gIGZvbnQtc2l6ZTogMTFweDtcblxuICAmOmhvdmVyIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5BWlVSRTEwMH07XG4gIH1cbmA7XG5cbmNvbnN0IFdNU19FWEFNUExFUyA9IFtcbiAge1xuICAgIGxhYmVsOiAnT1NNJyxcbiAgICBuYW1lOiAnT3BlblN0cmVldE1hcCBXTVMnLFxuICAgIHVybDogJ2h0dHBzOi8vb3dzLnRlcnJlc3RyaXMuZGUvb3NtL3NlcnZpY2UnXG4gIH0sXG4gIHtcbiAgICBsYWJlbDogJ05PQUEgUmFkYXInLFxuICAgIG5hbWU6ICdOT0FBIENPTlVTIFJhZGFyJyxcbiAgICB1cmw6ICdodHRwczovL29wZW5nZW8ubmNlcC5ub2FhLmdvdi9nZW9zZXJ2ZXIvY29udXMvY29udXNfY3JlZl9xY2Qvb3dzJ1xuICB9LFxuICB7XG4gICAgbGFiZWw6ICdOQVNBIEdJQlMnLFxuICAgIG5hbWU6ICdOQVNBIEdJQlMnLFxuICAgIHVybDogJ2h0dHBzOi8vZ2licy5lYXJ0aGRhdGEubmFzYS5nb3Yvd21zL2Vwc2c0MzI2L2Jlc3Qvd21zLmNnaSdcbiAgfVxuXTtcblxudHlwZSBXTVNUaWxlRm9ybVByb3BzID0ge1xuICBzZXRSZXNwb25zZTogKHJlc3BvbnNlOiBNZXRhUmVzcG9uc2UpID0+IHZvaWQ7XG59O1xuXG50eXBlIFdNU0RhdGEgPSB7XG4gIG1ldGFkYXRhOiBXTVNDYXBhYmlsaXRpZXMgfCBudWxsO1xuICBsYXllcnM6IFdNU0RhdGFzZXRNZXRhZGF0YVsnbGF5ZXJzJ107XG4gIHZlcnNpb246IHN0cmluZztcbn07XG5cbmNvbnN0IFRpbGVzZXRXTVNGb3JtOiBSZWFjdC5GQzxXTVNUaWxlRm9ybVByb3BzPiA9ICh7c2V0UmVzcG9uc2V9KSA9PiB7XG4gIGNvbnN0IFtsYXllck5hbWUsIHNldExheWVyTmFtZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTtcbiAgY29uc3QgW3dtc1VybCwgc2V0V21zVXJsXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8RXJyb3IgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3dtc0RhdGEsIHNldFdNU0RhdGFdID0gdXNlU3RhdGU8V01TRGF0YSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZXhhbXBsZVRhYiwgc2V0RXhhbXBsZVRhYl0gPSB1c2VTdGF0ZSgwKTtcblxuICBjb25zdCBvbkxheWVyTmFtZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRMYXllck5hbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuICAgIFtzZXRMYXllck5hbWVdXG4gICk7XG5cbiAgY29uc3Qgb25FeGFtcGxlQ2xpY2sgPSB1c2VDYWxsYmFjayhcbiAgICAodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgc2V0V21zVXJsKHVybCk7XG4gICAgICBzZXRMYXllck5hbWUobmFtZSk7XG4gICAgfSxcbiAgICBbc2V0V21zVXJsLCBzZXRMYXllck5hbWVdXG4gICk7XG5cbiAgY29uc3Qgb25XbXNVcmxDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgbmV3V21zVXJsID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgc2V0V21zVXJsKG5ld1dtc1VybCk7XG5cbiAgICAgIGlmICghdmFsaWRhdGVVcmwobmV3V21zVXJsKSkge1xuICAgICAgICBzZXRXTVNEYXRhKG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZldGNoIFdNUyBHZXRDYXBhYmlsaXRpZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRXTVNDYXBhYmlsaXRpZXMobmV3V21zVXJsKTtcblxuICAgICAgICBjb25zdCBkYXRhc2V0TWV0YWRhdGEgPSB3bXNDYXBhYmlsaXRpZXNUb0RhdGFzZXRNZXRhZGF0YShkYXRhKTtcblxuICAgICAgICAvLyBFeHRyYWN0IG5hbWUgb3IgdGl0bGUgZnJvbSBHZXRDYXBhYmlsaXRpZXMgcmVzcG9uc2VcbiAgICAgICAgY29uc3Qgc2VydmljZVRpdGxlID0gZGF0YT8udGl0bGUgfHwgZGF0YT8ubmFtZTtcbiAgICAgICAgaWYgKHNlcnZpY2VUaXRsZSAmJiAhbGF5ZXJOYW1lKSB7XG4gICAgICAgICAgc2V0TGF5ZXJOYW1lKHNlcnZpY2VUaXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRXTVNEYXRhKHtcbiAgICAgICAgICBtZXRhZGF0YTogZGF0YSxcbiAgICAgICAgICBsYXllcnM6IGRhdGFzZXRNZXRhZGF0YS5sYXllcnMsXG4gICAgICAgICAgdmVyc2lvbjogZGF0YXNldE1ldGFkYXRhLnZlcnNpb25cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0RXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoJ1Vua25vd24gZXJyb3InKSk7XG4gICAgICAgIHNldFdNU0RhdGEobnVsbCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtsYXllck5hbWVdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobGF5ZXJOYW1lICYmIHdtc1VybCkge1xuICAgICAgY29uc3QgZGF0YXNldCA9IHtcbiAgICAgICAgbmFtZTogbGF5ZXJOYW1lLFxuICAgICAgICB0eXBlOiBEYXRhc2V0VHlwZS5XTVNfVElMRSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0eXBlOiBSRU1PVEVfVElMRSxcbiAgICAgICAgICByZW1vdGVUaWxlRm9ybWF0OiBSZW1vdGVUaWxlRm9ybWF0LldNUyxcbiAgICAgICAgICB0aWxlc2V0RGF0YVVybDogd21zVXJsLFxuICAgICAgICAgIHRpbGVzZXRNZXRhZGF0YVVybDogYCR7d21zVXJsfT9zZXJ2aWNlPVdNUyZyZXF1ZXN0PUdldENhcGFiaWxpdGllc2AsXG4gICAgICAgICAgbGF5ZXJzOiB3bXNEYXRhPy5sYXllcnMgfHwgW10sXG4gICAgICAgICAgd21zVmVyc2lvbjogd21zRGF0YT8udmVyc2lvbiB8fCAnMS4zLjAnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzZXRSZXNwb25zZSh7XG4gICAgICAgIG1ldGFkYXRhOiB3bXNEYXRhPy5tZXRhZGF0YSA/PyBudWxsLFxuICAgICAgICBkYXRhc2V0LFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBlcnJvclxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFJlc3BvbnNlKHtcbiAgICAgICAgbWV0YWRhdGE6IG51bGwsXG4gICAgICAgIGRhdGFzZXQ6IG51bGwsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIGVycm9yXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtzZXRSZXNwb25zZSwgbGF5ZXJOYW1lLCB3bXNVcmwsIHdtc0RhdGEsIGxvYWRpbmcsIGVycm9yXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8VGlsZXNldElucHV0Q29udGFpbmVyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJsYXllci1uYW1lXCI+TmFtZTwvbGFiZWw+XG4gICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgaWQ9XCJsYXllci1uYW1lXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5hbWUgeW91ciBXTVMgbGF5ZXJcIlxuICAgICAgICAgIHZhbHVlPXtsYXllck5hbWV9XG4gICAgICAgICAgb25DaGFuZ2U9e29uTGF5ZXJOYW1lQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bGFiZWwgaHRtbEZvcj1cIndtcy11cmxcIj5XTVMgVVJMPC9sYWJlbD5cbiAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICBpZD1cIndtcy11cmxcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgV01TIFVSTFwiXG4gICAgICAgICAgdmFsdWU9e3dtc1VybH1cbiAgICAgICAgICBvbkNoYW5nZT17b25XbXNVcmxDaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICAgIDxUaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5Qcm92aWRlIGEgdmFsaWQgV01TIHNlcnZpY2UgVVJMLjwvVGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxUaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5Gb3IgZXhhbXBsZSwgdHJ5IGEgcHVibGljIFdNUyBVUkw6PC9UaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5cbiAgICAgICAgPEV4YW1wbGVVcmxzQ29udGFpbmVyPlxuICAgICAgICAgIDxFeGFtcGxlVGFicz5cbiAgICAgICAgICAgIHtXTVNfRVhBTVBMRVMubWFwKChleCwgaSkgPT4gKFxuICAgICAgICAgICAgICA8RXhhbXBsZVRhYlxuICAgICAgICAgICAgICAgIGtleT17ZXgubGFiZWx9XG4gICAgICAgICAgICAgICAgYWN0aXZlPXtleGFtcGxlVGFiID09PSBpfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIHNldEV4YW1wbGVUYWIoaSk7XG4gICAgICAgICAgICAgICAgICBvbkV4YW1wbGVDbGljayhleC51cmwsIGV4Lm5hbWUpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZXgubGFiZWx9XG4gICAgICAgICAgICAgIDwvRXhhbXBsZVRhYj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvRXhhbXBsZVRhYnM+XG4gICAgICAgICAgPEV4YW1wbGVVcmxcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgIG9uRXhhbXBsZUNsaWNrKFdNU19FWEFNUExFU1tleGFtcGxlVGFiXS51cmwsIFdNU19FWEFNUExFU1tleGFtcGxlVGFiXS5uYW1lKVxuICAgICAgICAgICAgfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtXTVNfRVhBTVBMRVNbZXhhbXBsZVRhYl0udXJsfVxuICAgICAgICAgIDwvRXhhbXBsZVVybD5cbiAgICAgICAgPC9FeGFtcGxlVXJsc0NvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvVGlsZXNldElucHV0Q29udGFpbmVyPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVGlsZXNldFdNU0Zvcm07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFHQSxJQUFBRyxZQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxNQUFBLEdBQUFMLE9BQUE7QUFHQSxJQUFBTSxPQUFBLEdBQUFOLE9BQUE7QUFBd0MsSUFBQU8sZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQVp4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TyxFQUFDO0VBQVMsR0FBQyxTQUFjLENBQUMsZUFDeEMxSSxNQUFBLFlBQUF5SSxhQUFBLENBQUNqSSxPQUFBLENBQUFtSSxVQUFVO0lBQ1RDLEVBQUUsRUFBQyxTQUFTO0lBQ1pDLFdBQVcsRUFBQyxlQUFlO0lBQzNCbkQsS0FBSyxFQUFFdkIsTUFBTztJQUNkMkUsUUFBUSxFQUFFbEQ7RUFBZSxDQUMxQixDQUFDLGVBQ0Y1RixNQUFBLFlBQUF5SSxhQUFBLENBQUNsRyx1QkFBdUIsUUFBQyxrQ0FBeUQsQ0FDL0UsQ0FBQyxlQUNOdkMsTUFBQSxZQUFBeUksYUFBQSwyQkFDRXpJLE1BQUEsWUFBQXlJLGFBQUEsQ0FBQ2xHLHVCQUF1QixRQUFDLG9DQUEyRCxDQUFDLGVBQ3JGdkMsTUFBQSxZQUFBeUksYUFBQSxDQUFDOUYsb0JBQW9CLHFCQUNuQjNDLE1BQUEsWUFBQXlJLGFBQUEsQ0FBQzdGLFdBQVcsUUFDVFEsWUFBWSxDQUFDMkYsR0FBRyxDQUFDLFVBQUNDLEVBQUUsRUFBRS9HLENBQUM7SUFBQSxvQkFDdEJqQyxNQUFBLFlBQUF5SSxhQUFBLENBQUM1RixVQUFVO01BQ1RvRyxHQUFHLEVBQUVELEVBQUUsQ0FBQzNGLEtBQU07TUFDZFAsTUFBTSxFQUFFcUMsVUFBVSxLQUFLbEQsQ0FBRTtNQUN6QmlILE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBLEVBQVE7UUFDYjlELGFBQWEsQ0FBQ25ELENBQUMsQ0FBQztRQUNoQjBELGNBQWMsQ0FBQ3FELEVBQUUsQ0FBQ3pGLEdBQUcsRUFBRXlGLEVBQUUsQ0FBQzFGLElBQUksQ0FBQztNQUNqQztJQUFFLEdBRUQwRixFQUFFLENBQUMzRixLQUNNLENBQUM7RUFBQSxDQUNkLENBQ1UsQ0FBQyxlQUNkckQsTUFBQSxZQUFBeUksYUFBQSxDQUFDdkYsVUFBVTtJQUNUZ0csT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUE7TUFBQSxPQUNMdkQsY0FBYyxDQUFDdkMsWUFBWSxDQUFDK0IsVUFBVSxDQUFDLENBQUM1QixHQUFHLEVBQUVILFlBQVksQ0FBQytCLFVBQVUsQ0FBQyxDQUFDN0IsSUFBSSxDQUFDO0lBQUE7RUFDNUUsR0FFQUYsWUFBWSxDQUFDK0IsVUFBVSxDQUFDLENBQUM1QixHQUNoQixDQUNRLENBQ25CLENBQ2dCLENBQUM7QUFFNUIsQ0FBQztBQUFDLElBQUE0RixRQUFBLEdBQUFDLE9BQUEsY0FFYTVGLGNBQWMiLCJpZ25vcmVMaXN0IjpbXX0=