kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
277 lines (275 loc) • 42.6 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.testForCoordinates = exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
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 _classnames = _interopRequireDefault(require("classnames"));
var _geocoding = _interopRequireDefault(require("@mapbox/mapbox-sdk/services/geocoding"));
var _reactIntl = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-intl");
var _viewportMercatorProject = require("viewport-mercator-project");
var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src");
var _styledComponents2 = require("../common/styled-components");
var _icons = require("../common/icons");
var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src");
var _templateObject; // 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; }
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; }
// matches only valid coordinates
var COORDINATE_REGEX_STRING = '(^[-+]?(?:[1-8]?\\d(?:\\.\\d+)?|90(?:\\.0+)?)),\\s*([-+]?(?:180(?:\\.0+)?|(?:(?:1[0-7]\\d)|(?:[1-9]?\\d))(?:\\.\\d+)?))$';
var COORDINATE_REGEX = RegExp(COORDINATE_REGEX_STRING);
var PLACEHOLDER = 'Enter an address or coordinates, ex 37.79,-122.40';
var debounceTimeout = null;
/**
* Tests if a given query string contains valid coordinates.
* @param query The input string to test for coordinates.
* @returns A tuple where:
* - If valid, returns `[true, longitude, latitude]`.
* - If invalid, returns `[false, query]`.
*/
var testForCoordinates = exports.testForCoordinates = function testForCoordinates(query) {
var isValid = COORDINATE_REGEX.test(query.trim());
if (!isValid) {
return [isValid, query];
}
var tokens = query.trim().split(',');
var latitude = Number(tokens[0]);
var longitude = Number(tokens[1]);
return [isValid, longitude, latitude];
};
var StyledContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n color: ", ";\n\n .geocoder-input {\n box-shadow: ", ";\n\n .geocoder-input__search {\n position: absolute;\n height: ", "px;\n width: 30px;\n padding-left: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ", ";\n }\n\n input {\n padding: 4px 36px;\n height: ", "px;\n caret-color: unset;\n }\n }\n\n .geocoder-results {\n box-shadow: ", ";\n background-color: ", ";\n position: absolute;\n width: ", "px;\n margin-top: ", "px;\n }\n\n .geocoder-item {\n ", ";\n ", ";\n\n &.active {\n background-color: ", ";\n }\n }\n\n .remove-result {\n position: absolute;\n right: 16px;\n top: 0px;\n height: ", "px;\n display: flex;\n align-items: center;\n\n &:hover {\n cursor: pointer;\n color: ", ";\n }\n }\n"])), function (props) {
return props.theme.textColor;
}, function (props) {
return props.theme.boxShadow;
}, function (props) {
return props.theme.geocoderInputHeight;
}, function (props) {
return props.theme.subtextColor;
}, function (props) {
return props.theme.geocoderInputHeight;
}, function (props) {
return props.theme.boxShadow;
}, function (props) {
return props.theme.panelBackground;
}, function (props) {
return Number.isFinite(props.width) ? props.width : props.theme.geocoderWidth;
}, function (props) {
return props.theme.dropdownWapperMargin;
}, function (props) {
return props.theme.dropdownListItem;
}, function (props) {
return props.theme.textTruncate;
}, function (props) {
return props.theme.dropdownListHighlightBg;
}, function (props) {
return props.theme.geocoderInputHeight;
}, function (props) {
return props.theme.textColorHl;
});
var GeoCoder = function GeoCoder(_ref) {
var mapboxApiAccessToken = _ref.mapboxApiAccessToken,
_ref$className = _ref.className,
className = _ref$className === void 0 ? '' : _ref$className,
_ref$limit = _ref.limit,
limit = _ref$limit === void 0 ? 5 : _ref$limit,
_ref$timeout = _ref.timeout,
timeout = _ref$timeout === void 0 ? 300 : _ref$timeout,
_ref$formatItem = _ref.formatItem,
formatItem = _ref$formatItem === void 0 ? function (item) {
return item.place_name;
} : _ref$formatItem,
viewport = _ref.viewport,
onSelected = _ref.onSelected,
onDeleteMarker = _ref.onDeleteMarker,
transitionDuration = _ref.transitionDuration,
pointZoom = _ref.pointZoom,
width = _ref.width,
intl = _ref.intl;
var _useState = (0, _react.useState)(''),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
inputValue = _useState2[0],
setInputValue = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
showResults = _useState4[0],
setShowResults = _useState4[1];
var _useState5 = (0, _react.useState)(false),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
showDelete = _useState6[0],
setShowDelete = _useState6[1];
var initialResults = [];
var _useState7 = (0, _react.useState)(initialResults),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
results = _useState8[0],
setResults = _useState8[1];
var _useState9 = (0, _react.useState)(0),
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
selectedIndex = _useState10[0],
setSelectedIndex = _useState10[1];
var client = (0, _react.useMemo)(function () {
return (0, _src2.isTest)() ? null : (0, _geocoding["default"])({
accessToken: mapboxApiAccessToken
});
}, [mapboxApiAccessToken]);
var onChange = (0, _react.useCallback)(function (event) {
var queryString = event.target.value;
setInputValue(queryString);
var resultCoordinates = testForCoordinates(queryString);
if (resultCoordinates[0]) {
var _resultCoordinates = (0, _slicedToArray2["default"])(resultCoordinates, 3),
_isValid = _resultCoordinates[0],
longitude = _resultCoordinates[1],
latitude = _resultCoordinates[2];
setResults([{
center: [longitude, latitude],
place_name: queryString
}]);
} else {
if (debounceTimeout) {
clearTimeout(debounceTimeout);
}
debounceTimeout = setTimeout( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var response;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!(limit > 0 && Boolean(queryString))) {
_context.next = 11;
break;
}
_context.prev = 1;
_context.next = 4;
return client.forwardGeocode({
query: queryString,
limit: limit
}).send();
case 4:
response = _context.sent;
if (response.body.features) {
setShowResults(true);
setResults(response.body.features);
}
_context.next = 11;
break;
case 8:
_context.prev = 8;
_context.t0 = _context["catch"](1);
// TODO: show geocode error
// eslint-disable-next-line no-console
console.log(_context.t0);
case 11:
case "end":
return _context.stop();
}
}, _callee, null, [[1, 8]]);
})), timeout);
}
}, [client, limit, timeout, setResults, setShowResults]);
var onBlur = (0, _react.useCallback)(function () {
setTimeout(function () {
setShowResults(false);
}, timeout);
}, [setShowResults, timeout]);
var onFocus = (0, _react.useCallback)(function () {
return setShowResults(true);
}, [setShowResults]);
var onItemSelected = (0, _react.useCallback)(function (item) {
var newViewport = new _viewportMercatorProject.WebMercatorViewport(viewport);
var bbox = item.bbox,
center = item.center;
var gotoViewport = bbox ? newViewport.fitBounds([[bbox[0], bbox[1]], [bbox[2], bbox[3]]]) : {
longitude: center[0],
latitude: center[1],
zoom: pointZoom
};
var longitude = gotoViewport.longitude,
latitude = gotoViewport.latitude,
zoom = gotoViewport.zoom;
onSelected(_objectSpread(_objectSpread({}, viewport), {
longitude: longitude,
latitude: latitude,
zoom: zoom,
transitionDuration: transitionDuration
}), item);
setShowResults(false);
setInputValue(formatItem(item));
setShowDelete(true);
}, [viewport, onSelected, transitionDuration, pointZoom, formatItem]);
var onMarkDeleted = (0, _react.useCallback)(function () {
setShowDelete(false);
setInputValue('');
onDeleteMarker === null || onDeleteMarker === void 0 || onDeleteMarker();
}, [onDeleteMarker]);
var onKeyDown = (0, _react.useCallback)(function (e) {
if (!results || results.length === 0) {
return;
}
switch (e.keyCode) {
case _src.KeyEvent.DOM_VK_UP:
setSelectedIndex(selectedIndex > 0 ? selectedIndex - 1 : selectedIndex);
break;
case _src.KeyEvent.DOM_VK_DOWN:
setSelectedIndex(selectedIndex < results.length - 1 ? selectedIndex + 1 : selectedIndex);
break;
case _src.KeyEvent.DOM_VK_ENTER:
case _src.KeyEvent.DOM_VK_RETURN:
if (results[selectedIndex]) {
onItemSelected(results[selectedIndex]);
}
break;
default:
break;
}
}, [results, selectedIndex, setSelectedIndex, onItemSelected]);
return /*#__PURE__*/_react["default"].createElement(StyledContainer, {
className: className,
width: width
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "geocoder-input"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "geocoder-input__search"
}, /*#__PURE__*/_react["default"].createElement(_icons.Search, {
height: "20px"
})), /*#__PURE__*/_react["default"].createElement(_styledComponents2.Input, {
type: "text",
onChange: onChange,
onBlur: onBlur,
onFocus: onFocus,
onKeyDown: onKeyDown,
value: inputValue,
placeholder: intl ? intl.formatMessage({
id: 'geocoder.title',
defaultMessage: PLACEHOLDER
}) : PLACEHOLDER
}), showDelete ? /*#__PURE__*/_react["default"].createElement("div", {
className: "remove-result"
}, /*#__PURE__*/_react["default"].createElement(_icons.Delete, {
height: "16px",
onClick: onMarkDeleted
})) : null), showResults ? /*#__PURE__*/_react["default"].createElement("div", {
className: "geocoder-results"
}, results.map(function (item, index) {
return /*#__PURE__*/_react["default"].createElement("div", {
key: index,
className: (0, _classnames["default"])('geocoder-item', {
active: selectedIndex === index
}),
onClick: function onClick() {
return onItemSelected(item);
}
}, formatItem(item));
})) : null);
};
var _default = exports["default"] = (0, _reactIntl.injectIntl)(GeoCoder);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl9nZW9jb2RpbmciLCJfcmVhY3RJbnRsIiwiX3ZpZXdwb3J0TWVyY2F0b3JQcm9qZWN0IiwiX3NyYyIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9pY29ucyIsIl9zcmMyIiwiX3RlbXBsYXRlT2JqZWN0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiQ09PUkRJTkFURV9SRUdFWF9TVFJJTkciLCJDT09SRElOQVRFX1JFR0VYIiwiUmVnRXhwIiwiUExBQ0VIT0xERVIiLCJkZWJvdW5jZVRpbWVvdXQiLCJ0ZXN0Rm9yQ29vcmRpbmF0ZXMiLCJleHBvcnRzIiwicXVlcnkiLCJpc1ZhbGlkIiwidGVzdCIsInRyaW0iLCJ0b2tlbnMiLCJzcGxpdCIsImxhdGl0dWRlIiwiTnVtYmVyIiwibG9uZ2l0dWRlIiwiU3R5bGVkQ29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwidGV4dENvbG9yIiwiYm94U2hhZG93IiwiZ2VvY29kZXJJbnB1dEhlaWdodCIsInN1YnRleHRDb2xvciIsInBhbmVsQmFja2dyb3VuZCIsImlzRmluaXRlIiwid2lkdGgiLCJnZW9jb2RlcldpZHRoIiwiZHJvcGRvd25XYXBwZXJNYXJnaW4iLCJkcm9wZG93bkxpc3RJdGVtIiwidGV4dFRydW5jYXRlIiwiZHJvcGRvd25MaXN0SGlnaGxpZ2h0QmciLCJ0ZXh0Q29sb3JIbCIsIkdlb0NvZGVyIiwiX3JlZiIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwiX3JlZiRjbGFzc05hbWUiLCJjbGFzc05hbWUiLCJfcmVmJGxpbWl0IiwibGltaXQiLCJfcmVmJHRpbWVvdXQiLCJ0aW1lb3V0IiwiX3JlZiRmb3JtYXRJdGVtIiwiZm9ybWF0SXRlbSIsIml0ZW0iLCJwbGFjZV9uYW1lIiwidmlld3BvcnQiLCJvblNlbGVjdGVkIiwib25EZWxldGVNYXJrZXIiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJwb2ludFpvb20iLCJpbnRsIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwiaW5wdXRWYWx1ZSIsInNldElucHV0VmFsdWUiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsInNob3dSZXN1bHRzIiwic2V0U2hvd1Jlc3VsdHMiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsInNob3dEZWxldGUiLCJzZXRTaG93RGVsZXRlIiwiaW5pdGlhbFJlc3VsdHMiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInJlc3VsdHMiLCJzZXRSZXN1bHRzIiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTEwIiwic2VsZWN0ZWRJbmRleCIsInNldFNlbGVjdGVkSW5kZXgiLCJjbGllbnQiLCJ1c2VNZW1vIiwiaXNUZXN0IiwiZ2VvY29kZXJTZXJ2aWNlIiwiYWNjZXNzVG9rZW4iLCJvbkNoYW5nZSIsInVzZUNhbGxiYWNrIiwiZXZlbnQiLCJxdWVyeVN0cmluZyIsInRhcmdldCIsInZhbHVlIiwicmVzdWx0Q29vcmRpbmF0ZXMiLCJfcmVzdWx0Q29vcmRpbmF0ZXMiLCJfaXNWYWxpZCIsImNlbnRlciIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInJlc3BvbnNlIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIkJvb2xlYW4iLCJmb3J3YXJkR2VvY29kZSIsInNlbmQiLCJzZW50IiwiYm9keSIsImZlYXR1cmVzIiwidDAiLCJjb25zb2xlIiwibG9nIiwic3RvcCIsIm9uQmx1ciIsIm9uRm9jdXMiLCJvbkl0ZW1TZWxlY3RlZCIsIm5ld1ZpZXdwb3J0IiwiV2ViTWVyY2F0b3JWaWV3cG9ydCIsImJib3giLCJnb3RvVmlld3BvcnQiLCJmaXRCb3VuZHMiLCJ6b29tIiwib25NYXJrRGVsZXRlZCIsIm9uS2V5RG93biIsImtleUNvZGUiLCJLZXlFdmVudCIsIkRPTV9WS19VUCIsIkRPTV9WS19ET1dOIiwiRE9NX1ZLX0VOVEVSIiwiRE9NX1ZLX1JFVFVSTiIsImNyZWF0ZUVsZW1lbnQiLCJTZWFyY2giLCJoZWlnaHQiLCJJbnB1dCIsInR5cGUiLCJwbGFjZWhvbGRlciIsImZvcm1hdE1lc3NhZ2UiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwiRGVsZXRlIiwib25DbGljayIsIm1hcCIsImluZGV4Iiwia2V5IiwiY2xhc3NuYW1lcyIsImFjdGl2ZSIsIl9kZWZhdWx0IiwiaW5qZWN0SW50bCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NyYy9nZW9jb2Rlci9nZW9jb2Rlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGdlb2NvZGVyU2VydmljZSBmcm9tICdAbWFwYm94L21hcGJveC1zZGsvc2VydmljZXMvZ2VvY29kaW5nJztcbmltcG9ydCB7aW5qZWN0SW50bCwgSW50bFNoYXBlfSBmcm9tICdyZWFjdC1pbnRsJztcbmltcG9ydCB7V2ViTWVyY2F0b3JWaWV3cG9ydH0gZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQge0tleUV2ZW50fSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0lucHV0fSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtTZWFyY2gsIERlbGV0ZX0gZnJvbSAnLi4vY29tbW9uL2ljb25zJztcbmltcG9ydCB7Vmlld3BvcnR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtpc1Rlc3R9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG50eXBlIFN0eWxlZENvbnRhaW5lclByb3BzID0ge1xuICB3aWR0aD86IG51bWJlcjtcbn07XG5cbi8vIG1hdGNoZXMgb25seSB2YWxpZCBjb29yZGluYXRlc1xuY29uc3QgQ09PUkRJTkFURV9SRUdFWF9TVFJJTkcgPVxuICAnKF5bLStdPyg/OlsxLThdP1xcXFxkKD86XFxcXC5cXFxcZCspP3w5MCg/OlxcXFwuMCspPykpLFxcXFxzKihbLStdPyg/OjE4MCg/OlxcXFwuMCspP3woPzooPzoxWzAtN11cXFxcZCl8KD86WzEtOV0/XFxcXGQpKSg/OlxcXFwuXFxcXGQrKT8pKSQnO1xuXG5jb25zdCBDT09SRElOQVRFX1JFR0VYID0gUmVnRXhwKENPT1JESU5BVEVfUkVHRVhfU1RSSU5HKTtcblxuY29uc3QgUExBQ0VIT0xERVIgPSAnRW50ZXIgYW4gYWRkcmVzcyBvciBjb29yZGluYXRlcywgZXggMzcuNzksLTEyMi40MCc7XG5cbmxldCBkZWJvdW5jZVRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogVGVzdHMgaWYgYSBnaXZlbiBxdWVyeSBzdHJpbmcgY29udGFpbnMgdmFsaWQgY29vcmRpbmF0ZXMuXG4gKiBAcGFyYW0gcXVlcnkgVGhlIGlucHV0IHN0cmluZyB0byB0ZXN0IGZvciBjb29yZGluYXRlcy5cbiAqIEByZXR1cm5zIEEgdHVwbGUgd2hlcmU6XG4gKiAgIC0gSWYgdmFsaWQsIHJldHVybnMgYFt0cnVlLCBsb25naXR1ZGUsIGxhdGl0dWRlXWAuXG4gKiAgIC0gSWYgaW52YWxpZCwgcmV0dXJucyBgW2ZhbHNlLCBxdWVyeV1gLlxuICovXG5leHBvcnQgY29uc3QgdGVzdEZvckNvb3JkaW5hdGVzID0gKHF1ZXJ5OiBzdHJpbmcpOiBbdHJ1ZSwgbnVtYmVyLCBudW1iZXJdIHwgW2ZhbHNlLCBzdHJpbmddID0+IHtcbiAgY29uc3QgaXNWYWxpZCA9IENPT1JESU5BVEVfUkVHRVgudGVzdChxdWVyeS50cmltKCkpO1xuXG4gIGlmICghaXNWYWxpZCkge1xuICAgIHJldHVybiBbaXNWYWxpZCwgcXVlcnldO1xuICB9XG5cbiAgY29uc3QgdG9rZW5zID0gcXVlcnkudHJpbSgpLnNwbGl0KCcsJyk7XG4gIGNvbnN0IGxhdGl0dWRlID0gTnVtYmVyKHRva2Vuc1swXSk7XG4gIGNvbnN0IGxvbmdpdHVkZSA9IE51bWJlcih0b2tlbnNbMV0pO1xuXG4gIHJldHVybiBbaXNWYWxpZCwgbG9uZ2l0dWRlLCBsYXRpdHVkZV07XG59O1xuXG5jb25zdCBTdHlsZWRDb250YWluZXIgPSBzdHlsZWQuZGl2PFN0eWxlZENvbnRhaW5lclByb3BzPmBcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3J9O1xuXG4gIC5nZW9jb2Rlci1pbnB1dCB7XG4gICAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ib3hTaGFkb3d9O1xuXG4gICAgLmdlb2NvZGVyLWlucHV0X19zZWFyY2gge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmdlb2NvZGVySW5wdXRIZWlnaHR9cHg7XG4gICAgICB3aWR0aDogMzBweDtcbiAgICAgIHBhZGRpbmctbGVmdDogNnB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnN1YnRleHRDb2xvcn07XG4gICAgfVxuXG4gICAgaW5wdXQge1xuICAgICAgcGFkZGluZzogNHB4IDM2cHg7XG4gICAgICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZ2VvY29kZXJJbnB1dEhlaWdodH1weDtcbiAgICAgIGNhcmV0LWNvbG9yOiB1bnNldDtcbiAgICB9XG4gIH1cblxuICAuZ2VvY29kZXItcmVzdWx0cyB7XG4gICAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ib3hTaGFkb3d9O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6ICR7cHJvcHMgPT4gKE51bWJlci5pc0Zpbml0ZShwcm9wcy53aWR0aCkgPyBwcm9wcy53aWR0aCA6IHByb3BzLnRoZW1lLmdlb2NvZGVyV2lkdGgpfXB4O1xuICAgIG1hcmdpbi10b3A6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZHJvcGRvd25XYXBwZXJNYXJnaW59cHg7XG4gIH1cblxuICAuZ2VvY29kZXItaXRlbSB7XG4gICAgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RJdGVtfTtcbiAgICAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRUcnVuY2F0ZX07XG5cbiAgICAmLmFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duTGlzdEhpZ2hsaWdodEJnfTtcbiAgICB9XG4gIH1cblxuICAucmVtb3ZlLXJlc3VsdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxNnB4O1xuICAgIHRvcDogMHB4O1xuICAgIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5nZW9jb2RlcklucHV0SGVpZ2h0fXB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgICY6aG92ZXIge1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIH1cbiAgfVxuYDtcblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bHQge1xuICBjZW50ZXI6IFtudW1iZXIsIG51bWJlcl07XG4gIHBsYWNlX25hbWU6IHN0cmluZztcbiAgYmJveD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICB0ZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSZXN1bHRzID0gUmVhZG9ubHlBcnJheTxSZXN1bHQ+O1xuXG50eXBlIEdlb2NvZGVyUHJvcHMgPSB7XG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGZvcm1hdEl0ZW0/OiAoaXRlbTogUmVzdWx0KSA9PiBzdHJpbmc7XG4gIHZpZXdwb3J0PzogVmlld3BvcnQ7XG4gIG9uU2VsZWN0ZWQ6ICh2aWV3cG9ydDogVmlld3BvcnQgfCBudWxsLCBpdGVtOiBSZXN1bHQpID0+IHZvaWQ7XG4gIG9uRGVsZXRlTWFya2VyPzogKCkgPT4gdm9pZDtcbiAgdHJhbnNpdGlvbkR1cmF0aW9uPzogbnVtYmVyO1xuICBwb2ludFpvb20/OiBudW1iZXI7XG4gIHdpZHRoPzogbnVtYmVyO1xufTtcblxudHlwZSBJbnRsUHJvcHMgPSB7XG4gIGludGw6IEludGxTaGFwZTtcbn07XG5cbmNvbnN0IEdlb0NvZGVyOiBSZWFjdC5GQzxHZW9jb2RlclByb3BzICYgSW50bFByb3BzPiA9ICh7XG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICBjbGFzc05hbWUgPSAnJyxcbiAgbGltaXQgPSA1LFxuICB0aW1lb3V0ID0gMzAwLFxuICBmb3JtYXRJdGVtID0gaXRlbSA9PiBpdGVtLnBsYWNlX25hbWUsXG4gIHZpZXdwb3J0LFxuICBvblNlbGVjdGVkLFxuICBvbkRlbGV0ZU1hcmtlcixcbiAgdHJhbnNpdGlvbkR1cmF0aW9uLFxuICBwb2ludFpvb20sXG4gIHdpZHRoLFxuICBpbnRsXG59KSA9PiB7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW3Nob3dSZXN1bHRzLCBzZXRTaG93UmVzdWx0c10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzaG93RGVsZXRlLCBzZXRTaG93RGVsZXRlXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgaW5pdGlhbFJlc3VsdHM6IFJlc3VsdFtdID0gW107XG4gIGNvbnN0IFtyZXN1bHRzLCBzZXRSZXN1bHRzXSA9IHVzZVN0YXRlKGluaXRpYWxSZXN1bHRzKTtcbiAgY29uc3QgW3NlbGVjdGVkSW5kZXgsIHNldFNlbGVjdGVkSW5kZXhdID0gdXNlU3RhdGUoMCk7XG5cbiAgY29uc3QgY2xpZW50ID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoaXNUZXN0KCkgPyBudWxsIDogZ2VvY29kZXJTZXJ2aWNlKHthY2Nlc3NUb2tlbjogbWFwYm94QXBpQWNjZXNzVG9rZW59KSksXG4gICAgW21hcGJveEFwaUFjY2Vzc1Rva2VuXVxuICApO1xuXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICBzZXRJbnB1dFZhbHVlKHF1ZXJ5U3RyaW5nKTtcbiAgICAgIGNvbnN0IHJlc3VsdENvb3JkaW5hdGVzID0gdGVzdEZvckNvb3JkaW5hdGVzKHF1ZXJ5U3RyaW5nKTtcbiAgICAgIGlmIChyZXN1bHRDb29yZGluYXRlc1swXSkge1xuICAgICAgICBjb25zdCBbX2lzVmFsaWQsIGxvbmdpdHVkZSwgbGF0aXR1ZGVdID0gcmVzdWx0Q29vcmRpbmF0ZXM7XG4gICAgICAgIHNldFJlc3VsdHMoW3tjZW50ZXI6IFtsb25naXR1ZGUsIGxhdGl0dWRlXSwgcGxhY2VfbmFtZTogcXVlcnlTdHJpbmd9XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGVib3VuY2VUaW1lb3V0KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVib3VuY2VUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKGxpbWl0ID4gMCAmJiBCb29sZWFuKHF1ZXJ5U3RyaW5nKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnRcbiAgICAgICAgICAgICAgICAuZm9yd2FyZEdlb2NvZGUoe1xuICAgICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5U3RyaW5nLFxuICAgICAgICAgICAgICAgICAgbGltaXRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zZW5kKCk7XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZS5ib2R5LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgc2V0U2hvd1Jlc3VsdHModHJ1ZSk7XG4gICAgICAgICAgICAgICAgc2V0UmVzdWx0cyhyZXNwb25zZS5ib2R5LmZlYXR1cmVzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBzaG93IGdlb2NvZGUgZXJyb3JcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtjbGllbnQsIGxpbWl0LCB0aW1lb3V0LCBzZXRSZXN1bHRzLCBzZXRTaG93UmVzdWx0c11cbiAgKTtcblxuICBjb25zdCBvbkJsdXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzZXRTaG93UmVzdWx0cyhmYWxzZSk7XG4gICAgfSwgdGltZW91dCk7XG4gIH0sIFtzZXRTaG93UmVzdWx0cywgdGltZW91dF0pO1xuXG4gIGNvbnN0IG9uRm9jdXMgPSB1c2VDYWxsYmFjaygoKSA9PiBzZXRTaG93UmVzdWx0cyh0cnVlKSwgW3NldFNob3dSZXN1bHRzXSk7XG5cbiAgY29uc3Qgb25JdGVtU2VsZWN0ZWQgPSB1c2VDYWxsYmFjayhcbiAgICBpdGVtID0+IHtcbiAgICAgIGNvbnN0IG5ld1ZpZXdwb3J0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQodmlld3BvcnQpO1xuICAgICAgY29uc3Qge2Jib3gsIGNlbnRlcn0gPSBpdGVtO1xuXG4gICAgICBjb25zdCBnb3RvVmlld3BvcnQgPSBiYm94XG4gICAgICAgID8gbmV3Vmlld3BvcnQuZml0Qm91bmRzKFtcbiAgICAgICAgICAgIFtiYm94WzBdLCBiYm94WzFdXSxcbiAgICAgICAgICAgIFtiYm94WzJdLCBiYm94WzNdXVxuICAgICAgICAgIF0pXG4gICAgICAgIDoge1xuICAgICAgICAgICAgbG9uZ2l0dWRlOiBjZW50ZXJbMF0sXG4gICAgICAgICAgICBsYXRpdHVkZTogY2VudGVyWzFdLFxuICAgICAgICAgICAgem9vbTogcG9pbnRab29tXG4gICAgICAgICAgfTtcblxuICAgICAgY29uc3Qge2xvbmdpdHVkZSwgbGF0aXR1ZGUsIHpvb219ID0gZ290b1ZpZXdwb3J0O1xuXG4gICAgICBvblNlbGVjdGVkKHsuLi52aWV3cG9ydCwgLi4ue2xvbmdpdHVkZSwgbGF0aXR1ZGUsIHpvb20sIHRyYW5zaXRpb25EdXJhdGlvbn19LCBpdGVtKTtcblxuICAgICAgc2V0U2hvd1Jlc3VsdHMoZmFsc2UpO1xuICAgICAgc2V0SW5wdXRWYWx1ZShmb3JtYXRJdGVtKGl0ZW0pKTtcbiAgICAgIHNldFNob3dEZWxldGUodHJ1ZSk7XG4gICAgfSxcbiAgICBbdmlld3BvcnQsIG9uU2VsZWN0ZWQsIHRyYW5zaXRpb25EdXJhdGlvbiwgcG9pbnRab29tLCBmb3JtYXRJdGVtXVxuICApO1xuXG4gIGNvbnN0IG9uTWFya0RlbGV0ZWQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2hvd0RlbGV0ZShmYWxzZSk7XG4gICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgb25EZWxldGVNYXJrZXI/LigpO1xuICB9LCBbb25EZWxldGVNYXJrZXJdKTtcblxuICBjb25zdCBvbktleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICBlID0+IHtcbiAgICAgIGlmICghcmVzdWx0cyB8fCByZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgICBjYXNlIEtleUV2ZW50LkRPTV9WS19VUDpcbiAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KHNlbGVjdGVkSW5kZXggPiAwID8gc2VsZWN0ZWRJbmRleCAtIDEgOiBzZWxlY3RlZEluZGV4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlFdmVudC5ET01fVktfRE9XTjpcbiAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KHNlbGVjdGVkSW5kZXggPCByZXN1bHRzLmxlbmd0aCAtIDEgPyBzZWxlY3RlZEluZGV4ICsgMSA6IHNlbGVjdGVkSW5kZXgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUV2ZW50LkRPTV9WS19FTlRFUjpcbiAgICAgICAgY2FzZSBLZXlFdmVudC5ET01fVktfUkVUVVJOOlxuICAgICAgICAgIGlmIChyZXN1bHRzW3NlbGVjdGVkSW5kZXhdKSB7XG4gICAgICAgICAgICBvbkl0ZW1TZWxlY3RlZChyZXN1bHRzW3NlbGVjdGVkSW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSxcbiAgICBbcmVzdWx0cywgc2VsZWN0ZWRJbmRleCwgc2V0U2VsZWN0ZWRJbmRleCwgb25JdGVtU2VsZWN0ZWRdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkQ29udGFpbmVyIGNsYXNzTmFtZT17Y2xhc3NOYW1lfSB3aWR0aD17d2lkdGh9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJnZW9jb2Rlci1pbnB1dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdlb2NvZGVyLWlucHV0X19zZWFyY2hcIj5cbiAgICAgICAgICA8U2VhcmNoIGhlaWdodD1cIjIwcHhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPElucHV0XG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICBvbkJsdXI9e29uQmx1cn1cbiAgICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICAgIHZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcbiAgICAgICAgICAgIGludGxcbiAgICAgICAgICAgICAgPyBpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnZ2VvY29kZXIudGl0bGUnLCBkZWZhdWx0TWVzc2FnZTogUExBQ0VIT0xERVJ9KVxuICAgICAgICAgICAgICA6IFBMQUNFSE9MREVSXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgICB7c2hvd0RlbGV0ZSA/IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbW92ZS1yZXN1bHRcIj5cbiAgICAgICAgICAgIDxEZWxldGUgaGVpZ2h0PVwiMTZweFwiIG9uQ2xpY2s9e29uTWFya0RlbGV0ZWR9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtzaG93UmVzdWx0cyA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnZW9jb2Rlci1yZXN1bHRzXCI+XG4gICAgICAgICAge3Jlc3VsdHMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ2dlb2NvZGVyLWl0ZW0nLCB7YWN0aXZlOiBzZWxlY3RlZEluZGV4ID09PSBpbmRleH0pfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkl0ZW1TZWxlY3RlZChpdGVtKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2Zvcm1hdEl0ZW0oaXRlbSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogbnVsbH1cbiAgICA8L1N0eWxlZENvbnRhaW5lcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoR2VvQ29kZXIpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMs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