UNPKG

kepler.gl

Version:

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

202 lines (195 loc) 30.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AiAssistantComponent = AiAssistantComponent; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _reactRedux = require("react-redux"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _styles = require("@kepler.gl/styles"); var _core = require("@openassistant/core"); var _ui = require("@openassistant/ui"); require("@openassistant/echarts/dist/index.css"); require("@openassistant/ui/dist/index.css"); var _actions = require("../actions"); var _constants = require("../constants"); var _utils = require("../tools/utils"); var _tools = require("../tools/tools"); 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; } var StyledAiAssistantComponent = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n height: 100%;\n padding-bottom: 4px;\n\n * {\n font-size: 11px;\n }\n"]))); function AiAssistantComponent() { var visState = (0, _reactRedux.useSelector)(function (state) { return state.demo.keplerGl.map.visState; }); var aiAssistant = (0, _reactRedux.useSelector)(function (state) { return state.demo.aiAssistant; }); var dispatch = (0, _reactRedux.useDispatch)(); // define LLM functions var tools = (0, _tools.setupLLMTools)({ visState: visState, aiAssistant: aiAssistant, dispatch: dispatch }); // enable voice and screen capture var enableVoiceAndScreenCapture = (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.provider) === 'openai' || (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.provider) === 'google' || false; // define assistant props var assistantProps = { name: _constants.ASSISTANT_NAME, description: _constants.ASSISTANT_DESCRIPTION, version: _constants.ASSISTANT_VERSION, modelProvider: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.provider) || '', model: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.model) || '', apiKey: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.apiKey) || '', baseUrl: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.baseUrl) || '', tools: tools }; var _useState = (0, _react.useState)(''), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), datasetMetaData = _useState2[0], setDatasetMetaData = _useState2[1]; var _useState3 = (0, _react.useState)([]), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), ideas = _useState4[0], setIdeas = _useState4[1]; var _useState5 = (0, _react.useState)(0), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), restartKey = _useState6[0], setRestartKey = _useState6[1]; // get dataset meta data and re-initialize assistant when datasets or layers change (0, _react.useEffect)(function () { var metaData = (0, _utils.getDatasetContext)(visState === null || visState === void 0 ? void 0 : visState.datasets, (visState === null || visState === void 0 ? void 0 : visState.layers) || []); setDatasetMetaData(metaData); // eslint-disable-next-line react-hooks/exhaustive-deps }, [visState === null || visState === void 0 ? void 0 : visState.datasets, visState === null || visState === void 0 ? void 0 : visState.layers]); // use dataset meta data in LLM instructions var instructions = "".concat(_constants.INSTRUCTIONS, "\n\n").concat(datasetMetaData); // generate ideas from LLM var _useAssistant = (0, _core.useAssistant)(_objectSpread(_objectSpread({}, assistantProps), {}, { instructions: instructions })), temporaryPrompt = _useAssistant.temporaryPrompt, libraryRestartChat = _useAssistant.restartChat; var restartChatRef = (0, _react.useRef)(libraryRestartChat); restartChatRef.current = libraryRestartChat; var generateIdeas = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var response, match, json; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return temporaryPrompt({ prompt: _constants.PROMPT_IDEAS, temperature: 1.0 }); case 3: response = _context.sent; // find [{},{}...] in the text and parse it as json, handling whitespace match = response === null || response === void 0 ? void 0 : response.match(/\[\s*\{[\s\S]*\}\s*\]/); if (match) { json = JSON.parse(match[0]); setIdeas(json); } _context.next = 11; break; case 8: _context.prev = 8; _context.t0 = _context["catch"](0); console.error('Error generating ideas', _context.t0); case 11: case "end": return _context.stop(); } }, _callee, null, [[0, 8]]); })); return function generateIdeas() { return _ref.apply(this, arguments); }; }(); (0, _react.useEffect)(function () { // get ideas UI component if (ideas.length === 0 && datasetMetaData.length > 0) { generateIdeas(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [datasetMetaData]); var onRestartAssistant = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() { return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: dispatch((0, _actions.updateAiAssistantMessages)([])); _context2.prev = 1; _context2.next = 4; return restartChatRef.current(); case 4: _context2.next = 9; break; case 6: _context2.prev = 6; _context2.t0 = _context2["catch"](1); console.error('Error restarting chat:', _context2.t0); case 9: setRestartKey(function (prev) { return prev + 1; }); case 10: case "end": return _context2.stop(); } }, _callee2, null, [[1, 6]]); })); return function onRestartAssistant() { return _ref2.apply(this, arguments); }; }(); var onMessagesUpdated = function onMessagesUpdated(messages) { dispatch((0, _actions.updateAiAssistantMessages)(messages)); }; var onScreenshotClick = function onScreenshotClick() { dispatch((0, _actions.setStartScreenCapture)(true)); }; var onRemoveScreenshot = function onRemoveScreenshot() { dispatch((0, _actions.setScreenCaptured)('')); }; return /*#__PURE__*/_react["default"].createElement(StyledAiAssistantComponent, { className: "ai-assistant-component" }, /*#__PURE__*/_react["default"].createElement(_ui.AiAssistant, (0, _extends2["default"])({ key: restartKey }, assistantProps, { instructions: instructions, theme: _styles.theme.textColor === _styles.textColorLT ? 'light' : 'dark', welcomeMessage: _constants.WELCOME_MESSAGE, temperature: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.temperature) || 0, topP: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.topP) || 0, initialMessages: aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.messages, onMessagesUpdated: onMessagesUpdated, enableVoice: enableVoiceAndScreenCapture, enableScreenCapture: enableVoiceAndScreenCapture, onScreenshotClick: onScreenshotClick, screenCapturedBase64: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.screenshotToAsk.screenCaptured) || '', onRemoveScreenshot: onRemoveScreenshot, onRestartChat: onRestartAssistant, fontSize: 'text-tiny', botMessageClassName: '', githubIssueLink: 'https://github.com/keplergl/kepler.gl/issues', ideas: ideas, onRefreshIdeas: generateIdeas }))); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl9zdHlsZWRDb21wb25lbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zdHlsZXMiLCJfY29yZSIsIl91aSIsIl9hY3Rpb25zIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl90b29scyIsIl90ZW1wbGF0ZU9iamVjdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlN0eWxlZEFpQXNzaXN0YW50Q29tcG9uZW50Iiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJBaUFzc2lzdGFudENvbXBvbmVudCIsInZpc1N0YXRlIiwidXNlU2VsZWN0b3IiLCJzdGF0ZSIsImRlbW8iLCJrZXBsZXJHbCIsIm1hcCIsImFpQXNzaXN0YW50IiwiZGlzcGF0Y2giLCJ1c2VEaXNwYXRjaCIsInRvb2xzIiwic2V0dXBMTE1Ub29scyIsImVuYWJsZVZvaWNlQW5kU2NyZWVuQ2FwdHVyZSIsImNvbmZpZyIsInByb3ZpZGVyIiwiYXNzaXN0YW50UHJvcHMiLCJuYW1lIiwiQVNTSVNUQU5UX05BTUUiLCJkZXNjcmlwdGlvbiIsIkFTU0lTVEFOVF9ERVNDUklQVElPTiIsInZlcnNpb24iLCJBU1NJU1RBTlRfVkVSU0lPTiIsIm1vZGVsUHJvdmlkZXIiLCJtb2RlbCIsImFwaUtleSIsImJhc2VVcmwiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJkYXRhc2V0TWV0YURhdGEiLCJzZXREYXRhc2V0TWV0YURhdGEiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImlkZWFzIiwic2V0SWRlYXMiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsInJlc3RhcnRLZXkiLCJzZXRSZXN0YXJ0S2V5IiwidXNlRWZmZWN0IiwibWV0YURhdGEiLCJnZXREYXRhc2V0Q29udGV4dCIsImRhdGFzZXRzIiwibGF5ZXJzIiwiaW5zdHJ1Y3Rpb25zIiwiY29uY2F0IiwiSU5TVFJVQ1RJT05TIiwiX3VzZUFzc2lzdGFudCIsInVzZUFzc2lzdGFudCIsInRlbXBvcmFyeVByb21wdCIsImxpYnJhcnlSZXN0YXJ0Q2hhdCIsInJlc3RhcnRDaGF0IiwicmVzdGFydENoYXRSZWYiLCJ1c2VSZWYiLCJjdXJyZW50IiwiZ2VuZXJhdGVJZGVhcyIsIl9yZWYiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInJlc3BvbnNlIiwibWF0Y2giLCJqc29uIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInByb21wdCIsIlBST01QVF9JREVBUyIsInRlbXBlcmF0dXJlIiwic2VudCIsIkpTT04iLCJwYXJzZSIsInQwIiwiY29uc29sZSIsImVycm9yIiwic3RvcCIsIm9uUmVzdGFydEFzc2lzdGFudCIsIl9yZWYyIiwiX2NhbGxlZTIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJ1cGRhdGVBaUFzc2lzdGFudE1lc3NhZ2VzIiwib25NZXNzYWdlc1VwZGF0ZWQiLCJtZXNzYWdlcyIsIm9uU2NyZWVuc2hvdENsaWNrIiwic2V0U3RhcnRTY3JlZW5DYXB0dXJlIiwib25SZW1vdmVTY3JlZW5zaG90Iiwic2V0U2NyZWVuQ2FwdHVyZWQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiQWlBc3Npc3RhbnQiLCJfZXh0ZW5kczIiLCJrZXkiLCJ0aGVtZSIsInRleHRDb2xvciIsInRleHRDb2xvckxUIiwid2VsY29tZU1lc3NhZ2UiLCJXRUxDT01FX01FU1NBR0UiLCJ0b3BQIiwiaW5pdGlhbE1lc3NhZ2VzIiwiZW5hYmxlVm9pY2UiLCJlbmFibGVTY3JlZW5DYXB0dXJlIiwic2NyZWVuQ2FwdHVyZWRCYXNlNjQiLCJzY3JlZW5zaG90VG9Bc2siLCJzY3JlZW5DYXB0dXJlZCIsIm9uUmVzdGFydENoYXQiLCJmb250U2l6ZSIsImJvdE1lc3NhZ2VDbGFzc05hbWUiLCJnaXRodWJJc3N1ZUxpbmsiLCJvblJlZnJlc2hJZGVhcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2FpLWFzc2lzdGFudC1jb21wb25lbnQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VEaXNwYXRjaCwgdXNlU2VsZWN0b3J9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHt0ZXh0Q29sb3JMVCwgdGhlbWV9IGZyb20gJ0BrZXBsZXIuZ2wvc3R5bGVzJztcbmltcG9ydCB7TWVzc2FnZU1vZGVsLCB1c2VBc3Npc3RhbnR9IGZyb20gJ0BvcGVuYXNzaXN0YW50L2NvcmUnO1xuaW1wb3J0IHtBaUFzc2lzdGFudH0gZnJvbSAnQG9wZW5hc3Npc3RhbnQvdWknO1xuaW1wb3J0ICdAb3BlbmFzc2lzdGFudC9lY2hhcnRzL2Rpc3QvaW5kZXguY3NzJztcbmltcG9ydCAnQG9wZW5hc3Npc3RhbnQvdWkvZGlzdC9pbmRleC5jc3MnO1xuaW1wb3J0IHtzZXRTY3JlZW5DYXB0dXJlZCwgc2V0U3RhcnRTY3JlZW5DYXB0dXJlLCB1cGRhdGVBaUFzc2lzdGFudE1lc3NhZ2VzfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7XG4gIEFTU0lTVEFOVF9ERVNDUklQVElPTixcbiAgQVNTSVNUQU5UX05BTUUsXG4gIEFTU0lTVEFOVF9WRVJTSU9OLFxuICBJTlNUUlVDVElPTlMsXG4gIFBST01QVF9JREVBUyxcbiAgV0VMQ09NRV9NRVNTQUdFXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge2dldERhdGFzZXRDb250ZXh0fSBmcm9tICcuLi90b29scy91dGlscyc7XG5pbXBvcnQge3NldHVwTExNVG9vbHN9IGZyb20gJy4uL3Rvb2xzL3Rvb2xzJztcbmltcG9ydCB7U3RhdGV9IGZyb20gJy4vYWktYXNzaXN0YW50LW1hbmFnZXInO1xuXG5jb25zdCBTdHlsZWRBaUFzc2lzdGFudENvbXBvbmVudCA9IHN0eWxlZC5kaXZgXG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZy1ib3R0b206IDRweDtcblxuICAqIHtcbiAgICBmb250LXNpemU6IDExcHg7XG4gIH1cbmA7XG5cbmV4cG9ydCBmdW5jdGlvbiBBaUFzc2lzdGFudENvbXBvbmVudCgpIHtcbiAgY29uc3QgdmlzU3RhdGUgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZSk7XG4gIGNvbnN0IGFpQXNzaXN0YW50ID0gdXNlU2VsZWN0b3IoKHN0YXRlOiBTdGF0ZSkgPT4gc3RhdGUuZGVtby5haUFzc2lzdGFudCk7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICAvLyBkZWZpbmUgTExNIGZ1bmN0aW9uc1xuICBjb25zdCB0b29scyA9IHNldHVwTExNVG9vbHMoe3Zpc1N0YXRlLCBhaUFzc2lzdGFudCwgZGlzcGF0Y2h9KTtcblxuICAvLyBlbmFibGUgdm9pY2UgYW5kIHNjcmVlbiBjYXB0dXJlXG4gIGNvbnN0IGVuYWJsZVZvaWNlQW5kU2NyZWVuQ2FwdHVyZSA9XG4gICAgYWlBc3Npc3RhbnQ/LmNvbmZpZy5wcm92aWRlciA9PT0gJ29wZW5haScgfHwgYWlBc3Npc3RhbnQ/LmNvbmZpZy5wcm92aWRlciA9PT0gJ2dvb2dsZScgfHwgZmFsc2U7XG5cbiAgLy8gZGVmaW5lIGFzc2lzdGFudCBwcm9wc1xuICBjb25zdCBhc3Npc3RhbnRQcm9wcyA9IHtcbiAgICBuYW1lOiBBU1NJU1RBTlRfTkFNRSxcbiAgICBkZXNjcmlwdGlvbjogQVNTSVNUQU5UX0RFU0NSSVBUSU9OLFxuICAgIHZlcnNpb246IEFTU0lTVEFOVF9WRVJTSU9OLFxuICAgIG1vZGVsUHJvdmlkZXI6IGFpQXNzaXN0YW50Py5jb25maWcucHJvdmlkZXIgfHwgJycsXG4gICAgbW9kZWw6IGFpQXNzaXN0YW50Py5jb25maWcubW9kZWwgfHwgJycsXG4gICAgYXBpS2V5OiBhaUFzc2lzdGFudD8uY29uZmlnLmFwaUtleSB8fCAnJyxcbiAgICBiYXNlVXJsOiBhaUFzc2lzdGFudD8uY29uZmlnLmJhc2VVcmwgfHwgJycsXG4gICAgdG9vbHNcbiAgfTtcblxuICBjb25zdCBbZGF0YXNldE1ldGFEYXRhLCBzZXREYXRhc2V0TWV0YURhdGFdID0gdXNlU3RhdGU8c3RyaW5nPignJyk7XG5cbiAgY29uc3QgW2lkZWFzLCBzZXRJZGVhc10gPSB1c2VTdGF0ZTx7dGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZ31bXT4oW10pO1xuXG4gIGNvbnN0IFtyZXN0YXJ0S2V5LCBzZXRSZXN0YXJ0S2V5XSA9IHVzZVN0YXRlPG51bWJlcj4oMCk7XG5cbiAgLy8gZ2V0IGRhdGFzZXQgbWV0YSBkYXRhIGFuZCByZS1pbml0aWFsaXplIGFzc2lzdGFudCB3aGVuIGRhdGFzZXRzIG9yIGxheWVycyBjaGFuZ2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBtZXRhRGF0YSA9IGdldERhdGFzZXRDb250ZXh0KHZpc1N0YXRlPy5kYXRhc2V0cywgdmlzU3RhdGU/LmxheWVycyB8fCBbXSk7XG4gICAgc2V0RGF0YXNldE1ldGFEYXRhKG1ldGFEYXRhKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFt2aXNTdGF0ZT8uZGF0YXNldHMsIHZpc1N0YXRlPy5sYXllcnNdKTtcblxuICAvLyB1c2UgZGF0YXNldCBtZXRhIGRhdGEgaW4gTExNIGluc3RydWN0aW9uc1xuICBjb25zdCBpbnN0cnVjdGlvbnMgPSBgJHtJTlNUUlVDVElPTlN9XFxuXFxuJHtkYXRhc2V0TWV0YURhdGF9YDtcblxuICAvLyBnZW5lcmF0ZSBpZGVhcyBmcm9tIExMTVxuICBjb25zdCB7dGVtcG9yYXJ5UHJvbXB0LCByZXN0YXJ0Q2hhdDogbGlicmFyeVJlc3RhcnRDaGF0fSA9IHVzZUFzc2lzdGFudCh7XG4gICAgLi4uYXNzaXN0YW50UHJvcHMsXG4gICAgaW5zdHJ1Y3Rpb25zXG4gIH0pO1xuXG4gIGNvbnN0IHJlc3RhcnRDaGF0UmVmID0gdXNlUmVmKGxpYnJhcnlSZXN0YXJ0Q2hhdCk7XG4gIHJlc3RhcnRDaGF0UmVmLmN1cnJlbnQgPSBsaWJyYXJ5UmVzdGFydENoYXQ7XG5cbiAgY29uc3QgZ2VuZXJhdGVJZGVhcyA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0ZW1wb3JhcnlQcm9tcHQoe1xuICAgICAgICBwcm9tcHQ6IFBST01QVF9JREVBUyxcbiAgICAgICAgdGVtcGVyYXR1cmU6IDEuMFxuICAgICAgfSk7XG4gICAgICAvLyBmaW5kIFt7fSx7fS4uLl0gaW4gdGhlIHRleHQgYW5kIHBhcnNlIGl0IGFzIGpzb24sIGhhbmRsaW5nIHdoaXRlc3BhY2VcbiAgICAgIGNvbnN0IG1hdGNoID0gcmVzcG9uc2U/Lm1hdGNoKC9cXFtcXHMqXFx7LipcXH1cXHMqXFxdL3MpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKG1hdGNoWzBdKTtcbiAgICAgICAgc2V0SWRlYXMoanNvbik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdlbmVyYXRpbmcgaWRlYXMnLCBlcnJvcik7XG4gICAgfVxuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gZ2V0IGlkZWFzIFVJIGNvbXBvbmVudFxuICAgIGlmIChpZGVhcy5sZW5ndGggPT09IDAgJiYgZGF0YXNldE1ldGFEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIGdlbmVyYXRlSWRlYXMoKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZGF0YXNldE1ldGFEYXRhXSk7XG5cbiAgY29uc3Qgb25SZXN0YXJ0QXNzaXN0YW50ID0gYXN5bmMgKCkgPT4ge1xuICAgIGRpc3BhdGNoKHVwZGF0ZUFpQXNzaXN0YW50TWVzc2FnZXMoW10pKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZXN0YXJ0Q2hhdFJlZi5jdXJyZW50KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVzdGFydGluZyBjaGF0OicsIGUpO1xuICAgIH1cblxuICAgIHNldFJlc3RhcnRLZXkocHJldiA9PiBwcmV2ICsgMSk7XG4gIH07XG5cbiAgY29uc3Qgb25NZXNzYWdlc1VwZGF0ZWQgPSAobWVzc2FnZXM6IE1lc3NhZ2VNb2RlbFtdKSA9PiB7XG4gICAgZGlzcGF0Y2godXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlcyhtZXNzYWdlcykpO1xuICB9O1xuXG4gIGNvbnN0IG9uU2NyZWVuc2hvdENsaWNrID0gKCkgPT4ge1xuICAgIGRpc3BhdGNoKHNldFN0YXJ0U2NyZWVuQ2FwdHVyZSh0cnVlKSk7XG4gIH07XG5cbiAgY29uc3Qgb25SZW1vdmVTY3JlZW5zaG90ID0gKCkgPT4ge1xuICAgIGRpc3BhdGNoKHNldFNjcmVlbkNhcHR1cmVkKCcnKSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkQWlBc3Npc3RhbnRDb21wb25lbnQgY2xhc3NOYW1lPVwiYWktYXNzaXN0YW50LWNvbXBvbmVudFwiPlxuICAgICAgPEFpQXNzaXN0YW50XG4gICAgICAgIGtleT17cmVzdGFydEtleX1cbiAgICAgICAgey4uLmFzc2lzdGFudFByb3BzfVxuICAgICAgICBpbnN0cnVjdGlvbnM9e2luc3RydWN0aW9uc31cbiAgICAgICAgdGhlbWU9e3RoZW1lLnRleHRDb2xvciA9PT0gdGV4dENvbG9yTFQgPyAnbGlnaHQnIDogJ2RhcmsnfVxuICAgICAgICB3ZWxjb21lTWVzc2FnZT17V0VMQ09NRV9NRVNTQUdFfVxuICAgICAgICB0ZW1wZXJhdHVyZT17YWlBc3Npc3RhbnQ/LmNvbmZpZy50ZW1wZXJhdHVyZSB8fCAwfVxuICAgICAgICB0b3BQPXthaUFzc2lzdGFudD8uY29uZmlnLnRvcFAgfHwgMH1cbiAgICAgICAgaW5pdGlhbE1lc3NhZ2VzPXthaUFzc2lzdGFudD8ubWVzc2FnZXN9XG4gICAgICAgIG9uTWVzc2FnZXNVcGRhdGVkPXtvbk1lc3NhZ2VzVXBkYXRlZH1cbiAgICAgICAgZW5hYmxlVm9pY2U9e2VuYWJsZVZvaWNlQW5kU2NyZWVuQ2FwdHVyZX1cbiAgICAgICAgZW5hYmxlU2NyZWVuQ2FwdHVyZT17ZW5hYmxlVm9pY2VBbmRTY3JlZW5DYXB0dXJlfVxuICAgICAgICBvblNjcmVlbnNob3RDbGljaz17b25TY3JlZW5zaG90Q2xpY2t9XG4gICAgICAgIHNjcmVlbkNhcHR1cmVkQmFzZTY0PXthaUFzc2lzdGFudD8uc2NyZWVuc2hvdFRvQXNrLnNjcmVlbkNhcHR1cmVkIHx8ICcnfVxuICAgICAgICBvblJlbW92ZVNjcmVlbnNob3Q9e29uUmVtb3ZlU2NyZWVuc2hvdH1cbiAgICAgICAgb25SZXN0YXJ0Q2hhdD17b25SZXN0YXJ0QXNzaXN0YW50fVxuICAgICAgICBmb250U2l6ZT17J3RleHQtdGlueSd9XG4gICAgICAgIGJvdE1lc3NhZ2VDbGFzc05hbWU9eycnfVxuICAgICAgICBnaXRodWJJc3N1ZUxpbms9eydodHRwczovL2dpdGh1Yi5jb20va2VwbGVyZ2wva2VwbGVyLmdsL2lzc3Vlcyd9XG4gICAgICAgIGlkZWFzPXtpZGVhc31cbiAgICAgICAgb25SZWZyZXNoSWRlYXM9e2dlbmVyYXRlSWRlYXN9XG4gICAgICAvPlxuICAgIDwvU3R5bGVkQWlBc3Npc3RhbnRDb21wb25lbnQ+XG4gICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLEdBQUEsR0FBQU4sT0FBQTtBQUNBQSxPQUFBO0FBQ0FBLE9BQUE7QUFDQSxJQUFBTyxRQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxVQUFBLEdBQUFSLE9BQUE7QUFRQSxJQUFBUyxNQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSxNQUFBLEdBQUFWLE9BQUE7QUFBNkMsSUFBQVcsZUFBQSxFQXJCN0M7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBZCx3QkFBQWMsQ0FBQSxFQUFBRSxD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