kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
294 lines (293 loc) • 51 kB
JavaScript
"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 = _interopRequireWildcard(require("styled-components"));
var _reactIntl = require("react-intl");
var _components = require("@kepler.gl/components");
var _apiKey = _interopRequireDefault(require("../icons/api-key"));
var _core = require("@openassistant/core");
var _models = _interopRequireDefault(require("../config/models.json"));
var _usehooksTs = require("usehooks-ts");
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7; // 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 SectionTitle = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n color: ", ";\n text-transform: capitalize;\n"])), function (props) {
return props.theme.inputFontSize;
}, function (props) {
return props.theme.effectPanelTextSecondary1;
});
var StyledAiAssistantConfig = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 12px;\n font-size: ", ";\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n height: 100%;\n\n .api-key-input {\n box-shadow: ", ";\n width: 100%;\n .api-key-input__icon {\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"])), function (props) {
return props.theme.primaryBtnFontSizeDefault;
}, function (props) {
return props.theme.boxShadow;
}, function (props) {
return props.theme.geocoderInputHeight;
}, function (props) {
return props.theme.subtextColor;
}, function (props) {
return props.theme.geocoderInputHeight;
});
var StyledWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n align-items: center;\n"])));
var StyledItemSelector = (0, _styledComponents["default"])(_components.ItemSelector)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n .item-selector__dropdown {\n padding-left: 10px;\n border-radius: 4px;\n }\n .active {\n border-color: ", ";\n border-radius: 4px 4px 0px 0px !important;\n }\n width: 100%;\n"])), function (props) {
return props.theme.activeColor;
});
var StyleSliderWrapper = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n align-self: flex-start;\n height: 32px;\n display: flex;\n align-items: center;\n .kg-range-slider__input {\n height: 32px;\n text-align: center;\n padding: 3px 6px;\n }\n .kg-slider {\n padding-left: 6px;\n }\n .kg-range-slider {\n padding: 0px !important;\n }\n"])));
var StyledButton = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n align-self: flex-start;\n margin-top: 12px;\n\n button div {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-right: 4px;\n }\n"])));
var StyleErrorMessage = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n background-color: ", ";\n border-radius: 4px;\n padding: 4px 8px;\n color: ", ";\n"])), function (props) {
return props.theme.primaryBtnFontSizeDefault;
}, function (props) {
return props.theme.errorColor;
}, function (props) {
return props.theme.errorTextColor;
});
AiAssistantConfigFactory.deps = [_components.RangeSliderFactory];
function AiAssistantConfigFactory(RangeSlider) {
var AiAssistantConfig = function AiAssistantConfig(_ref) {
var intl = _ref.intl,
aiAssistantConfig = _ref.aiAssistantConfig,
updateAiAssistantConfig = _ref.updateAiAssistantConfig;
var _useLocalStorage = (0, _usehooksTs.useLocalStorage)('ai-assistant-provider', aiAssistantConfig.provider || 'openai'),
_useLocalStorage2 = (0, _slicedToArray2["default"])(_useLocalStorage, 2),
provider = _useLocalStorage2[0],
setProvider = _useLocalStorage2[1];
var _useLocalStorage3 = (0, _usehooksTs.useLocalStorage)('ai-assistant-model', aiAssistantConfig.model || _models["default"][provider][0]),
_useLocalStorage4 = (0, _slicedToArray2["default"])(_useLocalStorage3, 2),
model = _useLocalStorage4[0],
setModel = _useLocalStorage4[1];
var _useLocalStorage5 = (0, _usehooksTs.useLocalStorage)('ai-assistant-api-key', aiAssistantConfig.apiKey || ''),
_useLocalStorage6 = (0, _slicedToArray2["default"])(_useLocalStorage5, 2),
apiKey = _useLocalStorage6[0],
setApiKey = _useLocalStorage6[1];
var _useLocalStorage7 = (0, _usehooksTs.useLocalStorage)('ai-assistant-temperature', aiAssistantConfig.temperature || 0.8),
_useLocalStorage8 = (0, _slicedToArray2["default"])(_useLocalStorage7, 2),
temperature = _useLocalStorage8[0],
setTemperature = _useLocalStorage8[1];
var _useLocalStorage9 = (0, _usehooksTs.useLocalStorage)('ai-assistant-top-p', aiAssistantConfig.topP || 0.8),
_useLocalStorage10 = (0, _slicedToArray2["default"])(_useLocalStorage9, 2),
topP = _useLocalStorage10[0],
setTopP = _useLocalStorage10[1];
var _useLocalStorage11 = (0, _usehooksTs.useLocalStorage)('ai-assistant-base-url', aiAssistantConfig.baseUrl || 'http://localhost:11434'),
_useLocalStorage12 = (0, _slicedToArray2["default"])(_useLocalStorage11, 2),
baseUrl = _useLocalStorage12[0],
setBaseUrl = _useLocalStorage12[1];
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
connectionError = _useState2[0],
setConnectionError = _useState2[1];
var _useState3 = (0, _react.useState)(''),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
errorMessage = _useState4[0],
setErrorMessage = _useState4[1];
var _useState5 = (0, _react.useState)(false),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
isRunning = _useState6[0],
setIsRunning = _useState6[1];
var onAiProviderSelect = function onAiProviderSelect(value) {
if (typeof value === 'string') {
setProvider(value);
setModel(_models["default"][value][0]);
setConnectionError(false);
setErrorMessage('');
}
};
var onLLMModelSelect = function onLLMModelSelect(value) {
if (typeof value === 'string') {
setModel(value);
}
};
var onApiKeyChange = function onApiKeyChange(e) {
setApiKey(e.target.value);
// reset previous key error if any
setConnectionError(false);
setErrorMessage('');
};
var onTemperatureChange = function onTemperatureChange(value) {
setTemperature(value[1]);
};
var onTopPChange = function onTopPChange(value) {
setTopP(value[1]);
};
var onBaseUrlChange = function onBaseUrlChange(e) {
setBaseUrl(e.target.value);
setConnectionError(false);
setErrorMessage('');
};
var onStartChat = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var timeoutPromise, testPromise, result, success, service, _errorMessage;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
setIsRunning(true);
_context.prev = 1;
timeoutPromise = new Promise(function (_, reject) {
setTimeout(function () {
return reject(new Error('Connection timeout after 15 seconds'));
}, 15000);
});
testPromise = (0, _core.testApiKey)({
modelProvider: provider,
modelName: model,
apiKey: apiKey,
baseUrl: baseUrl
});
_context.next = 6;
return Promise.race([testPromise, timeoutPromise]);
case 6:
result = _context.sent;
success = result.success, service = result.service;
_errorMessage = !success ? service === 'ollama' ? 'Connection failed: maybe invalid Ollama Base URL' : 'Connection failed: maybe invalid API Key' : '';
setConnectionError(!success);
setErrorMessage(_errorMessage);
updateAiAssistantConfig({
provider: provider,
model: model,
apiKey: apiKey,
baseUrl: baseUrl,
isReady: success,
temperature: temperature,
topP: topP
});
_context.next = 18;
break;
case 14:
_context.prev = 14;
_context.t0 = _context["catch"](1);
setConnectionError(true);
setErrorMessage(_context.t0 instanceof Error ? _context.t0.message : 'Connection failed');
case 18:
_context.prev = 18;
setIsRunning(false);
return _context.finish(18);
case 21:
case "end":
return _context.stop();
}
}, _callee, null, [[1, 14, 18, 21]]);
}));
return function onStartChat() {
return _ref2.apply(this, arguments);
};
}();
return /*#__PURE__*/_react["default"].createElement(StyledAiAssistantConfig, {
className: "ai-assistant-config__type"
}, /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({
id: 'aiAssistantManager.aiProvider.title',
defaultMessage: 'Select AI Provider'
}))), /*#__PURE__*/_react["default"].createElement(StyledWrapper, null, /*#__PURE__*/_react["default"].createElement(StyledItemSelector, {
selectedItems: provider,
options: Object.keys(_models["default"]),
multiSelect: false,
disabled: false,
placeholder: "aiAssistantManager.aiProvider",
onChange: onAiProviderSelect,
filterOption: "name",
getOptionValue: function getOptionValue(op) {
return op;
},
displayOption: function displayOption(op) {
return op;
},
searchable: false,
showArrow: true
})), /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({
id: 'aiAssistantManager.llmModel.title',
defaultMessage: 'Select LLM Model'
}))), /*#__PURE__*/_react["default"].createElement(StyledWrapper, null, /*#__PURE__*/_react["default"].createElement(StyledItemSelector, {
selectedItems: model,
options: _models["default"][provider],
multiSelect: false,
disabled: false,
placeholder: "aiAssistantManager.llmModel.placeholder",
onChange: onLLMModelSelect,
filterOption: "name",
getOptionValue: function getOptionValue(op) {
return op;
},
displayOption: function displayOption(op) {
return op;
},
searchable: false,
showArrow: true
})), provider !== 'ollama' ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({
id: 'aiAssistantManager.apiKey.title',
defaultMessage: 'Enter API Key'
}))), /*#__PURE__*/_react["default"].createElement("div", {
className: "api-key-input"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "api-key-input__icon"
}, /*#__PURE__*/_react["default"].createElement(_apiKey["default"], {
height: "20px"
})), /*#__PURE__*/_react["default"].createElement(_components.Input, {
type: "text",
onChange: onApiKeyChange,
placeholder: intl.formatMessage({
id: 'aiAssistantManager.apiKey.placeholder',
defaultMessage: 'Enter your API Key'
}),
value: apiKey
}))) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({
id: 'aiAssistantManager.baseUrl.title',
defaultMessage: 'Ollama Base URL'
}))), /*#__PURE__*/_react["default"].createElement("div", {
className: "api-key-input"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "api-key-input__icon"
}, /*#__PURE__*/_react["default"].createElement(_apiKey["default"], {
height: "20px"
})), /*#__PURE__*/_react["default"].createElement(_components.Input, {
type: "text",
onChange: onBaseUrlChange,
placeholder: intl.formatMessage({
id: 'aiAssistantManager.baseUrl.placeholder',
defaultMessage: 'Enter Ollama Base URL'
}),
value: baseUrl
}))), connectionError && /*#__PURE__*/_react["default"].createElement(StyleErrorMessage, {
className: "error-message"
}, errorMessage), /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({
id: 'aiAssistantManager.temperature.title',
defaultMessage: 'Temperature'
}))), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, {
showInput: true,
isRanged: false,
value0: 0,
value1: temperature,
onChange: onTemperatureChange,
range: [0, 2],
step: 0.1
})), /*#__PURE__*/_react["default"].createElement(_components.PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, intl.formatMessage({
id: 'aiAssistantManager.topP.title',
defaultMessage: 'Top P'
}))), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, {
showInput: true,
isRanged: false,
value0: 0,
value1: topP,
onChange: onTopPChange,
range: [0, 1],
step: 0.1
})), /*#__PURE__*/_react["default"].createElement(StyledButton, null, /*#__PURE__*/_react["default"].createElement(_components.Button, {
onClick: onStartChat,
width: '100%'
}, isRunning && /*#__PURE__*/_react["default"].createElement(_components.LoadingSpinner, {
size: 12
}), intl.formatMessage({
id: 'aiAssistantManager.startChat',
defaultMessage: "Let's Chat"
}))));
};
return (0, _styledComponents.withTheme)((0, _reactIntl.injectIntl)(AiAssistantConfig));
}
var _default = exports["default"] = AiAssistantConfigFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9yZWFjdEludGwiLCJfY29tcG9uZW50cyIsIl9hcGlLZXkiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2NvcmUiLCJfbW9kZWxzIiwiX3VzZWhvb2tzVHMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX3RlbXBsYXRlT2JqZWN0NiIsIl90ZW1wbGF0ZU9iamVjdDciLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJTZWN0aW9uVGl0bGUiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJpbnB1dEZvbnRTaXplIiwiZWZmZWN0UGFuZWxUZXh0U2Vjb25kYXJ5MSIsIlN0eWxlZEFpQXNzaXN0YW50Q29uZmlnIiwicHJpbWFyeUJ0bkZvbnRTaXplRGVmYXVsdCIsImJveFNoYWRvdyIsImdlb2NvZGVySW5wdXRIZWlnaHQiLCJzdWJ0ZXh0Q29sb3IiLCJTdHlsZWRXcmFwcGVyIiwiU3R5bGVkSXRlbVNlbGVjdG9yIiwiSXRlbVNlbGVjdG9yIiwiYWN0aXZlQ29sb3IiLCJTdHlsZVNsaWRlcldyYXBwZXIiLCJTdHlsZWRCdXR0b24iLCJTdHlsZUVycm9yTWVzc2FnZSIsImVycm9yQ29sb3IiLCJlcnJvclRleHRDb2xvciIsIkFpQXNzaXN0YW50Q29uZmlnRmFjdG9yeSIsImRlcHMiLCJSYW5nZVNsaWRlckZhY3RvcnkiLCJSYW5nZVNsaWRlciIsIkFpQXNzaXN0YW50Q29uZmlnIiwiX3JlZiIsImludGwiLCJhaUFzc2lzdGFudENvbmZpZyIsInVwZGF0ZUFpQXNzaXN0YW50Q29uZmlnIiwiX3VzZUxvY2FsU3RvcmFnZSIsInVzZUxvY2FsU3RvcmFnZSIsInByb3ZpZGVyIiwiX3VzZUxvY2FsU3RvcmFnZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJzZXRQcm92aWRlciIsIl91c2VMb2NhbFN0b3JhZ2UzIiwibW9kZWwiLCJQUk9WSURFUl9NT0RFTFMiLCJfdXNlTG9jYWxTdG9yYWdlNCIsInNldE1vZGVsIiwiX3VzZUxvY2FsU3RvcmFnZTUiLCJhcGlLZXkiLCJfdXNlTG9jYWxTdG9yYWdlNiIsInNldEFwaUtleSIsIl91c2VMb2NhbFN0b3JhZ2U3IiwidGVtcGVyYXR1cmUiLCJfdXNlTG9jYWxTdG9yYWdlOCIsInNldFRlbXBlcmF0dXJlIiwiX3VzZUxvY2FsU3RvcmFnZTkiLCJ0b3BQIiwiX3VzZUxvY2FsU3RvcmFnZTEwIiwic2V0VG9wUCIsIl91c2VMb2NhbFN0b3JhZ2UxMSIsImJhc2VVcmwiLCJfdXNlTG9jYWxTdG9yYWdlMTIiLCJzZXRCYXNlVXJsIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiY29ubmVjdGlvbkVycm9yIiwic2V0Q29ubmVjdGlvbkVycm9yIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJlcnJvck1lc3NhZ2UiLCJzZXRFcnJvck1lc3NhZ2UiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImlzUnVubmluZyIsInNldElzUnVubmluZyIsIm9uQWlQcm92aWRlclNlbGVjdCIsInZhbHVlIiwib25MTE1Nb2RlbFNlbGVjdCIsIm9uQXBpS2V5Q2hhbmdlIiwidGFyZ2V0Iiwib25UZW1wZXJhdHVyZUNoYW5nZSIsIm9uVG9wUENoYW5nZSIsIm9uQmFzZVVybENoYW5nZSIsIm9uU3RhcnRDaGF0IiwiX3JlZjIiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInRpbWVvdXRQcm9taXNlIiwidGVzdFByb21pc2UiLCJyZXN1bHQiLCJzdWNjZXNzIiwic2VydmljZSIsIl9lcnJvck1lc3NhZ2UiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiUHJvbWlzZSIsIl8iLCJyZWplY3QiLCJzZXRUaW1lb3V0IiwiRXJyb3IiLCJ0ZXN0QXBpS2V5IiwibW9kZWxQcm92aWRlciIsIm1vZGVsTmFtZSIsInJhY2UiLCJzZW50IiwiaXNSZWFkeSIsInQwIiwibWVzc2FnZSIsImZpbmlzaCIsInN0b3AiLCJhcHBseSIsImFyZ3VtZW50cyIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJQYW5lbExhYmVsV3JhcHBlciIsImZvcm1hdE1lc3NhZ2UiLCJpZCIsImRlZmF1bHRNZXNzYWdlIiwic2VsZWN0ZWRJdGVtcyIsIm9wdGlvbnMiLCJrZXlzIiwibXVsdGlTZWxlY3QiLCJkaXNhYmxlZCIsInBsYWNlaG9sZGVyIiwib25DaGFuZ2UiLCJmaWx0ZXJPcHRpb24iLCJnZXRPcHRpb25WYWx1ZSIsIm9wIiwiZGlzcGxheU9wdGlvbiIsInNlYXJjaGFibGUiLCJzaG93QXJyb3ciLCJGcmFnbWVudCIsImhlaWdodCIsIklucHV0IiwidHlwZSIsInNob3dJbnB1dCIsImlzUmFuZ2VkIiwidmFsdWUwIiwidmFsdWUxIiwicmFuZ2UiLCJzdGVwIiwiQnV0dG9uIiwib25DbGljayIsIndpZHRoIiwiTG9hZGluZ1NwaW5uZXIiLCJzaXplIiwid2l0aFRoZW1lIiwiaW5qZWN0SW50bCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2FpLWFzc2lzdGFudC1jb25maWcudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkLCB7d2l0aFRoZW1lfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge2luamVjdEludGwsIFdyYXBwZWRDb21wb25lbnRQcm9wc30gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge1xuICBJbnB1dCxcbiAgUGFuZWxMYWJlbFdyYXBwZXIsXG4gIEl0ZW1TZWxlY3RvcixcbiAgUmFuZ2VTbGlkZXJGYWN0b3J5LFxuICBCdXR0b24sXG4gIExvYWRpbmdTcGlubmVyXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29tcG9uZW50cyc7XG5pbXBvcnQge0FpQXNzaXN0YW50Q29uZmlnfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgQXBpS2V5IGZyb20gJy4uL2ljb25zL2FwaS1rZXknO1xuaW1wb3J0IHt0ZXN0QXBpS2V5fSBmcm9tICdAb3BlbmFzc2lzdGFudC9jb3JlJztcbmltcG9ydCBQUk9WSURFUl9NT0RFTFMgZnJvbSAnLi4vY29uZmlnL21vZGVscy5qc29uJztcbmltcG9ydCB7dXNlTG9jYWxTdG9yYWdlfSBmcm9tICd1c2Vob29rcy10cyc7XG5cbnR5cGUgVGhlbWVQcm9wcyA9IHt0aGVtZTogYW55fTtcblxuZXhwb3J0IHR5cGUgQWlBc3Npc3RhbnRDb25maWdQcm9wcyA9IHtcbiAgYWlBc3Npc3RhbnRDb25maWc6IEFpQXNzaXN0YW50Q29uZmlnO1xuICB1cGRhdGVBaUFzc2lzdGFudENvbmZpZzogKGFpQXNzaXN0YW50Q29uZmlnOiBBaUFzc2lzdGFudENvbmZpZykgPT4gdm9pZDtcbn07XG5cbmNvbnN0IFNlY3Rpb25UaXRsZSA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5pbnB1dEZvbnRTaXplfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZWZmZWN0UGFuZWxUZXh0U2Vjb25kYXJ5MX07XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuYDtcblxuY29uc3QgU3R5bGVkQWlBc3Npc3RhbnRDb25maWcgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiAxMnB4O1xuICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucHJpbWFyeUJ0bkZvbnRTaXplRGVmYXVsdH07XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTJweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcblxuICAuYXBpLWtleS1pbnB1dCB7XG4gICAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ib3hTaGFkb3d9O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC5hcGkta2V5LWlucHV0X19pY29uIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5nZW9jb2RlcklucHV0SGVpZ2h0fXB4O1xuICAgICAgd2lkdGg6IDMwcHg7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICAgIH1cblxuICAgIGlucHV0IHtcbiAgICAgIHBhZGRpbmc6IDRweCAzNnB4O1xuICAgICAgaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmdlb2NvZGVySW5wdXRIZWlnaHR9cHg7XG4gICAgICBjYXJldC1jb2xvcjogdW5zZXQ7XG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuYDtcblxuY29uc3QgU3R5bGVkSXRlbVNlbGVjdG9yID0gc3R5bGVkKEl0ZW1TZWxlY3RvcilgXG4gIC5pdGVtLXNlbGVjdG9yX19kcm9wZG93biB7XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgfVxuICAuYWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYWN0aXZlQ29sb3J9O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCA0cHggMHB4IDBweCAhaW1wb3J0YW50O1xuICB9XG4gIHdpZHRoOiAxMDAlO1xuYDtcblxuY29uc3QgU3R5bGVTbGlkZXJXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gIGhlaWdodDogMzJweDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLmtnLXJhbmdlLXNsaWRlcl9faW5wdXQge1xuICAgIGhlaWdodDogMzJweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZzogM3B4IDZweDtcbiAgfVxuICAua2ctc2xpZGVyIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgfVxuICAua2ctcmFuZ2Utc2xpZGVyIHtcbiAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gIG1hcmdpbi10b3A6IDEycHg7XG5cbiAgYnV0dG9uIGRpdiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogNHB4O1xuICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZUVycm9yTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wcmltYXJ5QnRuRm9udFNpemVEZWZhdWx0fTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lcnJvckNvbG9yfTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBwYWRkaW5nOiA0cHggOHB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lcnJvclRleHRDb2xvcn07XG5gO1xuXG5BaUFzc2lzdGFudENvbmZpZ0ZhY3RvcnkuZGVwcyA9IFtSYW5nZVNsaWRlckZhY3RvcnldO1xuXG5mdW5jdGlvbiBBaUFzc2lzdGFudENvbmZpZ0ZhY3RvcnkoUmFuZ2VTbGlkZXI6IFJldHVyblR5cGU8dHlwZW9mIFJhbmdlU2xpZGVyRmFjdG9yeT4pIHtcbiAgY29uc3QgQWlBc3Npc3RhbnRDb25maWc6IFJlYWN0LkZDPFxuICAgIEFpQXNzaXN0YW50Q29uZmlnUHJvcHMgJiBXcmFwcGVkQ29tcG9uZW50UHJvcHMgJiBUaGVtZVByb3BzXG4gID4gPSAoe2ludGwsIGFpQXNzaXN0YW50Q29uZmlnLCB1cGRhdGVBaUFzc2lzdGFudENvbmZpZ30pID0+IHtcbiAgICBjb25zdCBbcHJvdmlkZXIsIHNldFByb3ZpZGVyXSA9IHVzZUxvY2FsU3RvcmFnZShcbiAgICAgICdhaS1hc3Npc3RhbnQtcHJvdmlkZXInLFxuICAgICAgYWlBc3Npc3RhbnRDb25maWcucHJvdmlkZXIgfHwgJ29wZW5haSdcbiAgICApO1xuICAgIGNvbnN0IFttb2RlbCwgc2V0TW9kZWxdID0gdXNlTG9jYWxTdG9yYWdlKFxuICAgICAgJ2FpLWFzc2lzdGFudC1tb2RlbCcsXG4gICAgICBhaUFzc2lzdGFudENvbmZpZy5tb2RlbCB8fCBQUk9WSURFUl9NT0RFTFNbcHJvdmlkZXJdWzBdXG4gICAgKTtcbiAgICBjb25zdCBbYXBpS2V5LCBzZXRBcGlLZXldID0gdXNlTG9jYWxTdG9yYWdlKFxuICAgICAgJ2FpLWFzc2lzdGFudC1hcGkta2V5JyxcbiAgICAgIGFpQXNzaXN0YW50Q29uZmlnLmFwaUtleSB8fCAnJ1xuICAgICk7XG4gICAgY29uc3QgW3RlbXBlcmF0dXJlLCBzZXRUZW1wZXJhdHVyZV0gPSB1c2VMb2NhbFN0b3JhZ2UoXG4gICAgICAnYWktYXNzaXN0YW50LXRlbXBlcmF0dXJlJyxcbiAgICAgIGFpQXNzaXN0YW50Q29uZmlnLnRlbXBlcmF0dXJlIHx8IDAuOFxuICAgICk7XG4gICAgY29uc3QgW3RvcFAsIHNldFRvcFBdID0gdXNlTG9jYWxTdG9yYWdlKCdhaS1hc3Npc3RhbnQtdG9wLXAnLCBhaUFzc2lzdGFudENvbmZpZy50b3BQIHx8IDAuOCk7XG4gICAgY29uc3QgW2Jhc2VVcmwsIHNldEJhc2VVcmxdID0gdXNlTG9jYWxTdG9yYWdlKFxuICAgICAgJ2FpLWFzc2lzdGFudC1iYXNlLXVybCcsXG4gICAgICBhaUFzc2lzdGFudENvbmZpZy5iYXNlVXJsIHx8ICdodHRwOi8vbG9jYWxob3N0OjExNDM0J1xuICAgICk7XG4gICAgY29uc3QgW2Nvbm5lY3Rpb25FcnJvciwgc2V0Q29ubmVjdGlvbkVycm9yXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbZXJyb3JNZXNzYWdlLCBzZXRFcnJvck1lc3NhZ2VdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFtpc1J1bm5pbmcsIHNldElzUnVubmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgICBjb25zdCBvbkFpUHJvdmlkZXJTZWxlY3QgPSAodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBvYmplY3QgfCBudWxsKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzZXRQcm92aWRlcih2YWx1ZSk7XG4gICAgICAgIHNldE1vZGVsKFBST1ZJREVSX01PREVMU1t2YWx1ZV1bMF0pO1xuICAgICAgICBzZXRDb25uZWN0aW9uRXJyb3IoZmFsc2UpO1xuICAgICAgICBzZXRFcnJvck1lc3NhZ2UoJycpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbkxMTU1vZGVsU2VsZWN0ID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgb2JqZWN0IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2V0TW9kZWwodmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbkFwaUtleUNoYW5nZSA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgc2V0QXBpS2V5KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgIC8vIHJlc2V0IHByZXZpb3VzIGtleSBlcnJvciBpZiBhbnlcbiAgICAgIHNldENvbm5lY3Rpb25FcnJvcihmYWxzZSk7XG4gICAgICBzZXRFcnJvck1lc3NhZ2UoJycpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblRlbXBlcmF0dXJlQ2hhbmdlID0gKHZhbHVlOiBudW1iZXJbXSkgPT4ge1xuICAgICAgc2V0VGVtcGVyYXR1cmUodmFsdWVbMV0pO1xuICAgIH07XG5cbiAgICBjb25zdCBvblRvcFBDaGFuZ2UgPSAodmFsdWU6IG51bWJlcltdKSA9PiB7XG4gICAgICBzZXRUb3BQKHZhbHVlWzFdKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25CYXNlVXJsQ2hhbmdlID0gKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBzZXRCYXNlVXJsKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgIHNldENvbm5lY3Rpb25FcnJvcihmYWxzZSk7XG4gICAgICBzZXRFcnJvck1lc3NhZ2UoJycpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblN0YXJ0Q2hhdCA9IGFzeW5jICgpID0+IHtcbiAgICAgIHNldElzUnVubmluZyh0cnVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignQ29ubmVjdGlvbiB0aW1lb3V0IGFmdGVyIDE1IHNlY29uZHMnKSksIDE1MDAwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGVzdFByb21pc2UgPSB0ZXN0QXBpS2V5KHtcbiAgICAgICAgICBtb2RlbFByb3ZpZGVyOiBwcm92aWRlcixcbiAgICAgICAgICBtb2RlbE5hbWU6IG1vZGVsLFxuICAgICAgICAgIGFwaUtleTogYXBpS2V5LFxuICAgICAgICAgIGJhc2VVcmw6IGJhc2VVcmxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IFByb21pc2UucmFjZShbdGVzdFByb21pc2UsIHRpbWVvdXRQcm9taXNlXSkpIGFzIHtcbiAgICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICAgIHNlcnZpY2U6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qge3N1Y2Nlc3MsIHNlcnZpY2V9ID0gcmVzdWx0O1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAhc3VjY2Vzc1xuICAgICAgICAgID8gc2VydmljZSA9PT0gJ29sbGFtYSdcbiAgICAgICAgICAgID8gJ0Nvbm5lY3Rpb24gZmFpbGVkOiBtYXliZSBpbnZhbGlkIE9sbGFtYSBCYXNlIFVSTCdcbiAgICAgICAgICAgIDogJ0Nvbm5lY3Rpb24gZmFpbGVkOiBtYXliZSBpbnZhbGlkIEFQSSBLZXknXG4gICAgICAgICAgOiAnJztcbiAgICAgICAgc2V0Q29ubmVjdGlvbkVycm9yKCFzdWNjZXNzKTtcbiAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHVwZGF0ZUFpQXNzaXN0YW50Q29uZmlnKHtcbiAgICAgICAgICBwcm92aWRlcjogcHJvdmlkZXIsXG4gICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgIGFwaUtleTogYXBpS2V5LFxuICAgICAgICAgIGJhc2VVcmw6IGJhc2VVcmwsXG4gICAgICAgICAgaXNSZWFkeTogc3VjY2VzcyxcbiAgICAgICAgICB0ZW1wZXJhdHVyZTogdGVtcGVyYXR1cmUsXG4gICAgICAgICAgdG9wUDogdG9wUFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNldENvbm5lY3Rpb25FcnJvcih0cnVlKTtcbiAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0Nvbm5lY3Rpb24gZmFpbGVkJyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1J1bm5pbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZEFpQXNzaXN0YW50Q29uZmlnIGNsYXNzTmFtZT1cImFpLWFzc2lzdGFudC1jb25maWdfX3R5cGVcIj5cbiAgICAgICAgPFBhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgIDxTZWN0aW9uVGl0bGU+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIuYWlQcm92aWRlci50aXRsZScsXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU2VsZWN0IEFJIFByb3ZpZGVyJ1xuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9TZWN0aW9uVGl0bGU+XG4gICAgICAgIDwvUGFuZWxMYWJlbFdyYXBwZXI+XG4gICAgICAgIDxTdHlsZWRXcmFwcGVyPlxuICAgICAgICAgIDxTdHlsZWRJdGVtU2VsZWN0b3JcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXM9e3Byb3ZpZGVyfVxuICAgICAgICAgICAgb3B0aW9ucz17T2JqZWN0LmtleXMoUFJPVklERVJfTU9ERUxTKX1cbiAgICAgICAgICAgIG11bHRpU2VsZWN0PXtmYWxzZX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtmYWxzZX1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiYWlBc3Npc3RhbnRNYW5hZ2VyLmFpUHJvdmlkZXJcIlxuICAgICAgICAgICAgb25DaGFuZ2U9e29uQWlQcm92aWRlclNlbGVjdH1cbiAgICAgICAgICAgIGZpbHRlck9wdGlvbj1cIm5hbWVcIlxuICAgICAgICAgICAgZ2V0T3B0aW9uVmFsdWU9e29wID0+IG9wfVxuICAgICAgICAgICAgZGlzcGxheU9wdGlvbj17b3AgPT4gb3B9XG4gICAgICAgICAgICBzZWFyY2hhYmxlPXtmYWxzZX1cbiAgICAgICAgICAgIHNob3dBcnJvdz17dHJ1ZX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1N0eWxlZFdyYXBwZXI+XG4gICAgICAgIDxQYW5lbExhYmVsV3JhcHBlcj5cbiAgICAgICAgICA8U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGlkOiAnYWlBc3Npc3RhbnRNYW5hZ2VyLmxsbU1vZGVsLnRpdGxlJyxcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdTZWxlY3QgTExNIE1vZGVsJ1xuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9TZWN0aW9uVGl0bGU+XG4gICAgICAgIDwvUGFuZWxMYWJlbFdyYXBwZXI+XG4gICAgICAgIDxTdHlsZWRXcmFwcGVyPlxuICAgICAgICAgIDxTdHlsZWRJdGVtU2VsZWN0b3JcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXM9e21vZGVsfVxuICAgICAgICAgICAgb3B0aW9ucz17UFJPVklERVJfTU9ERUxTW3Byb3ZpZGVyXX1cbiAgICAgICAgICAgIG11bHRpU2VsZWN0PXtmYWxzZX1cbiAgICAgICAgICAgIGRpc2FibGVkPXtmYWxzZX1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiYWlBc3Npc3RhbnRNYW5hZ2VyLmxsbU1vZGVsLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkxMTU1vZGVsU2VsZWN0fVxuICAgICAgICAgICAgZmlsdGVyT3B0aW9uPVwibmFtZVwiXG4gICAgICAgICAgICBnZXRPcHRpb25WYWx1ZT17b3AgPT4gb3B9XG4gICAgICAgICAgICBkaXNwbGF5T3B0aW9uPXtvcCA9PiBvcH1cbiAgICAgICAgICAgIHNlYXJjaGFibGU9e2ZhbHNlfVxuICAgICAgICAgICAgc2hvd0Fycm93PXt0cnVlfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU3R5bGVkV3JhcHBlcj5cbiAgICAgICAge3Byb3ZpZGVyICE9PSAnb2xsYW1hJyA/IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFBhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgICAgICA8U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIuYXBpS2V5LnRpdGxlJyxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRW50ZXIgQVBJIEtleSdcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9TZWN0aW9uVGl0bGU+XG4gICAgICAgICAgICA8L1BhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcGkta2V5LWlucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXBpLWtleS1pbnB1dF9faWNvblwiPlxuICAgICAgICAgICAgICAgIDxBcGlLZXkgaGVpZ2h0PVwiMjBweFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQXBpS2V5Q2hhbmdlfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtpbnRsLmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIuYXBpS2V5LnBsYWNlaG9sZGVyJyxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRW50ZXIgeW91ciBBUEkgS2V5J1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIHZhbHVlPXthcGlLZXl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFBhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgICAgICA8U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIuYmFzZVVybC50aXRsZScsXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ09sbGFtYSBCYXNlIFVSTCdcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9TZWN0aW9uVGl0bGU+XG4gICAgICAgICAgICA8L1BhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhcGkta2V5LWlucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYXBpLWtleS1pbnB1dF9faWNvblwiPlxuICAgICAgICAgICAgICAgIDxBcGlLZXkgaGVpZ2h0PVwiMjBweFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQmFzZVVybENoYW5nZX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgIGlkOiAnYWlBc3Npc3RhbnRNYW5hZ2VyLmJhc2VVcmwucGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdFbnRlciBPbGxhbWEgQmFzZSBVUkwnXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgdmFsdWU9e2Jhc2VVcmx9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgICAge2Nvbm5lY3Rpb25FcnJvciAmJiAoXG4gICAgICAgICAgPFN0eWxlRXJyb3JNZXNzYWdlIGNsYXNzTmFtZT1cImVycm9yLW1lc3NhZ2VcIj57ZXJyb3JNZXNzYWdlfTwvU3R5bGVFcnJvck1lc3NhZ2U+XG4gICAgICAgICl9XG4gICAgICAgIDxQYW5lbExhYmVsV3JhcHBlcj5cbiAgICAgICAgICA8U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGlkOiAnYWlBc3Npc3RhbnRNYW5hZ2VyLnRlbXBlcmF0dXJlLnRpdGxlJyxcbiAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUZW1wZXJhdHVyZSdcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvU2VjdGlvblRpdGxlPlxuICAgICAgICA8L1BhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICA8U3R5bGVTbGlkZXJXcmFwcGVyPlxuICAgICAgICAgIDxSYW5nZVNsaWRlclxuICAgICAgICAgICAgc2hvd0lucHV0PXt0cnVlfVxuICAgICAgICAgICAgaXNSYW5nZWQ9e2ZhbHNlfVxuICAgICAgICAgICAgdmFsdWUwPXswfVxuICAgICAgICAgICAgdmFsdWUxPXt0ZW1wZXJhdHVyZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvblRlbXBlcmF0dXJlQ2hhbmdlfVxuICAgICAgICAgICAgcmFuZ2U9e1swLCAyXX1cbiAgICAgICAgICAgIHN0ZXA9ezAuMX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1N0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgPFBhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICAgIDxTZWN0aW9uVGl0bGU+XG4gICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgaWQ6ICdhaUFzc2lzdGFudE1hbmFnZXIudG9wUC50aXRsZScsXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVG9wIFAnXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1NlY3Rpb25UaXRsZT5cbiAgICAgICAgPC9QYW5lbExhYmVsV3JhcHBlcj5cbiAgICAgICAgPFN0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICA8UmFuZ2VTbGlkZXJcbiAgICAgICAgICAgIHNob3dJbnB1dD17dHJ1ZX1cbiAgICAgICAgICAgIGlzUmFuZ2VkPXtmYWxzZX1cbiAgICAgICAgICAgIHZhbHVlMD17MH1cbiAgICAgICAgICAgIHZhbHVlMT17dG9wUH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvblRvcFBDaGFuZ2V9XG4gICAgICAgICAgICByYW5nZT17WzAsIDFdfVxuICAgICAgICAgICAgc3RlcD17MC4xfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU3R5bGVTbGlkZXJXcmFwcGVyPlxuICAgICAgICA8U3R5bGVkQnV0dG9uPlxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17b25TdGFydENoYXR9IHdpZHRoPXsnMTAwJSd9PlxuICAgICAgICAgICAge2lzUnVubmluZyAmJiA8TG9hZGluZ1NwaW5uZXIgc2l6ZT17MTJ9IC8+fVxuICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGlkOiAnYWlBc3Npc3RhbnRNYW5hZ2VyLnN0YXJ0Q2hhdCcsXG4gICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiBcIkxldCdzIENoYXRcIlxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvU3R5bGVkQnV0dG9uPlxuICAgICAgPC9TdHlsZWRBaUFzc2lzdGFudENvbmZpZz5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiB3aXRoVGhlbWUoaW5qZWN0SW50bChBaUFzc2lzdGFudENvbmZpZykpIGFzIFJlYWN0LkZDPEFpQXNzaXN0YW50Q29uZmlnUHJvcHM+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBBaUFzc2lzdGFudENvbmZpZ0ZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxXQUFBLEdBQUFILE9BQUE7QUFTQSxJQUFBSSxPQUFBLEdBQUFDLHNCQUFBLENBQUFMLE9BQUE7QUFDQSxJQUFBTSxLQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxPQUFBLEdBQUFGLHNCQUFBLENBQUFMLE9BQUE7QUFDQSxJQUFBUSxXQUFBLEdBQUFSLE9BQUE7QUFBNEMsSUFBQVMsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQWxCNUM7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBbEIsd0JBQUFrQixDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEs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